2016-12-04 1 views
2

자바 GUI 폼에서 두 번째 드롭 다운 메뉴를 만들 때 첫 번째 메뉴를 선택하면 두 번째 메뉴의 선택 항목이 결정됩니다. enter image description here2D JComboBox 중 ActionListener를 사용하여 다른 항목을 제어하는 ​​것

내가 콤보 상자에서 내 선택을 전환 한 후, 그것은 다음과 같습니다 :

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

가 여기 내 테스터 코드의이 같은 모습을 달성하기 위해 희망 무엇

하지만 comboBox1에서 내 선택 항목을 전환하려고 할 때마다 항상 removeAllItems() 및 comboBox2.getSelectedItems()에서 NullPointerException이 발생합니다.

디버그하려고했지만 프로그램이 removeAllItems() 및 comboBox2.addItem()을 수행 할 때마다 comboBox2의 actionListener가 호출 되었기 때문입니다. 그리고 이걸 어떻게 처리 해야할지 모르겠다

약간의 도움이 필요하십니까?

답변

1

JComboBox에서 모든 항목을 제거하면 해당 ActionListener가 실행되고 null 선택을 반환합니다.

가능한 해결책 :

  1. 모두 제거 모든 항목을 제거하기 전에 JComboBox에에서 ActionListener를 한 다음 완료되면 청취자를 교체합니다. - 또는 -
  2. 반환 된 항목에 대해 toString()을 호출하면 안됩니다 (즉, NPE를 throw하여 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); 

관련 문제