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

Composants Java Discussion :

Ajouter des Listener sur des objets créés dynamiquement


Sujet :

Composants Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut Ajouter des Listener sur des objets créés dynamiquement
    Bonjour,
    je réalise actuellement un programme qui récupère des informations dans un fichier de properties, et crée des JTextArea en fonction des paramètres.

    Ces JTextArea sont créés de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (int i = 0; i < ArrayList().size(); i++) {
    			JPanel.add(new JTextArea(ArrayList().get(i).getNom()));
    		}
    Comment faire pour créer des Listener associés à ces JTextArea?
    Je voudrai pouvoir récupérer le texte modifié dans ceux-ci.

    Merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    ben...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (int i = 0; i < ArrayList().size(); i++) {
      JTextArea x = new JTextArea(ArrayList().get(i).getNom());
      x.addXxxListener(new XxxListener(){
        public void xxx(XxxEvent xe) {
          JTextArea myTxtArea = (JTextArea)xe.getSource();
          myTxtArea.setText("ça marche!");
        }
      });
     
      JPanel.add(x);
     
    }
    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Merci
    J'avais pensé à faire comme ca, mais en nommant à chaque fois mon JTextArea x, il n'y aura pas de problèmes?

    Petite autre question, j'ai appris les Listener en faisant des classes internes, 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
     
    JTextArea modif = new JTextArea("Modifier");
    		modif.addActionListener(new ModifListener());
     
    class ModifListener implements ActionListener {
     
    		/**
                     * Redéfinition de la méthode actionPerformed
                     */
    		public void actionPerformed(ActionEvent arg0) {
    			modifier();
    		}
    	}
    Quel est l'avantage de ta méthode, par rapport à celle là?

    Merci

  4. #4
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par floctc Voir le message
    J'avais pensé à faire comme ca, mais en nommant à chaque fois mon JTextArea x, il n'y aura pas de problèmes?
    bin non... c'est une variable locale, à l'intérieure de la boucle.
    dans le listener, ce n'est pas cette variable qui est utilisée (c'est xe.getSource()).

    bien sûr les objets sont les mêmes, mais le fait d'utiliser xe.getSource() garantit qu'on agira sur le bon objet, tandis que si on essayait de recycler une référence venue d'ailleurs, on ne serait sûr de rien.

    Citation Envoyé par floctc Voir le message
    Petite autre question, j'ai appris les Listener en faisant des classes internes, comme ça :
    ...

    Quel est l'avantage de ta méthode, par rapport à celle là?
    ce sont des classes anonymes...

    l'avantage, c'est qu'on a un peu moins de code, et surtout de ne pas donner de nom à la classe là où ça ne sert à rien

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Merci pour les explications

    Il me reste un souci, l'objet XxxListener est présenté comme une erreur à la compilation.
    Je dois créer une classe ou une interface vide, ou il y a une autre solution?

  6. #6
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Citation Envoyé par floctc Voir le message
    Il me reste un souci, l'objet XxxListener est présenté comme une erreur à la compilation.
    XxxListener n'existe pas! je voulais juste illustrer que à la place de Xxx il fallait choisir le listener approprié: KeyListener, ActionListener, MouseListener, etc... à toi de prendre celui qui convient!

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  7. #7
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par Pill_S Voir le message
    ben...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (int i = 0; i < ArrayList().size(); i++) {
      JTextArea x = new JTextArea(ArrayList().get(i).getNom());
      x.addXxxListener(new XxxListener(){
        public void xxx(XxxEvent xe) {
          JTextArea myTxtArea = (JTextArea)xe.getSource();
          myTxtArea.setText("ça marche!");
        }
      });
     
      JPanel.add(x);
     
    }
    J'ajouterai qu'ici il pourrait être bien de n'instancier qu'un seul listener avant la boucle et le réutiliser plutôt que d'instancier autant de listeners que de composants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    XxxListener listener = new XxxListener(){
        public void xxx(XxxEvent xe) {
            JTextArea myTxtArea = (JTextArea)xe.getSource();
            myTxtArea.setText("ça marche!");
        }
    };
    for (int i = 0; i < ArrayList().size(); i++) {
      JTextArea x = new JTextArea(ArrayList().get(i).getNom());
      x.addXxxListener(listener);
      JPanel.add(x);
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut


    Bonne idée de le créer une première fois avant, je l'ai repris

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Finalement, j'ai encore un problème...
    J'ai choisi d'utiliser CaretListener pour récupérer le texte des JTextArea.

    Seulement, l'action est effectuée à chaque fois qu'on clique sur la zone de texte.

    Ce que je voudrai, c'est que l'action de récupérer le texte (et ce que j'en fais après) ne s'effectue que lorsque j'appuie sur un bouton (que j'ai déjà créé, avec le listener qui va bien) à la manière d'un formulaire.

    Comment dois-je procéder?

  10. #10
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Dans le ActionListener du bouton, tu peux récupérer le composant qui a le focus avec cette méthode : http://java.sun.com/j2se/1.4.2/docs/...alFocusOwner()

    Maintenant, je ne suis pas sûr que cela fonctionne... Lorsque tu cliques sur le bouton, c'est ce dernier qui prend le focus (à vérifier)

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 389
    Points : 192
    Points
    192
    Par défaut
    Merci, je vais essayer de passer par la. Sinon, je trouverai une autre solution.

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

Discussions similaires

  1. [AJAX] Ajouter un listener sur des champs ajoutés dynamiquement
    Par KzrData dans le forum jQuery
    Réponses: 4
    Dernier message: 05/09/2012, 09h13
  2. Utilisation des listener sur les objets UML
    Par sanchou dans le forum UML
    Réponses: 2
    Dernier message: 11/08/2010, 16h48
  3. Réponses: 3
    Dernier message: 04/02/2010, 11h30
  4. Mettre des textures et des couleurs sur les objets
    Par MaTtaW dans le forum PhysX et APEX
    Réponses: 5
    Dernier message: 31/07/2009, 17h42
  5. Réponses: 17
    Dernier message: 12/04/2007, 15h42

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