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 :

Problèmes de listener associé à un Jcombobox


Sujet :

Composants Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut Problèmes de listener associé à un Jcombobox
    Bonjours,

    voilà maintenant quelque temps que je suis bloqué sur un de mes programmes à cause d'un JCombobox. Mon problème est que lorsque je clique sur le JCombobox 2 événements sont créés au lieu d'un seul.

    J'ai bien vérifié je ne rattache le listener qu'une fois et au bon bouton.

    Voilà une partie de mon code:

    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
    final JComboBox figure = new JComboBox(new String[]{"cercle","rectangle","quadrilatere","triangle"});
    				figure.addItemListener(new ItemListener(){
    					public void itemStateChanged(ItemEvent e){
    						fig = null;
    						dessin.removeAllListener();
    						if (newFig.isSelected()){
    							switch (figure.getSelectedIndex()){
    							case 0:
    								fig = new UnCercle();
    								break;
    							case 1:
    								fig = new UnRectangle();
    								break;
    							case 2:
    								fig = new UnQuadrilatere();
    								break;
    							case 3: 
    								fig = new UnTriangle();
    								break;
    							}
    							if (fig != null)
    								dessin.removeAllListener();
    								dessin.construit(fig,couleurFig);
    						}
    					}
     
    				});
    				final JComboBox couleur = new JComboBox(new String[]{"rouge","vert","bleu","jaune"});
    				couleur.addItemListener(new ItemListener() {
    					public void itemStateChanged(ItemEvent e){	
     
    						switch (couleur.getSelectedIndex()){
    						case 0:
    							couleurFig = Color.red;
    							break;
    						case 1:
    							couleurFig = Color.green;
    							break;
    						case 2:
    							couleurFig = Color.blue;
    							break;
    						case 3:
    							couleurFig = Color.yellow;
    							break;
    						}
    						System.out.println(manip.isSelected());
    						System.out.println(dessin.figureSelection() != null);
    						if (manip.isSelected() && dessin.figureSelection() != null){ 		// permet de changer la couleur d'une figure lors d'une manipulation
    							dessin.figureSelection().changeCouleur(couleurFig);
    							dessin.repaint();
    							System.out.println("test");
    						}
    						if (fig != null && newFig.isSelected()){							// Annule la creation en cours pour la recommencer avec la nouvelle couleur
    							dessin.removeAllListener();
    							dessin.construit(fig,couleurFig);
    						}
    						if (trace.isSelected()){											// change la couleur pendant un trace a main levee
    							dessin.trace(couleurFig);
    						}
     
    					}
    				});
    Ce bout de code se trouve dans un constructeur.

    J'ai testé grâce à la méthode getItemListeners() les listeners qui sont créés, je l'ai appliqué sur ma variable couleur et grâce à un system.out.println j'ai obtenu ceci:

    Fenetre$1PanneauChoix$2@53ba3d
    javax.swing.plaf.basic.BasicComboPopup$Handler@e80a59
    Ce sont les 2 événements générés lorsque je change la couleur via le bouton. Je ne comprend pas pourquoi il y en a 2 et cela me gène pour la suite de mon programme.
    Si quelqu'un peut m'éclairer merci d'avance.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    C'est tout à fait normal, voir le lien:
    http://java.sun.com/docs/books/tutor...mlistener.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    J'ai réussi merci pour le lien, juste une question vraiment pour info, cette méthode à t'elle était changée dans une mise à jour de java récement?

    Car je suis en dut info et nous ne somme que quatre étudiants à avoir eu ce problème, dans notre polycopié de cours la méthode public void itemStateChanged(ItemEvent e) n'est pas fait comme dans le lien. On n'utilise jamais e.getStateChange() et chez les autres le programme marchait parfaitement sans alors que pour moi l'action correspondant au listener était effectuée 2 fois et je créais donc mes objets à chaque fois en double.

    Le professeur lui même ne savais pas pourquoi la méthode se comportais ainsi

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 276
    Par défaut
    Peut-être tout simplement que les autres ne s'en sont pas rendus compte, car selon ce que tu fais et si tu ne mets pas de traces, tu peux ne pas voir le double appel.

  5. #5
    Membre confirmé
    Inscrit en
    Août 2008
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 46
    Par défaut Explication du double Event
    bonjour à tous,

    Certes ce message est assez vieux. Mais mieux vaut tard que jamais...
    Le fait est que ce n'est pas une erreur si l'appel se fait deux fois.
    En effet, le listener ItemState Change écoute le changement d'état d'un item dans la liste( comme son nom l'indique ...je sais.... ).
    Quand on sélectionne un élément dans la liste , il y a deux éléments qui changent d'état......
    Celui qui était sélectionné ne l'est plus. ===> premier Appel
    Celui que l'on sélectionne passe à sélectionné ===> deuxième Appel

    Voila, voila...

    C'est pour cela qu'il est vivement conseillé de faire comme ceci quand on on veut récupérer le nouvel élément selectionné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange() == ItemEvent.SELECTED) {
                System.out.println("ELEMENT CHOISI");
            }    
        }

    JAVA Bien, merci

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

Discussions similaires

  1. [JCombobox] Problème sur listener
    Par Petzouille57 dans le forum Composants
    Réponses: 9
    Dernier message: 23/10/2008, 12h04
  2. Problème avec listener (générer avec VE)
    Par RR instinct dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 04/08/2006, 09h16
  3. Problème de script associé à un formulaire.
    Par lecail65 dans le forum Général JavaScript
    Réponses: 10
    Dernier message: 25/07/2006, 16h25
  4. [hibernate]Problème mapping classe association
    Par jsl1 dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/06/2006, 17h27
  5. problème de listener (oracle 9i)
    Par bouhn dans le forum Oracle
    Réponses: 1
    Dernier message: 23/01/2006, 14h59

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