0
votes

Comment puis-je créer une boucle for qui affichera 8 TextFields dans javaFx

C'est actuellement le code que j'ai jusqu'à présent ...

int nums = 8;
for (int j = 0; j < nums; j++) {
   TextField test = new TextField();
   test.setAlignment(Pos.CENTER);
}
this.getChildren().add(test);

J'ai essayé de faire quelque chose comme TextField 'test' + j = new TextField (); de sorte qu'il créerait test1, test2, test3 ect. mais cela a donné des erreurs de syntaxe. Je ne sais pas vraiment comment je procéderais autrement.


0 commentaires

3 Réponses :


3
votes

Vous devez déplacer this.getChildren (). add (test); à l'intérieur du for-loop:

int nums = 8;
for (int j = 0; j < nums; j++) {
   TextField test = new TextField();
   test.setAlignment(Pos.CENTER);
   this.getChildren().add(test);
}


3 commentaires

Merci @ysakhno Le problème est qu'un seul champ de texte s'affiche alors que j'aimerais en afficher 8


Je crois qu'il y a il y en a 8, ils sont juste les uns sous les autres, et vous ne voyez que celui du haut.


@TSoVz vérifie ma réponse pour trouver la solution à votre problème d'empilement. Utilisez-vous un StackPane, à quoi ajoutez-vous les TextFields?



2
votes

Ajoutez-les à quelque chose qui leur permet de s'empiler verticalement. Assurez-vous également que votre appel pour les ajouter se trouve dans la boucle où test est toujours dans la portée.

VBox box = new VBox(5);
int nums = 8;
for (int j = 0; j < nums; j++) {
   TextField test = new TextField();
   test.setAlignment(Pos.CENTER);
   box.getChildren().add(test);
}
this.getChildren().add(box);


3 commentaires

Merci, cela a résolu le problème. Maintenant, je suppose que mon seul problème serait que plus tard dans mon programme, je voudrais obtenir la valeur de chaque TextField séparé. S'ils sont tous étiquetés, testez comment pourrais-je les différencier.


Dans la boucle, vous pouvez ajouter les TextFields à une carte ou une liste, puis les référencer plus tard. N'hésitez pas à poser une question distincte pour cela, mais veuillez marquer ma réponse comme réponse acceptée si vous pensez qu'elle répond à votre question initiale. Merci!


Créez vos gestionnaires d'événements dans la boucle.



0
votes

La réponse de @Dustin R est excellente. J'ajoute simplement plus. Comme comment faire pour tout événement sur chaque TextField créé.

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class TestingGroundsTwo extends Application
{
    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        VBox root = new VBox();

        for (int i = 0; i < 8; i++) {
            TextField tempTextField = new TextField();//Create the TextField.
            final int t = i;
            tempTextField.setPromptText("I am TextField " + t);//Set prompt text to easily identify TextField
            //Create key handlding event on the TextField
            tempTextField.setOnKeyReleased((event) -> {
                System.out.println("You typed " + event.getCode() + " in TextField " + t + ". My text value is " + tempTextField.getText());
            });
            root.getChildren().add(tempTextField);//Add the TextField to a parent node. In this case VBox.
        }

        Platform.runLater(() -> root.requestFocus());
        stage.setTitle("Hello World!");
        Scene scene = new Scene(root, 750, 600);
        scene.setFill(Color.GHOSTWHITE);
        stage.setScene(scene);
        stage.show();
    }
}


0 commentaires