2016-12-04 7 views
2

Java GUIフォームで2つのドロップダウンメニューを作成することになりました。最初のものを選択すると2番目のメニューの選択肢が決まります。 enter image description here2DのJComboBoxで、ActionListenerで他の項目をコントロールするもの

そして、私はComboBox1の中で私の選択を切り替えた後、それは次のようになります:

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); 
     }); 
    } 
enter image description here

はここに私のテスターのコードだ私はこのようなルックスを実現したいと考えて何

しかし、私はいつもremoveAllItems()とcomboBox2.getSelectedItems()でNullPointerExceptionを実行し、comboBox1で自分の選択を切り替えようとします。

デバッグしようとしましたが、プログラムがremoveAllItems()とcomboBox2.addItem()を実行したときに、comboBox2のactionListenerが呼び出されたようです。そして、私はこれをどう対処するのか分かりません

少し助けてください?

答えて

1

JComboBoxからすべてのアイテムを削除すると、そのActionListenerが起動し、nullの選択が返されるのは間違いありません。

考えられる解決策:

  1. すべての項目を削除する前にするJComboBoxからすべてのActionListenerにを削除し、その後行われたときにリスナーを交換してください。 - または -
  2. 返されたアイテムにtoString()を呼び出さないでください(NPEをスローしてnull参照で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); 
関連する問題