37 votes

Pourquoi itemStateChanged sur JComboBox est appelé deux fois lorsqu'il est modifié ?

J'utilise une JComboBox avec un ItemListener sur celle-ci. Lorsque la valeur est modifiée, l'événement itemStateChanged est appelé deux fois. Au premier appel, l'événement ItemEvent montre l'élément sélectionné à l'origine. Au deuxième appel, il affiche l'élément qui vient d'être sélectionné par l'utilisateur. Voici un peu de code de test :

public Tester(){

    JComboBox box = new JComboBox();
    box.addItem("One");
    box.addItem("Two");
    box.addItem("Three");
    box.addItem("Four");

    box.addItemListener(new ItemListener(){
        public void itemStateChanged(ItemEvent e){
            System.out.println(e.getItem());
        }
    });

    JFrame frame = new JFrame();
    frame.getContentPane().add(box);
    frame.pack();
    frame.setVisible(true);
}

Ainsi, lorsque j'ai modifié la boîte combo une fois de "Un" à "Trois", la console s'affiche :

One
Three

Y a-t-il un moyen de savoir, en utilisant l'ItemEvent, qu'il s'agit du deuxième élément (c'est-à-dire l'élément sélectionné par l'utilisateur) ? Et si quelqu'un peut expliquer pourquoi il est appelé deux fois, ce serait bien aussi !

Merci

31voto

kgiannakakis Points 62727

Jetez un coup d'œil à cette source :

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Tester {

    public Tester(){

        JComboBox box = new JComboBox();
        box.addItem("One");
        box.addItem("Two");
        box.addItem("Three");
        box.addItem("Four");

        box.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                System.out.println(e.getItem() + " " + e.getStateChange() );
            }
        });

        JFrame frame = new JFrame();
        frame.getContentPane().add(box);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String [] args) {
        Tester tester = new Tester();
    }
}

Utilisez la fonction getStateChange pour déterminer si un élément est sélectionné ou désélectionné.

2 votes

Il est généralement recommandé d'ignorer l'événement et de chercher à savoir quel est l'état réel.

20voto

VonC Points 414372

Selon cette filetage ,

Il se déclenche lorsque vous quittez un résultat et est rappelé lorsqu'il est réglé sur un autre résultat.

Ne pas écouter pour itemStateChanged. Utilisez plutôt un ActionListener, qui permet de gérer les événements du combo.
Vous avez besoin d'un ItemStateListener si vous devez gérer séparément la désélection/sélection en fonction de l'élément concerné.

Changer l'état de l'élément dans itemStateChanged entraîne le déclenchement de itemStateChanged... c'est ce qu'on appelle la "réentrance".

0 votes

Votre réponse m'a vraiment aidé ! Merci beaucoup !

0 votes

Vous pouvez également noter que si : Nous faisons la méthode removeAll() d'une ComboBox, le résultat est qu'elle appellera aussi deux fois.....

2 votes

Notez que si l'utilisateur sélectionne la même valeur que celle précédemment sélectionnée, un ActionListener sera quand même déclenchée, ce qui n'est pas le cas avec une option ItemListener .

15voto

qizer Points 67

Je voulais obtenir la chaîne d'index après avoir sélectionné et défini dans la combobox.

        comboBox1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    comboBox1ItemStateChanged();
                }
            }
        });

7voto

Vous pouvez le faire comme ça :

import java.awt.event.*;

jComboBox1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Hello");
        }
    });

0 votes

Est-ce que la fonction actionperformed() est meilleure que la fonction itemStateChanged() ?

6voto

21stking Points 55
private void dropDown_nameItemStateChanged(java.awt.event.ItemEvent evt) {                                                 

    if(evt.getStateChange() == ItemEvent.SELECTED)
    {
        String item = (String) evt.getItem();
        System.out.println(item);
    }

}

Bonne chance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X