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

  1. #1
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    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 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    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
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    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 chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    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 : 545
    Points : 2 084
    Points
    2 084
    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
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    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 chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    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 : 545
    Points : 2 084
    Points
    2 084
    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);
        }
     
    }

  7. #7
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    Par défaut
    Merci encore. Je ne trouve toujours pas oú est le problème…

    Voici mon code de test:

    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
     
     
    package fxmltableview;
     
    import java.io.IOException;
    import java.net.URL;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.ResourceBundle;
    import java.util.Set;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import java.util.stream.Collectors;
    import javafx.beans.binding.Bindings;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Node;
    import javafx.scene.control.ContextMenu;
    import javafx.scene.control.Label;
    import javafx.scene.control.MenuItem;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableRow;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.MouseEvent;
    import javafx.scene.paint.Color;
    import javafx.util.Callback;
     
     
    public class FXMLTableViewController implements Initializable {
        @FXML private TableView<Person> tableView;
        @FXML private TableColumn<Person, String> firstNameColumn;
        @FXML private TableColumn<Person, String> lastNameColumn;
        @FXML private TableColumn<Person, Integer> testColumn;
        @FXML private TextField txtNombre;
        @FXML private TextField txtPaterno;
        @FXML private TextField txtMaterno;
        @FXML private Label lblInfo;
    //+++
        @FXML private TextField txtURL;
     
    //+++    
        Connection con;
        private DBClass objDbClass;
        private ObservableList<Person> data;
     //   private  LinkedHashMap <String,String> map ;
     
        private String strLike;
        private int nbErreurs;
        private int numRegistros;
        private DBCantos objDbCantos;
     
        @Override
        public void initialize(URL location, ResourceBundle resources) {
            lblInfo.setVisible(false);
            tableView.setVisible(false);
     
        }
        @FXML
        private void buscarCantos() throws IOException {
           final URL fxmlURL = getClass().getResource("fxml_tableview.fxml");
            final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
            final Node control = (Node) fxmlLoader.load();
            final Map<String,String> mapx = control.lookupAll(".text-field")
                                                      .stream()
                                                      .map((Node node)->(TextField)node)
                                                      .collect(Collectors.toMap(TextField::getId,TextField::getText));
                mapx.forEach((id,text)->{
                System.out.printf("Cle = %s Valeur = %s \n",id,text);
                });           
     
            SQLBuilder g = new SQLBuilder("");
            objDbCantos = new DBCantos();
            try {
                con = objDbCantos.getConnection();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(FXMLTableViewController.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(FXMLTableViewController.class.getName()).log(Level.SEVERE, null, ex);
            }
            buildCantos(g);           
            }	
     
     
        @FXML
        private void lanzarBusqueda() throws IOException {
            nbErreurs=0;
            numRegistros=0;
            lblInfo.setVisible(true);
    	LinkedHashMap <String,String> map = new LinkedHashMap <>();
            map.put("nombre", txtNombre.getText().toUpperCase());
            map.put("apellido", txtPaterno.getText().toUpperCase());
            map.put("amaterno", txtMaterno.getText().toUpperCase());
            SQLBuilder gen = new SQLBuilder("");
     
            map.entrySet().stream().forEach((Map.Entry<String, String> entry) -> {
                //a. Verifica que campos no tienen datos
                if("".equals(entry.getValue()) || (entry.getValue().trim().length() == 0)){
                    nbErreurs++;
                }
                //b. Construye la cadena SQL
                strLike=entry.getValue();
                strLike = "%"+ strLike+"%";
                gen.and(!"".equals(entry.getValue()),"UPPER ("+ entry.getKey()+") "+" like ?",	strLike);
    //            gen.and(!"".equals(c.getTxtValeur()),	"upper ("+ c.getTxtNom()+") "+" like ?",	strLike);
     
            });
     
     
            if(nbErreurs==3){
                lblInfo.setText
                ("¡ERROR! Todos los campos de búsqueda están en blanco. Por favor introduzca datos... ");
                Image image = new Image(getClass().getResourceAsStream("/fxmltableview/iconos/error_16x16.gif"));
                lblInfo.setGraphic(new ImageView(image));
                lblInfo.setTextFill(Color.web("#FF3333"));
                tableView.setVisible(false);
           }
     
           else{
               objDbClass = new DBClass();
                try{
                    con = objDbClass.getConnection();
                    buildData(gen);
                    tableView.setRowFactory(
                    (TableView<Person> tableView1) -> {
                        final TableRow<Person> row = new TableRow<>();
                        final ContextMenu rowMenu = new ContextMenu();
                        MenuItem editItem = new MenuItem("Edit");
                        editItem.setId("rpt01");
                        editItem.setOnAction((ActionEvent event) -> {
                            System.out.println("%%%%%"+editItem.getId());
                        });
                        MenuItem removeItem = new MenuItem("Delete");
                        removeItem.setId("rpt02");
                        removeItem.setOnAction((ActionEvent event) -> {
                            System.out.println("+++++"+row.getItem().getTest());
                        });
                        rowMenu.getItems().addAll(editItem, removeItem);
                        row.contextMenuProperty().bind(
                                Bindings.when(Bindings.isNotNull(row.itemProperty()))
                                        .then(rowMenu)
                                        .otherwise((ContextMenu)null));
                        tableView1.setOnMouseClicked((MouseEvent e) -> {
                            rowMenu.show(tableView1, e.getScreenX(), e.getScreenY());
                        });
                        return row;
                    });
                }
                catch(ClassNotFoundException | SQLException ce){
                }
            }	
        }    
        private void buildData(SQLBuilder gen){        
            data = FXCollections.observableArrayList();
            PreparedStatement pstmt;
            try { 
                pstmt = gen.createStatement(con, "SELECT idtest, nombre, apellido FROM tbltest ");
                String strWhere = pstmt.toString();
                ResultSet rs = pstmt.executeQuery();
                while(rs.next()){
                    Person cm = new Person();
                    cm.setTest(rs.getInt("idtest"));
                    cm.setFirstName(rs.getString("nombre"));
                    cm.setLastName(rs.getString("apellido"));
                    data.add(cm);
                    ++numRegistros;
                }
                if (numRegistros==0) {
            /*        lblInfo.setText
                        ("No se encontraron personas. Por favor verifique sus criterios de busqueda...");
                    Image image = new Image(getClass().getResourceAsStream("/fxmltableview/iconos/advertencia_16x16.png"));
                    lblInfo.setGraphic(new ImageView(image));
                    lblInfo.setTextFill(Color.web("#C68E17"));*/
                    mostrarTabla("No se encontraron personas. Por favor verifique sus criterios de busqueda...",
                            "/fxmltableview/iconos/nada_16x16.png","#C68E17", false);
     
    //                tableView.setVisible(false);
                }
                if (numRegistros==1) {
      //              lblInfo.setText("SE ENCONTRÓ " + numRegistros + " PERSONA");
      /*              Image image = new Image(getClass().getResourceAsStream("error_24x24.png"));
                    lblInfo.setGraphic(new ImageView(image));
                    lblInfo.setTextFill(Color.web("#C68E17"));*/
    //                tableView.setVisible(true);
                    mostrarTabla("SE ENCONTRÓ " + numRegistros + " PERSONA."+
                            "Haga clic sobre la persona para abrir el menú de opciones.",
                            "/fxmltableview/iconos/ok_16x16.png","#C68E17", true);
                }
                if (numRegistros>2) {
    //                lblInfo.setText("SE ENCONTRARON " + numRegistros + " PERSONAS");
    //                tableView.setVisible(true);
                    mostrarTabla("SE ENCONTRARON " + numRegistros + " PERSONAS. "+
                            "Haga clic sobre la persona para abrir el menú de opciones.",
                            "/fxmltableview/iconos/ok_16x16.png","#C68E17", true);
                }
            }
            catch(SQLException e){
                System.out.println("Error on Building Data"+e.getErrorCode()+ ": "+e.getMessage());            
            }
        }
     
        private void mostrarTabla(String strInfo, String strImage, String strColor, boolean tblVisible){
            Image image = new Image(getClass().getResourceAsStream(strImage));
            lblInfo.setGraphic(new ImageView(image));
            lblInfo.setTextFill(Color.web(strColor));
    //        tableView.setVisible(false);
            lblInfo.setText(strInfo);
            lblInfo.setVisible(true);
    if (tblVisible==true){
           assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file...";
           firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("test"));   
           lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));  
           testColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));   
           tableView.setItems(data);
           tableView.getItems();
           }
    tableView.setVisible(tblVisible);
    nbErreurs=0;
        }
    //----
        private void buildCantos(SQLBuilder gen){        
            data = FXCollections.observableArrayList();
            String strPreURL = "https://docs.google.com/uc?export=download&id=";
            PreparedStatement pstmt;
            try { 
                pstmt = gen.createStatement(con, "SELECT * FROM tblcantos ");
                String strWhere = pstmt.toString().toUpperCase();
                ResultSet rs = pstmt.executeQuery();
                while(rs.next()){
                    Person cm = new Person();
                    cm.setTest(rs.getInt("id_canto"));
                    cm.setFirstName(rs.getString("titulo"));
                    cm.setLastName(rs.getString("url_comentario"));
                    txtURL.setText(strPreURL+rs.getString("url_comentario"));
                    data.add(cm);
                    ++numRegistros;
                }
                if (numRegistros==0) {
            /*        lblInfo.setText
                        ("No se encontraron personas. Por favor verifique sus criterios de busqueda...");
                    Image image = new Image(getClass().getResourceAsStream("/fxmltableview/iconos/advertencia_16x16.png"));
                    lblInfo.setGraphic(new ImageView(image));
                    lblInfo.setTextFill(Color.web("#C68E17"));*/
                    mostrarCanto("No se encontraron personas. Por favor verifique sus criterios de busqueda...",
                            "/fxmltableview/iconos/nada_16x16.png","#C68E17", false);
     
    //                tableView.setVisible(false);
                }
                if (numRegistros==1) {
      //              lblInfo.setText("SE ENCONTRÓ " + numRegistros + " PERSONA");
      /*              Image image = new Image(getClass().getResourceAsStream("error_24x24.png"));
                    lblInfo.setGraphic(new ImageView(image));
                    lblInfo.setTextFill(Color.web("#C68E17"));*/
    //                tableView.setVisible(true);
                    mostrarCanto("SE ENCONTRÓ " + numRegistros + " PERSONA."+
                            "Haga clic sobre la persona para abrir el menú de opciones.",
                            "/fxmltableview/iconos/ok_16x16.png","#C68E17", true);
                }
                if (numRegistros>2) {
    //                lblInfo.setText("SE ENCONTRARON " + numRegistros + " PERSONAS");
    //                tableView.setVisible(true);
                    mostrarCanto("SE ENCONTRARON " + numRegistros + " PERSONAS. "+
                            "Haga clic sobre la persona para abrir el menú de opciones.",
                            "/fxmltableview/iconos/ok_16x16.png","#C68E17", true);
                }
            }
            catch(SQLException e){
                System.out.println("Error on Building Data"+e.getErrorCode()+ ": "+e.getMessage());            
            }
        }
        private void mostrarCanto(String strInfo, String strImage, String strColor, boolean tblVisible){
            Image image = new Image(getClass().getResourceAsStream(strImage));
            lblInfo.setGraphic(new ImageView(image));
            lblInfo.setTextFill(Color.web(strColor));
    //        tableView.setVisible(false);
            lblInfo.setText(strInfo);
            lblInfo.setVisible(true);
    if (tblVisible==true){
           assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file...";
           firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("test"));   
           lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));  
           testColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));   
           tableView.setItems(data);
           tableView.getItems();
     //      tableView.setEditable(tblVisible);
           }
    tableView.setVisible(tblVisible);
    nbErreurs=0;
        }
    @FXML
    private void abrirFrmBuscarPersona(){}
    }

  8. #8
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    Par défaut
    Je reprends à nouveau la discussion car c'est bizarre que cela ne marche pas.

    En faisant des preuves je constate que lorsque j'ajoute des valeurs aux TextFields dans Scene Builder le code me montre en effet ces valeurs. Mais si je les change par code avec .setText le code ci-dessus ne me montre pas la valeur qu'a été changée. ¿?

  9. #9
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Bon difficile de tester ça vu que l'exemple n'est pas auto-suffisant pour tourner et démontrer le problème de lui-même, mais la question idiote est : pourquoi est-ce que tu recharges le FXML une seconde fois dans le code de cette méthode ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        @FXML
        private void buscarCantos() throws IOException {
           final URL fxmlURL = getClass().getResource("fxml_tableview.fxml");
            final FXMLLoader fxmlLoader = new FXMLLoader(fxmlURL);
            final Node control = (Node) fxmlLoader.load();
            final Map<String,String> mapx = control.lookupAll(".text-field")
                                                      .stream()
                                                      .map((Node node)->(TextField)node)
                                                      .collect(Collectors.toMap(TextField::getId,TextField::getText));
                mapx.forEach((id,text)->{
                System.out.printf("Cle = %s Valeur = %s \n",id,text);
                });
    Parce que bon, du coup, les TextField que tu scannes avec lookupAll() ne sont pas du tout ceux qui sont présents a l’écran et accessibles dans ce contrôleur-là.
    Donc , au final, tu as un 1er FXML (celui affiché à l’écran), son contrôleur (dans lequel cette fonction est appelée) et qui s'en va charger un 2nd FXML (invisible à l’écran) avec un 2nd contrôleur.
    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

  10. #10
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    Par défaut
    Merci Bouye,

    Je charge une seconde fois le FXML parce que j'ai repris l'exemple ci-dessus tel quel..., je dois admettre que je ne sais pas comment faire référence au FXML en question sans le charger et je pense que le problème vient de là...

  11. #11
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ben, euh justement, tu es déjà dans le contrôleur donc tu n'a pas besoin de charger quoi que ce soit, tu as directement accès au contenu du FXML.
    Après bien sur si tu instancie le contrôleur manuellement ailleurs c'est que tu as un soucis dans ton code...
    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

  12. #12
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    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 : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    @bouye
    J'ai compris comme quoi il a mélangé entre l'exemple donné, et ce dont il a justement besoin.

    Alors que là son problème est simple. Possible qu'il ne sait pas que le plus important pour faire un lookupAll c'est de récupérer le noed racine.
    @padre.cedano
    Alors pour faciliter un peu la tache, si la méthode buscarCantos() est l’événement sur lequel tu veux récupérer tes TextFields alors, alors tu peux faire un truc du genre référencer l'id fxml du noed racine de ton fichier FXML et puis tu va le récupérer pour chercher tous les TextFields, en supposant que ton fichier FXML est comme ça:
    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
    <?import java.util.*?><?import javafx.scene.*?>
    <?import javafx.scene.control.*?>
    <?import javafx.scene.layout.*?>
     
     
     
     
     <AnchorPane fx:id="idPane" id="AnchorPane" prefHeight="200" prefWidth="320" fx:controller="appfxml.FXMLDocumentController" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8">
       <children>
          <TextField id="txtUn" fx:id="t1" layoutX="14.0" layoutY="14.0" />
          <TextField id="txtDeux" fx:id="t2" layoutX="14.0" layoutY="50.0" />
          <TextField id="txtTrois" fx:id="t3" layoutX="14.0" layoutY="88.0" />
          <Button id="b1" fx:id="buton1" text="Afficher Textes" onAction="#buscarCantos" layoutX="14.0" layoutY="160.0"  />
       </children> 
    </AnchorPane>
    Tu va ajouter
    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
     
    public class FXMLTableViewController implements Initializable {
         //....................
        //.....................
        @FXML 
    private AnchorPan idPane;
     
     // ........
         @FXML    
    private void buscarCantos() throws IOException {
     
            final Map<String,String> mapx = idPane.lookupAll(".text-field")
                                                  .stream()
                                                  .map((Node node)->(TextField)node)
                                                  .collect(Collectors.toMap(TextField::getId,TextField::getText));
                mapx.forEach((id,text)->{
                System.out.printf("Cle = %s Valeur = %s \n",id,text);
                });           
    //...........
    //...........
    }
    }
    Ça c'est simple, et je me demande déjà pourquoi tout ça alors que tu peux récupérer tes textes fiels un par un sauf si tu veux ajouter beacoup

  13. #13
    Nouveau membre du Club
    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
    Points : 39
    Points
    39
    Par défaut
    Salut Bouye, La.Lune.

    En effet, mon erreur c'était de charger deux fois le Noeud

    J'ai donc donné un id à celui-la:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        @FXML  private Node cantosNode;
    Puis je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            final Map<String,String> map = cantosNode.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);
            });
    Et voilà que j'obtiens tous les donnés de mes TextFields.

    Quant à la question de pourquoi je veux récupérer les valeurs de mes TextFields, c'est pour faciliter la tache de insérer des donnés dans ma base… Imaginons un formulaire avec beaucoup de donnés que je dois récupérer pour les insérer dans une base de données. Je pense que le plus simple c'est de récupérer les valeurs de mes TextFields dans un Map et préparer mon statement avec ces valeurs.

    Merci pour votre aide, je marque le problème comme résolu.

+ 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