2016-12-04 1 views
2

Je suis bloqué sur la création de deux menus déroulants en Java GUI Form que la sélection du premier déterminera les choix dans le second menu.2D JComboBox que l'on contrôle les éléments de l'autre avec ActionListener

Ce que je souhaite réaliser ressemble à ceci: enter image description here

Et après avoir changé mon choix comboBox1, il ressemble à ceci: enter image description here

Voici mon code testeur:

public static void main(String[] args) { 
     Tester tester = new Tester(); 
     String[] flower = {"Rose", "Tulip"}; 
     String[] color1 = {"Yellow", "Blue", "Red"}; 
     String[] color2 = {"Purple", "White", "Green"}; 

     for (String flowerPicked : flower) { 
      tester.comboBox1.addItem(flowerPicked); 
     } 
     tester.comboBox1.addActionListener(e -> { 
      // remove previous items in comboBox2 everytime a new item in box1 is selcted 
      tester.comboBox2.removeAllItems(); 
      String flowerChoice = tester.comboBox1.getSelectedItem().toString(); 
      if (flowerChoice.equalsIgnoreCase("Rose")) 
       for (String colorPicked : color1) { 
        tester.comboBox2.addItem(colorPicked); 
       } 
      else 
       for (String type : color2) { 
        tester.comboBox2.addItem(type); 
       } 
     });  
     tester.comboBox2.addActionListener(e -> { 
      String colorChoice = tester.comboBox2.getSelectedItem().toString(); 
      String flowerChoice = tester.comboBox1.getSelectedItem().toString(); 
      system.out.println(colorChoice + " " + flowerChoice); 
     }); 
    } 

Mais je cours toujours dans NullPointerException à removeAllItems() et comboBox2.getSelectedItems() chaque fois que j'essaie de changer mon choix dans comboBox1.

J'ai essayé de le déboguer, mais il semble que c'est parce que actionListener de comboBox2 a été appelé chaque fois que le programme a fait removeAllItems() et comboBox2.addItem(). Et je ne sais pas comment gérer cela

Un petit coup de pouce?

Répondre

1

Vous avez raison de supprimer tous les éléments de la JComboBox, ce qui déclenche son ActionListener et renvoie la sélection de null.

solutions possibles:

  1. Retirez tous les ActionListeners de la JComboBox avant de retirer tous les éléments, puis remplacer les auditeurs lorsque vous avez terminé. - ou -
  2. N'appelez pas toString() sur l'élément retourné (c'est ce qui jette le NPE - appelant toString() sur une référence null) mais plutôt cast l'élément sélectionné retourné comme une chaîne. Une distribution ne lancera pas le NPE.

l'exemple de la première:

ActionListener[] actionListeners = tester.comboBox2.getActionListeners(); 
for (ActionListener actionListener : actionListeners) { 
    tester.comboBox2.removeActionListener(actionListener); 
} 
tester.comboBox2.removeAllItems(); 
String flowerChoice = tester.comboBox1.getSelectedItem().toString(); 
if (flowerChoice.equalsIgnoreCase("Rose")) 
    for (String colorPicked : color1) { 
     tester.comboBox2.addItem(colorPicked); 
    } 
else { 
    for (String type : color2) { 
     tester.comboBox2.addItem(type); 
    } 
} 
for (ActionListener actionListener : actionListeners) { 
    tester.comboBox2.addActionListener(actionListener); 
} 

l'exemple de la seconde:

String colorChoice = (String) tester.comboBox2.getSelectedItem(); 
String flowerChoice = (String) tester.comboBox1.getSelectedItem(); 
System.out.println(colorChoice + " " + flowerChoice);