IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaFX Discussion :

Parcourir tous les JTextFields de ma fenêtre pour obtenir sa valeur


Sujet :

JavaFX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Par défaut Parcourir tous les JTextFields de ma fenêtre pour obtenir sa valeur
    Bonjour, je voudrais obtenir tous les JTextFields de ma fênetre dans un projet FXML.

    Avec Swing je faisais quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (Component c: allTextFields)
    {
      if (c instanceOf JTextField)
        {
          JTextField textfield = (JTextField) c;
          //Ici... getText() on textfield
        }
    }
    Mais dans JavaFX je ne sais pas comment faire.

    Merci d'avance si quelqu'un peut m'éclairer.

  2. #2
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Tu peux utiliser les methodes lookup() et lookupAll() de la classe Node avec soit un des style class CSS (pour retourner un ensemble de noeuds) soit une ID pour chercher un noeud particulier.

    Ici j'ai mis l'UI dans un fichier FXML pour eviter de noyer le code avec des trucs inutiles mais ca marche bien sur egalement avec une UI construite par le code.

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
     
    <?import java.lang.*?>
    <?import java.util.*?>
    <?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
     
    <AnchorPane id="AnchorPane" style="-fx-padding: 0 12 12 0;" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
       <children>
          <TextField id="t1" fx:id="t1" layoutX="14.0" layoutY="14.0" />
          <TextField id="t2" fx:id="t2" layoutX="14.0" layoutY="50.0" />
          <TextField id="t3" fx:id="t3" layoutX="14.0" layoutY="88.0" />
          <TextField id="t4" fx:id="t4" layoutX="14.0" layoutY="124.0" />
          <AnchorPane layoutX="185.0" layoutY="13.0">
             <children>
                <TextField id="t5" fx:id="t5" />
                <TextField id="t6" fx:id="t6" layoutY="35.0" />
                <TextField id="t7" fx:id="t7" layoutY="71.0" />
                <TextField id="t8" fx:id="t8" layoutY="116.0" />
             </children>
          </AnchorPane>
       </children>
    </AnchorPane>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) throws IOException {
            final URL fxmlURL = getClass().getResource("Test.fxml");
            final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
            final Node control = (Node) fxmlLoader.load();
            final Button button = new Button("Search...");
            button.setOnAction((final ActionEvent actionEvent) -> {
                final Set<Node> nodes = control.lookupAll(".text-field");
                nodes.forEach((final Node node) -> {
                    System.out.printf("%s of type %s, uses styles [%s]", node.getId(), node.getClass().getName(), node.getStyleClass()).println();
                });
            });
            final ToolBar toolBar = new ToolBar();
            toolBar.getItems().add(button);
            final BorderPane root = new BorderPane();
            root.setTop(toolBar);
            root.setCenter(control);
            final Scene scene = new Scene(root);
            primaryStage.setTitle("Test_Lookup");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
     
    }
    Dans mon cas, la sortie est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    t1 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t2 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t3 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t4 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t5 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t6 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t7 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    t8 of type javafx.scene.control.TextField, uses styles [text-input text-field]
    Ici, il les a tous trouve meme ceux inclus dans un sous-containeur.

    Donc, on recapitule, pour lookup() :

    • lookup(".value") -> va chercher le 1er controle qui a le style classe "value".
    • lookup("#value") -> va chercher le 1er controle qui a l'id "value".


    Idem pour lookupAll() sauf que ca les retourne tous.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Par défaut
    Bonjour,

    Merci pour la réponse.

    Avec ton code je peux en effet parcourir tous les TextFields de ma fenêtre, par contre je ne peux pas obtenir ses valeurs courants.

    Puisqu'il s'agit de pas mal de TextFields, je voudrais les parcourir en obtenant ces Noms et les valeurs qu'il y a dans chacun, pour les introduire dans un Map, en faisant à la main il s'agit de quelque chose comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Map<String,String> map = new HashMap<>();
            map.put("nomTxt1", txtUn.getText());
            map.put("nomTxt2", txtDeux.getText());
            map.put("nomTxt3", txtTrois.getText());
     
    // autres TextFields...

  4. #4
    Membre très actif
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 548
    Par défaut
    Mais rien ne t'empêche de faire du casting depuis Node vers TextFieald comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nodes.forEach((final Node node) -> {              
    TextField textField=(TextField)node;
                });
    Mais vu que tu veux céer une map avec les données il y a un manière plus propre de Java 8. En supposant que tu vas utiliser l'id du TextField comme clé de la map tu peux faire comme ça:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    final Map<String,String> map = control.lookupAll(".text-field") 
                                            .stream()
                                            .map((Node node)->(TextField)node)
                                            .collect(Collectors.toMap(TextField::getId,TextField::getText));

    Et si tu veux utilise ton propre clé personalisé, il faut juste savoir que tu ne peux pas utiliser un int que tu vas faire i++ car toute variable utilisé dans l'expression lamda est final, à moins que tu crée une variable membre de ta classe le mieux que ça soit static, mais là tu peux avoir des valeur érronés dans certains cas d'accès concurent.
    Donc la bonne pratique est la suivante:
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    final AtomicInteger i=new AtomicInteger(0); 
    Map<String,String> map2 = control.lookupAll(".text-field")
                                 .stream()
                                 .map((Node node)->(TextField)node)
                                 .collect(Collectors.toMap(
                                                textF->String.format("nomTxt%d",i.incrementAndGet()),
                                                TextField::getText)
                                                    );

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2013
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2013
    Messages : 49
    Par défaut
    Bonjour la.lune,

    Merci pour la réponse.

    Je viens de tester le code, en entrant les valeurs "a", "b" et "c" dans trois TextFields, il obtient sans soucis les Id (getId), mais pas la valeur du TextField (getText).

    Lorsque j'imprime mon map, le résultat pour ton premier code est:

    {txtUn=, txtDeux=, txtTrois=}
    Et pour le deuxième:

    {nomTxt3=, nomTxt2=, nomTxt1=}

  6. #6
    Membre très actif
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 548
    Par défaut
    Ça doit marcher, je ne sais pas comment tu gère ton programme, le mieux c'est de nous faire voir ton code, j'ai testé mon code en modifiant juste en partie le corps de l’événement du bouton serarch dans le code fourni par bouye, et ça marche très bien, assure toi d'avoir saisi quelque chose et tu affiche tes données existants mais c'est simple, essaye de tester ce programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    import java.net.URL;import java.util.Map;
    import java.util.stream.Collectors;
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Node;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.TextField;
    import javafx.scene.control.ToolBar;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
     
     
    /**
     *
     * @author la-lune
     */
    public class Main extends Application {
     
        @Override
        public void start(Stage primaryStage) throws Exception {
          final URL fxmlURL = getClass().getResource("FXML.fxml");
            final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
            final Node control = (Node) fxmlLoader.load();
     
            final Button button = new Button("Search...");
            button.setOnAction((final ActionEvent actionEvent) -> {
                final Map<String,String> map = control.lookupAll(".text-field")
                                                      .stream()
                                                      .map((Node node)->(TextField)node)
                                                      .collect(Collectors.toMap(TextField::getId,TextField::getText));
                map.forEach((id,text)->{
                System.out.printf("Cle = %s Valeur = %s \n",id,text);
                });
     
            });
     
            final ToolBar toolBar = new ToolBar();
            toolBar.getItems().add(button);
            final BorderPane root = new BorderPane();
            root.setTop(toolBar);
            root.setCenter(control);
            final Scene scene = new Scene(root);
            primaryStage.setTitle("Test_Lookup");
            primaryStage.setScene(scene);
            primaryStage.show();
     
        }
     
     
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
     
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/09/2012, 15h56
  2. [OL-2007] Simple boucle pour parcourir tous les messages
    Par zoliv75 dans le forum Outlook
    Réponses: 2
    Dernier message: 16/12/2009, 21h46
  3. Réponses: 1
    Dernier message: 01/12/2008, 18h03
  4. [VBA]Boucle pour parcourir tous les enregistrements
    Par Paul Gasser dans le forum VBA Access
    Réponses: 44
    Dernier message: 28/03/2007, 10h22
  5. Réponses: 7
    Dernier message: 08/01/2005, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo