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

AWT/Swing Java Discussion :

Récupération texte JTextField impossible


Sujet :

AWT/Swing Java

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Par défaut Récupération texte JTextField impossible
    Bonsoir tout le monde, je souhaite accéder à la valeur d'un JTextField depuis une autre classe via un getter mais j'obtiens toujours la chaîne vide.

    Voici mes 2 classes :

    Pour la classe possédant le jtextield :
    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
     
    public class  XPanel extends JPanel {
     JTextField textfield;
     
     public XPanel {
       this.textfield = new JTextField();
     }
     
     public XPanel getView(){
       JPanel j = new JPanel();
       j.add(this.textfield;
       return j;
     }
     
     public String getText(){
       return this.textfield.getText();
     }
    }
    Pour la classe utilisatrice :
    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
     
     
    public class GlobalView {
     
     private List<Xpanel> xpanels;
     
     private class XActionListener implements ActionListener {
     
     public void actionPerformed(ActionEvent e) {
        for(XPanel x : GlobalView.this.xpanels) {
    	System.out.println("La valeur est "+x.getText());
        }			
      }	
    }
     
     
     public GlobalView (){
        this.xpanels = new ArrayList<XPanel>();
        this.frame = new JFrame();
        validateButton = new JButton("Click to validate");
        validateButton.addActionListener(new XActionListener());
        this.frame.add(validateButton);
        this.frame.pack();
       this.frame.setVisible(true);
     }
     
     public void addXPanel(XPanel x){
        this.xpanels.add(x);
     }
     
    }

    Après divers recherche je ne comprend pas pourquoi j'ai toujours la chaine vide, lorsque je saisi du texte.
    Je ne souhaite pas mettre d'actionlistener sur le textfield car c'est la classe utilisatrice qui récupère le contenu à un moment donné.

    Merci pour votre aide !

  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,

    Où et quand est appelée addXPanel de GlobalView ? Est-ce que tu as essayé de voir ce qu'il y avait dans la liste xpanels ? Si c'est bien les JTextField que tu penses y être ? Comment un composant est censé avoir une référence sur l'instance de GlobalView pour pouvoir invoquer cette méthode (vu que tu n'en conserves la référence que "dans" le bouton d'après le code que tu montres) ?

    Par ailleurs, rien à voir, mais le code qui suit ce n'est pas une bonne idée.
    Bon déjà il ne compile pas... ce serait quand même mieux que tu nous montres un code qui compile... enfin du moins que tu montres le code qui est concerné par le problème que tu nous soumets...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public XPanel getView(){
       JPanel j = new JPanel();
       j.add(this.textfield;
       return j;
     }
    Si tu appelles plusieurs fois cette méthode, les JPanel créés précédemment n'auront plus le JTextField : un composant Swing ne peut avoir qu'un seul conteneur parent, donc il se retire de son précédent parent lorsqu'on l'ajoute quelque part. Pourquoi ne pas directement utiliser l'instance de XPanel ?
    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
    Février 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2019
    Messages : 28
    Par défaut
    Si tu appelles plusieurs fois cette méthode, les JPanel créés précédemment n'auront plus le JTextField : un composant Swing ne peut avoir qu'un seul conteneur parent, donc il se retire de son précédent parent lorsqu'on l'ajoute quelque part.
    Je m'entêtais à chercher le problème au niveau de la récupération de la valeur du TextField car en mettant en static le JTextField, je récupérais la saisie mais je ne comprenais pas pourquoi (Cela me gênais car je me doutais que toutes mes instances allaient avoir la même valeur).
    Avec ta remarques j'ai pensé à remonter jusqu’à l'ajout des Panel et comme je n'avais pas mis de getter je recréais à chaque fois une instance au lieu de récupérer celle déjà créée.

    Donc merci joel.drigo ! Le problème est résolu.
    (Désolé pour cette erreur, débutant en swing je pensais que le problème venait de là) .

  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 Realc Voir le message
    ...en mettant en static le JTextField,
    Il ne faut surtout pas le mettre en static...
    Citation Envoyé par Realc Voir le message
    (Cela me gênais car je me doutais que toutes mes instances allaient avoir la même valeur).
    ...exactement pour cette raison-là oui.

    En fait, c'est le souci avec les implémentations avec une classe externe qui implémente l'interface ActionListener (ou d'autres interfaces utilisées pour l'écoute d'évènements de composants d'ui) : l'accès aux composants de la vue. A défaut de procéder avec du data binding (et donc à la mise en place d'un modèle, qu'on pourra partager entre vue et contrôleur), il est plus simple de le faire avec une classe interne, surtout que ça ne sert à rien d'avoir une classe externe dans ce cas, parce qu'elle est forcément très dépendante de la composition de la vue. Ou alors on a une implémentation beaucoup plus complexe (avec gestion de commandes, de contextes et de sélection) parce qu'on a beaucoup d'actions à gérer, et que ça vaut le coup de passer un peu de temps sur un socle, et encore, les frameworks comme NetBeans RCP ou Eclipse RCP font déjà tout ça très bien sans qu'on ait à produire d'effort sur cet aspect.

    De plus, à mon avis, l'implémentation de classe implémentant l'interface est non seulement problématique lorsqu'elle est externe, mais, y compris en interne, depuis l'apparition des expression lambda, je dirais même qu'elle est en passe d'être obsolète.
    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. Récupération texte JTextField
    Par seb111983 dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 20/12/2010, 17h27
  2. JTextField récupération text
    Par frto0 dans le forum Composants
    Réponses: 2
    Dernier message: 15/06/2010, 14h01
  3. [RegEx] problème récupération texte
    Par Kerod dans le forum Langage
    Réponses: 2
    Dernier message: 25/01/2006, 16h10
  4. [VB6][Objet OLE] probleme récupération texte
    Par dedella_al dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/10/2005, 19h54
  5. récupération texte entre <option> et </option>
    Par Trunks dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 15/09/2005, 14h19

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