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

 Java Discussion :

Problème JTextField avec NetBeans


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut Problème JTextField avec NetBeans
    Bonjour, je reviens vers vous pour un problème, mais aussi surtout une incompréhension alors que je suis le cours sur le Java.

    Pour mon projet, je dois créer une interface graphique avec plusieurs checkbox, textfield, et autres. Cette interface sera utile pour paramétrer une machine. Le technicien qui utilisera cette interface rentrera les détails souhaités, puis ces informations rentreront dans un fichier XML. Ce fichier XML ira dans une machine et la machine sera donc configuré.

    J'ai réussi à créer mon document XML (éléments parent, élément enfant, attributs, nom de document). Les attributs de ce document changeront en fonction des détails choisis dans l'interface.

    De plus, j'ai déjà réussi à faire que lorsque j'écris dans la console, ça me remplace un attribut (au bon endroit, le bon attribut, etc) donc ceci est OK. J'ai donc eu pour but de créer une interface, cependant les problèmes arrivent. Tout d'abord, je suis aller sur l'IDE NetBeans car il est plus simple visuellement et plus léger.

    Ensuite, je créer tout d'abord des TextField (pour que le technicien rentre son information) (ces TextField seront remplacés par des checkbox).

    Cependant, c'est là que le problème arrive. Je n'arrive pas à récupérer la valeur de JTextField, pour ensuite faire que mon attribut ai la valeur saisie/récupéré.

    Voici mon programme qui permet de générer mon document XML avec tous ces éléments et attributs :

    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
    package tutoriel;
     
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerException;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
     
    import org.w3c.dom.Comment;
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
     
    import java.util.Random;
    import java.util.Scanner;
     
    public class main_window extends javax.swing.JFrame {
     
            static int nombreAleatoire = 900000 + (int)(Math.random() * ((999999 - 900000) + 1));
        static String a ="";
     
        public main_window() {
            initComponents();
        }
     
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
        private void initComponents() {
     
            jLabel1 = new javax.swing.JLabel();
            txt1 = new javax.swing.JTextField();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            setTitle("Configurateur");
            setBackground(new java.awt.Color(255, 255, 255));
            setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
     
            jLabel1.setText("jLabel1");
     
            javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
            getContentPane().setLayout(layout);
            layout.setHorizontalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGap(20, 20, 20)
                    .addComponent(jLabel1)
                    .addGap(26, 26, 26)
                    .addComponent(txt1, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addContainerGap(552, Short.MAX_VALUE))
            );
            layout.setVerticalGroup(
                layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addContainerGap()
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel1)
                        .addComponent(txt1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addContainerGap(424, Short.MAX_VALUE))
            );
     
            pack();
        }// </editor-fold>                       
     
        /**
         * @param args the command line arguments
         * @throws javax.xml.transform.TransformerException
         * @throws javax.xml.parsers.ParserConfigurationException
         */
        public static void main(String[] args) throws TransformerException, ParserConfigurationException {
          DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
     
             //Creation d'un numero de reference aleatoire
             Random rand = new Random();
             int nb = rand.nextInt(999999 - 900000 + 1) + 900000;
             a = String.valueOf(nb);
     
             DocumentBuilder builder = factory.newDocumentBuilder();
     
     
     
    //Demande d'ecriture des donnees dans la console      
             Scanner brand = new Scanner(System.in);
             System.out.println("Nom:");
             String nom= brand.nextLine();
     
             Scanner fcts= new Scanner(System.in);
             System.out.println("Fonction:");
             String fonction= fcts.nextLine();
     
             Scanner fcts1 = new Scanner(System.in);
             System.out.println("Fonction 1:");
             String fonction1 = fcts1.nextLine();
     
             Document xml = builder.newDocument(); //Création du fichier
             Element root = xml.createElement("conf"); //Création de notre élément racine   
     
             //Création noeud XML
             Element machine = xml.createElement("machine");
             Element truc1= xml.createElement("truc1");
             Element truc2= xml.createElement("truc2");
             Element truc3= xml.createElement("truc3");
     
     
             //Commentaires
             Comment comment = xml.createComment("Configuration machine");
             root.appendChild(comment);
             Comment comment2 = xml.createComment("Définition de la machine ");
     
     
          //Création et valeurs des attributs
          machine.setAttribute("nom",nom);
          machine.setAttribute("fonction",fonction);
          machine.setAttribute("fonction 1",fonction1);
     
          truc1.setAttribute("aide","3");
          truc1.setAttribute("coefA", "3");
     
          truc2.setAttribute("coefB","3");
     
          truc3.setAttribute("count", "3"); 
     
     
     
             //Indication quel noeud parent avec quel noeud(s) enfant(s)
             machine.appendChild(truc1);
             machine.appendChild(truc2);
             machine.appendChild(truc3);
             root.appendChild(machine);
     
             Transformer t = TransformerFactory.newInstance().newTransformer();
             t.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "madTdbidon.dtd");
             t.setOutputProperty(OutputKeys.INDENT, "yes");
             t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
             t.setOutputProperty(OutputKeys.VERSION, "1.0");
             // appliquer la transformation
             String resultFile = a+".conf";
             StreamResult XML = new StreamResult(resultFile);
     
             t.transform(new DOMSource(root), XML); 
     
            }
                public void run() {
                    new main_window().setVisible(true);
                }
     
        // Variables declaration - do not modify                    
        private javax.swing.JLabel jLabel1;
        private javax.swing.JTextField txt1;
        // End of variables declaration                  
    }
    Merci beaucoup à ceux qui m'aideront et comprendrons le problème

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Il faut au moins afficher la fenêtre dans ton programme. Pour ça, tu as une méthode :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public void run() {
                      new main_window().setVisible(true);
                  }
      Rends-la statique et tu l'appelles dans la méthode main() à la place de ton interface "console".
    2. Ensuite il faut récupérer les contenus des champs, donc avoir accès à des variables qui pointent sur les objets correspondants (enfin, c'est plus simple comme ça). Actuellement, tu as un seul champ texte, et une variable qui te permet dans récupérer la valeur saisie par txt1.getText());. Lorsque tu auras remplacer le champ texte par une checkbox, tu pourras faire lacheckbox.isSelected()); pour déterminer si elle est cochée ou non (lacheckbox étant une variable qui pointe sur un objet JCheckBox).
    3. Il faut pouvoir accéder à ces variables lorsque la fenêtre est encore ouverte, sinon les champs ne seront plus forcément lisible (pourront avoir été disposés). En plus une JFrame n'est pas bloquante pour le processus appelant.
      Un moyen simple est d'écouter la fermeture de la JFrame et de stocker les valeurs des champs dans des variables que tu pourras ensuite récupérer.
      Par exemple, tu te fais une petite classe pour stocker les différents paramètres à saisir.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class Parametres {
          public String nom;
          public String fonction;
          public String fonction1;
          /*...etc...*/
      }
      Ensuite tu ajoutes à la fenêtre une méthode qui permet de copier les contenus des champs dans une instance de cette classe :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      public void getParametres(Parametres parametres) {
             parametres.nom = txt1.getText(); // par exemple
             // récupérer comme ça tous les paramètres
      }
      Et tu modifies run comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public static void run() {
            final Parametres param = new Parametres(); // pour récupérer la saisie
            final main_window window = new main_window();
            main_waindow.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent event) {
                          window.getParametres(param); 
                          // ici tu peux traiter les paramètres
                          System.out.println("nom : " + param.nom);
                    };
            });
      }
      La fenêtre est actuellement configurée pour que lorsqu'on la ferme par le bouton "croix", le programme s'arrête.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      Ce qui va être gênant pour traiter les données saisies après fermeture de la fenêtre.

      utilise par exemple DISPOSE_ON_CLOSE à la place.
    4. Une autre solution serait de faire tout dans le windowClosing*, ou le windowClose* du listenener. Dans ce cas le main du programme ne serait plus qu'un new main_window.setVisible(true);.

      Tu peux te passer de la classe Parametres. Dans le constructeur, tu fais directement :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      this.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent event) {
                          // ici tu lis les paramètres
                          String nom = txt1.getText();
       
                          // puis tu colles le reste de ton programme qui traite les données saisies (la partie de ton code actuel après la lecture clavier)
                    };
            });
      C'est moins souple dans une application de faire comme ça, mais pour un exercice limité, ça peut très bien convenir.

      *le windowClose est appelée pour toute fermeture (suite à l'appel de la méthode dispose()) et la fermeture de la fenêtre est définitive alors que windowClosing permet d'annuler éventuellement la fermeture, sinon c'est pareil



    Au passage, il ne faut créer qu'un seul Scanner sur System.in par application, parce que la saisie clavier est bufferisée.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Salut, merci de ta réponse rapide ! Cependant, j'ai deux trois remarques/questions (car peu de monde ne comprends du premier coup )


    1. Citation Envoyé par joel.drigo Voir le message
      Il faut au moins afficher la fenêtre dans ton programme. Pour ça, tu as une méthode :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      public void run() {
                      new main_window().setVisible(true);
                  }
      Rends-la statique et tu l'appelles dans la méthode main() à la place de ton interface "console".
      Cette méthode est déjà utilisé à la fin de mon programme. J'appelle mon interface "console" grace à mon Scanner, mais comment changer ceci par ma nouvelle méthode ?

    2. Ensuite il faut récupérer les contenus des champs, donc avoir accès à des variables qui pointent sur les objets correspondants (enfin, c'est plus simple comme ça). Actuellement, tu as un seul champ texte, et une variable qui te permet dans récupérer la valeur saisie par txt1.getText());. Lorsque tu auras remplacer le champ texte par une checkbox, tu pourras faire lacheckbox.isSelected()); pour déterminer si elle est cochée ou non (lacheckbox étant une variable qui pointe sur un objet JCheckBox).
      Tu veux donc dire que j'ai juste à déclarer une variable au début de mon programme (par exemple), et ensuite dans mon programme affecter la valeur saisie à la variable déclarer plutot ?
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      exemple=txt1.getText());
      et que je peux ensuite exploiter cette variable où je le souhaites ?

    3. Il faut pouvoir accéder à ces variables lorsque la fenêtre est encore ouverte, sinon les champs ne seront plus forcément lisible (pourront avoir été disposés). En plus une JFrame n'est pas bloquante pour le processus appelant.
      Un moyen simple est d'écouter la fermeture de la JFrame et de stocker les valeurs des champs dans des variables que tu pourras ensuite récupérer.
      Par exemple, tu te fais une petite classe pour stocker les différents paramètres à saisir.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      public class Parametres {
          public String nom;
          public String fonction;
          public String fonction1;
          /*...etc...*/
      }
      Ensuite tu ajoutes à la fenêtre une méthode qui permet de copier les contenus des champs dans une instance de cette classe :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      public void getParametres(Parametres parametres) {
             parametres.nom = txt1.getText(); // par exemple
             // récupérer comme ça tous les paramètres
      }
      Et tu modifies run comme ça :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public static void run() {
            final Parametres param = new Parametres(); // pour récupérer la saisie
            final main_window window = new main_window();
            main_waindow.addWindowListener(new WindowAdapter() {
                    public void windowClosing(WindowEvent event) {
                          window.getParametres(param); 
                          // ici tu peux traiter les paramètres
                          System.out.println("nom : " + param.nom);
                    };
            });
      }
      La fenêtre est actuellement configurée pour que lorsqu'on la ferme par le bouton "croix", le programme s'arrête.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
      Ce qui va être gênant pour traiter les données saisies après fermeture de la fenêtre.

      utilise par exemple DISPOSE_ON_CLOSE à la place.
      Je vais regarder tout ceci en detail, je n'avais pas pensé. Après, est ce obligatoire ? C'est surement très utile de mémoriser les saisies une fois le programme fermé, cependant pour mon cas, on rempli tous, on valide, le fichier se rempli et donc toutes les données sont déjà enregistrées et pas besoin d'être sauvegardé dans mon programme. On est d'accord ou j'ai pas tout à fais bien compris ?

    4. C'est moins souple dans une application de faire comme ça, mais pour un exercice limité, ça peut très bien convenir.
      J'ai raccourci mon programme pour le forum, mais sinon je dois gérer plus de 300 attributs pour un total de 162 éléments XML, donc je pense que cette solution va être un peu compliqué

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tomlrt53 Voir le message
    Cette méthode est déjà utilisé à la fin de mon programme. J'appelle mon interface "console" grace à mon Scanner, mais comment changer ceci par ma nouvelle méthode ?
    Dans le code que tu montres, cette méthode est appelée nulle part. Elle est juste déclarée.

    Citation Envoyé par tomlrt53 Voir le message

    Tu veux donc dire que j'ai juste à déclarer une variable au début de mon programme (par exemple), et ensuite dans mon programme affecter la valeur saisie à la variable déclarer plutot ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exemple=txt1.getText());
    et que je peux ensuite exploiter cette variable où je le souhaites ?
    Sûrement pas au début : l'affectation d'une valeur à une variable en Java se fait au moment de l'exécution du code d'affectation, donc avec la valeur que ça a au moment de cette exécution. D'où l'utilisation d'un écouteur qui écoute quand la fenêtre se ferme, puisque quand la fenêtre se ferme, à priori, les données sont saisies dans les champs.

    Citation Envoyé par tomlrt53 Voir le message

    Je vais regarder tout ceci en detail, je n'avais pas pensé. Après, est ce obligatoire ? C'est surement très utile de mémoriser les saisies une fois le programme fermé, cependant pour mon cas, on rempli tous, on valide, le fichier se rempli et donc toutes les données sont déjà enregistrées et pas besoin d'être sauvegardé dans mon programme. On est d'accord ou j'ai pas tout à fais bien compris ?
    Non mais si tu veux les écrire dans un fichier, il faut les mémoriser (temporairement, je ne parle pas de les mémoriser ad vitam æternam). Les mémoriser le temps d'écrire le fichier. Je veux dire qu'après la fermeture de la fenêtre, c'est trop tard pour aller chercher le contenu des champs, c'est pour ça que juste avant que ça se ferme, on les stocke dans des variables, comme ça on les as juste après que la fenêtre soit fermée. Dans la dernière solution, on n'a pas besoin de les mémoriser parce qu'on fait le traitement juste avant que la fenêtre soit fermée définitivement..

    Citation Envoyé par tomlrt53 Voir le message
    J'ai raccourci mon programme pour le forum, mais sinon je dois gérer plus de 300 attributs pour un total de 162 éléments XML, donc je pense que cette solution va être un peu compliqué
    C'est la limite de faire des dialogues avec la palette de NetBeans. Tous les champs que tu crées sont disponibles sous forme d'une variable nommée. Il y a différentes solutions :
    1. créer une fenêtre par du code, qui génère en boucle des champs. On les stockant dans un tableau ou une liste, tu pourras en récupérer la valeur dans une boucle
    2. tu fais un tableau (ou une liste) à la main qui stocke tous les champs créés par la palette (avec 300 champs ça risque d'être fastidieux)
    3. tu utilises une JTable : ceci te permettra de récupérer directement les valeurs, mais aussi de pouvoir avoir une interface plus sympa (avec des filtres par exemple). En revanche, c'est un peu plus compliqué que de faire des champs directement dans un JPanel
    4. tu utilise de la réflexion pour accéder aux champs

    Cependant, avec 3 champs ou 300 n'impacte pas le choix entre les deux méthodes que je t'ai présentées. C'est plutôt entre avoir 1 fenêtre et en avoir 20... avec des enchaînements de menus multiples qui permettent d'afficher la même fenêtre par plusieurs chemins possibles.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Dans le code que tu montres, cette méthode est appelée nulle part. Elle est juste déclarée.
    J'ai maintenant appelé cette méthode et lorsque je compile mon programme, la fenêtre s'ouvre bien. Cependant, désormais, lorsque j'écris mes informations dans ma console (via le Scanner), le programme ne s’arrête plus automatiquement lorsque j'ai fini de définir mes variables, contrairement à avant.


    Sûrement pas au début : l'affectation d'une valeur à une variable en Java se fait au moment de l'exécution du code d'affectation, donc avec la valeur que ça a au moment de cette exécution. D'où l'utilisation d'un écouteur qui écoute quand la fenêtre se ferme, puisque quand la fenêtre se ferme, à priori, les données sont saisies dans les champs.
    J'ai réussi à affecter la valeur de mon textField dans une variable, et d'ensuite afficher cette variable. Cependant, j'ai fais ça au tout début du programme car les autres méthodes sont en static et du coup le textField n'est pas static.
    Donc lorsque je change mon texte, ça ne change pas ma variable : normal. Si je te comprends bien, je dois créer une nouvelle méthode (ActionListener) qui permet de lire le textField et de l'afficher où je veux dans les méthodes static ?

    Il faut pouvoir accéder à ces variables lorsque la fenêtre est encore ouverte, sinon les champs ne seront plus forcément lisible (pourront avoir été disposés). En plus une JFrame n'est pas bloquante pour le processus appelant.
    Un moyen simple est d'écouter la fermeture de la JFrame et de stocker les valeurs des champs dans des variables que tu pourras ensuite récupérer.
    Par exemple, tu te fais une petite classe pour stocker les différents paramètres à saisir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class Parametres {
        public String nom;
        public String fonction;
        public String fonction1;
        /*...etc...*/
    }
    Ensuite tu ajoutes à la fenêtre une méthode qui permet de copier les contenus des champs dans une instance de cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void getParametres(Parametres parametres) {
           parametres.nom = txt1.getText(); // par exemple
           // récupérer comme ça tous les paramètres
    }
    Et tu modifies run comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public static void run() {
          final Parametres param = new Parametres(); // pour récupérer la saisie
          final main_window window = new main_window();
          main_waindow.addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent event) {
                        window.getParametres(param); 
                        // ici tu peux traiter les paramètres
                        System.out.println("nom : " + param.nom);
                  };
          });
    }
    La fenêtre est actuellement configurée pour que lorsqu'on la ferme par le bouton "croix", le programme s'arrête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    Ce qui va être gênant pour traiter les données saisies après fermeture de la fenêtre.

    utilise par exemple DISPOSE_ON_CLOSE à la place.
    J'essaye tout ça mais je n'y arrive pas.. La classe Paramètres et la partie getParamètres c'est ok, cependant lorsque je copies ton run dans mon programme j'ai beaucoup d'erreur "static". Et après comment afficher cette valeur qui est dans param.nom dans mon attribut ? Ca me signale : cannot find symbol
    symbol: vaiable parametres
    location: class main_window

    Non mais si tu veux les écrire dans un fichier, il faut les mémoriser (temporairement, je ne parle pas de les mémoriser ad vitam æternam). Les mémoriser le temps d'écrire le fichier. Je veux dire qu'après la fermeture de la fenêtre, c'est trop tard pour aller chercher le contenu des champs, c'est pour ça que juste avant que ça se ferme, on les stocke dans des variables, comme ça on les as juste après que la fenêtre soit fermée. Dans la dernière solution, on n'a pas besoin de les mémoriser parce qu'on fait le traitement juste avant que la fenêtre soit fermée définitivement..
    D'accord je vais suivre tes méthodes alors

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par tomlrt53 Voir le message
    J'essaye tout ça mais je n'y arrive pas.. La classe Paramètres et la partie getParamètres c'est ok, cependant lorsque je copies ton run dans mon programme j'ai beaucoup d'erreur "static".
    Il n'y a pas de raison d'avoir d'erreur "static" comme tu dis. Montre ton code (et évite les accents dans les noms Java).

    Citation Envoyé par tomlrt53 Voir le message
    Et après comment afficher cette valeur qui est dans param.nom dans mon attribut ? Ca me signale : cannot find symbol
    symbol: vaiable parametres
    location: class main_window
    Je t'ai dit qu'il fallait traiter les paramètres dans windowClosing(), ce qui signifie déplacer tout le code de génération du xml dans cette méthode, tout ce qui se trouve après Document xml = builder.newDocument(); //Création du fichier, ceci pour pouvoir exploiter les valeurs des attributs de l'instance de classe Parametres. Ou alors il faudrait utiliser un JDialog au lieu d'une JFrame, qui te permettrait facilement de faire une méthode run() qui retourne les paramètres. Ce n'est pas plus compliqué qu'une JFrame, il faut juste appeler le super constructeur pour que la fenêtre soit modale (et retourner l'instance de Parametre).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class main_window extends javax.swing.JDialog{
     
            static int nombreAleatoire = 900000 + (int)(Math.random() * ((999999 - 900000) + 1));
        static String a ="";
     
        public main_window() {
            super((java.awt.Frame)null,true);
            initComponents();
        }
    Du coup tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static Parametres run() {
          final Parametres param = new Parametres(); // pour récupérer la saisie
          final main_window window = new main_window();
          main_waindow.addWindowListener(new WindowAdapter() {
                  public void windowClosing(WindowEvent event) {
                        window.getParametres(param);  
                  };
          });
          return param ;
    }
    Et donc maintenant dans ta méthode main tu peux appeler ta méthode run :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Parametres param = run();
    // et là traiter :
    System.out.println("nom : " + param.nom); // pour l'exemple, j'affiche en console (!)
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Problème Boostrap avec Netbeans
    Par GUYZOO dans le forum NetBeans
    Réponses: 0
    Dernier message: 09/12/2017, 03h21
  2. Réponses: 15
    Dernier message: 13/02/2015, 17h04
  3. JtextField avec NetBeans
    Par L'aigle de Carthage dans le forum NetBeans
    Réponses: 1
    Dernier message: 11/05/2011, 17h42
  4. Mon problème avec NetBeans 5.0
    Par Djama dans le forum NetBeans
    Réponses: 1
    Dernier message: 22/05/2007, 23h12
  5. Réponses: 5
    Dernier message: 04/07/2006, 00h11

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