2016-12-04 53 views
2

我被困在使Java GUI中的兩個下拉菜單形式,選擇第一個將決定在第二個菜單中的選擇。2D JComboBox,其中一個控件與ActionListener的其他項目

希望達成什麼看起來像這樣: enter image description here

我打開我的選擇在comboBox1後,它看起來像這樣: enter image description here

這裏是我的測試代碼:

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); 
     }); 
    } 

但我每次嘗試在comboBox1中切換我的選擇時,都會在removeAllItems()和comboBox2.getSelectedItems()中遇到NullPointerException。

我試圖調試它,但它似乎是因爲comboBox2的actionListener在程序執行removeAllItems()和comboBox2.addItem()時被調用。我不知道如何處理這個問題

有一點幫助嗎?

回答

1

你是對的,從JComboBox中刪除所有項目導致其ActionListener觸發並返回null的選擇。

可能的解決方案:

  1. 取下JComboBox中所有的ActionListeners刪除所有項目之前,然後在完成時更換聽衆。 - 或 -
  2. 不要在返回的項目上調用toString()(這就是拋出NPE的函數 - 在空引用上調用toString()),而是將返回的所選項目轉換爲字符串。演員不會拋出NPE。第一

實施例:

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); 
} 

第二實施例:

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