Écoute de changement de sélection JComboBox?

145

J'essaie de déclencher un événement chaque fois qu'un choix est fait à partir d'un fichier JComboBox.

Le problème que j'ai, c'est qu'il n'y a pas de addSelectionListener()méthode évidente .

J'ai essayé de l'utiliser actionPerformed(), mais il ne se déclenche jamais.

À moins de remplacer le modèle pour le JComboBox, je suis à court d'idées.

Comment être informé d'un changement de sélection sur un JComboBox? **

Edit: Je dois m'excuser. Il s'avère que j'utilisais une sous-classe de JComboBox, mais je laisse la question en suspens car votre réponse est bonne.

Allain Lalonde
la source
Excellente question, car j'ai remarqué que actionPerformed se déclenche lors du chargement d'une combobox, mais PAS lors de la sélection du moment auquel on l'attend.
Brian Knoblauch

Réponses:

160

Il doit répondre à ActionListeners , comme ceci:

combo.addActionListener (new ActionListener () {
    public void actionPerformed(ActionEvent e) {
        doSomething();
    }
});

@John Calsbeek souligne à juste titre que addItemListener()cela fonctionnera également. Vous pouvez cependant en obtenir 2 ItemEvents, un pour la désélection de l'élément précédemment sélectionné et un autre pour la sélection du nouvel élément. N'utilisez pas les deux types d'événements!

Jodonnell
la source
45
Je préférerais ItemListener (assurez-vous simplement de vérifier le ItemEvent pour voir s'il s'agit d'une sélection ou même d'une désélection). L'ActionListener peut être déclenché même si la sélection n'a pas changé (c'est-à-dire si l'utilisateur clique sur l'élément déjà sélectionné). Cela peut ou non être ce que vous voulez.
Dan Dyer le
6
Je sais que cette question est ancienne, mais pour compléter, ActionListener est également déclenché si la méthode addItem est appelée.
Gabriel Câmara
150

Exemple de code d' ItemListenerimplémentation

class ItemChangeListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // do something with object
       }
    }       
}

Maintenant, nous n'obtiendrons que l'élément sélectionné.

Ensuite, ajoutez simplement un auditeur à votre JComboBox

addItemListener(new ItemChangeListener());
Viacheslav
la source
2
J'ai essayé ce code, un problème est que lorsque je clique sur l'élément qui est déjà sélectionné, l'écouteur ne sera pas déclenché, car il n'y a pas de changement d'état.
dmark
4
@dmark Je pense que c'est raisonnable, car rien n'a été changé. Vous devriez peut-être réorganiser vos actions d'une manière ou d'une autre pour ne pas dépendre d'un tel scénario.
Viacheslav
@dmark Merci, votre commentaire m'a aidé à résoudre une question :)
Tia
22

J'essaierais la itemStateChanged()méthode de l' ItemListenerinterface si la solution de jodonnell échoue.

John Calsbeek
la source
11

Voici la création d'un ComboBox en ajoutant un écouteur pour le changement de sélection d'élément:

JComboBox comboBox = new JComboBox();

comboBox.setBounds(84, 45, 150, 20);
contentPane.add(comboBox);

JComboBox comboBox_1 = new JComboBox();
comboBox_1.setBounds(84, 97, 150, 20);
contentPane.add(comboBox_1);
comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        //Do Something
    }
});
Ahuramazda
la source
3
cette réponse améliore les réponses précédentes en ce que ...? Veuillez ne pas dupliquer! Sans rapport: ne faites jamais de dimensionnement / localisation manuel des composants, c'est la tâche exclusive d'un LayoutManager approprié
kleopatra
7

Vous pouvez essayer ces

 int selectedIndex = myComboBox.getSelectedIndex();

-ou-

Object selectedObject = myComboBox.getSelectedItem();

-ou-

String selectedValue = myComboBox.getSelectedValue().toString();
JavaKeith
la source
Je sais pourquoi cela a été déclassé, mais je crois que ces votes négatifs devraient être reconsidérés ... Si vous vérifiez l'index sélectionné dans la méthode actionPerformed, vous constaterez que cela fonctionne. Il déclenche et exclure les événements -1 vous permettra d'exclure le faux tir au démarrage. J'ai résolu mon problème!
Brian Knoblauch
4

Je cherchais récemment cette même solution et j'ai réussi à en trouver une simple sans attribuer de variables spécifiques pour le dernier élément sélectionné et le nouvel élément sélectionné. Et cette question, bien que très utile, n'a pas fourni la solution dont j'avais besoin. Cela a résolu mon problème, j'espère que cela résoudra le vôtre et d'autres. Merci.

Comment obtenir le précédent ou le dernier article?

Craig Wayne
la source