2012-04-26 5 views
0

두 개의 콤보 상자를 포함하는 gui 클래스와 두 개의 콤보 상자를 수신하는 수신기 클래스가 있습니다. 이 소프트웨어는 피자에 관한 것이고 콤보 상자는 피자 타입과 수량을 선택하는 것이고 관련 코드를 게시 할 것입니다.ActionEvent에서 여러 콤보 박스를 구별하는 방법

(gui class) 
private Listener listen = new Listener(); 
private JComboBox chooseItem = new JComboBox(); 
private JComboBox quantity = new JComboBox(); 
private String[] selection = {"Choose a Pizza","Margherita", "Pepperoni", "Four Seasons", "Chips", "Garlic Bread", "Potato Wedges", "Cocacola", "Orange Juice", "Lemonade"}; 
private String[] qSelection = {"0","1","2","3","4","5","6","7","8","9","10"}; 

private void comboBoxs() { 
choosePizza = new JComboBox(selection); 
    chooseItem.setSelectedIndex(0); 
    panel.add(choosePizza); 
    choosPizza.addActionListener(listener); 

quantity = new JComboBox(qSelection); 
    quantity.setSelectedIndex(0); 
    panel.add(quantity); 
    quantity.addActionListener(listener); 
} 

청취자 클래스에서 나는 갇혀있어 아직 해결책을 찾을 수 없었다. ActionListener를 사용해야하지만 두 콤보 상자를 구별하는 방법이 확실하지 않습니다.

(listener class) 

public void actionPerformed(ActionEvent event) { 

    if (actionCommand.equals("Confirm")) { 
      String q = new String(); 
      String d = new String(); 
      d = description; 
      q = quantity; 
    } 

else { 
     JComboBox cbq = (JComboBox)event.getSource(); 
     String itemNumber = (String)cbq.getSelectedItem(); 
     getQuantity(itemNumber); 

     JComboBox cb = (JComboBox)event.getSource(); 
     String name = (String)cb.getSelectedItem(); 
     getItemName(name); 
    } 
} 

    public String getItemName(String name) { 
     description = new String(); 
     description = name; 
     return name; 
    } 

    public String getQuantity(String itemNumber){ 
     quantity = new String(); 
     quantity = itemNumber; 
     return itemNumber; 
} 

그래서, 요약 : 나는 두 JComboBox에의 I는 "양"의 "설명"문자열과 선택 수량 JComboBox의 항목에서 선택된 chooseItem JComboBox에 항목을 저장할 수 있기를 원하는 문자열 값을 선택하면 .

현재 selectItem JComboBox에서 선택한 항목이 두 값으로 나타나고 수량이 전혀 표시되지 않습니다. (이것은 실제로 마지막으로 사용 된 상자가 설명 문자열에 나타나고 수량이 null을 가리키는 것과 같이 진행됩니다.)

온라인으로 찾을 수 있었던 모든 예제에는 하나의 JComboBox가있는 ActionListener 만 포함되어 있습니다. 몇 시간 동안 작동하도록 노력했지만 행운이 없었습니다. 완전히 갇혀 있습니다.

+0

* "관련 코드를 게시 할 것입니다."* 더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

답변

3

각 콤보 상자에 별도의 수신기를 연결하여 수신하는 이벤트가 특정 콤보 박스에서 비롯된 것임을 청취자가 알 수 있도록합니다.

다른 해결책은 청취자에게 클래스에 노출 시키거나 (청취자의 생성자에 매개 변수로 매개 변수를 전달하여) 해당 콤보 박스에 대한 액세스를 제공하고 이벤트의 소스를 해당 콤보 박스와 비교하는 것입니다. 어떤 콤보 박스가 그 사건을 일으켰는지 결정하십시오.

필자는 개인적으로 이러한 청각 장애를 피하기 위해 청취자와 구성 요소 간의 일대일 매핑을 선호합니다.

작은 측면 참고 : 당신이

  • public void getQuantity(String itemNumber)를 게시 한 코드에서 몇 가지 이상한 일이 있습니다 : 당신이 실제로 뭔가를 반환 사실과 void 충돌 -> 리스너에서
  • 를 컴파일되지 않습니다 당신은 그 출처에 대해 두 번 이벤트를 요청하고 그것을 두 개의 다른 콤보 박스에 던지십시오.

    물론
    if(e.getSource() == gui.chooseItem){ 
    
    } 
    else if(e.getSource() == gui.quantity){ 
    
    } 
    

    당신은 당신의 GUI의 참조를 준 의미 : 이것은 당신이 사용하여 소스의 출처를 테스트 할 수 있습니다 컨트롤러 클래스에서

    JComboBox cbq = (JComboBox)event.getSource(); 
    String itemNumber = (String)cbq.getSelectedItem(); 
    getQuantity(itemNumber); 
    
    //this returns the same combobox as above, so probably incorrect behavior 
    JComboBox cb = (JComboBox)event.getSource(); 
    String name = (String)cb.getSelectedItem(); 
    getItemName(name); 
    
+0

getQuantity 메서드 오류는 질문을 쓰는 실수 유형이었습니다. 나는 바로 잡을 것입니다. 분리 된 수신기를 연결하는 것은 내가 찾고있는 것입니다. 그러나 이걸 어떻게 달성 할 수 있는지 확실하지 않습니다 ... – DanMc

+0

당신은 지금 'choosPizza.addActionListener (listener)'와'quantity.addActionListener (listener)'를 가지고 있습니다. 여기에 별도의 청취자 두 명을 추가하십시오 – Robin

+0

감사합니다. 도움이 된 경이로움 :) – DanMc

2

잘못된 물론입니다 수신기 클래스를 선택하고 quantitychooseItem을 공용으로 설정하십시오.

또한 actionCommand을 사용할 수 있습니다 내가 더 깨끗 생각 : 리스너 클래스에서

chooseItem.setActionCommand("itemCB"); 
quantity.setActionCommand("quantityCB"); 

: GUI에

같은 경우

if(e.getActionCommand().equals("itemCB")){ 
} 
else if(e.getActionCommand().equals("quantityCB")){ 
} 
+0

건배, 이것은 나를 많이 도왔어요! – DanMc

+0

음, 오신 것을 환영합니다! –

1

I 일반적으로 각 콤보 박스에 대해 익명의 ActionListener를 생성하면됩니다. 예 :

String foo; 
String bar; 

JComboBox fooBox = new JComboBox(); 
JComboBox barBox = new JComboBox(); 

fooBox.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     foo = "Updated"; 
    } 
}); 

barBox.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     bar = "Updated"; 
    } 
}); 

기타 등등.

+0

내가 발견 한 문제점은 이미 리스너 클래스의 인스턴스가 GUI에 있고 리스너 클래스가 무한 루프를 생성하기 때문에 리스너 클래스에 gui 인스턴스를 만들 수 없다는 것입니다. 즉, 리스너 클래스에 액션 리스너를 추가하고 리스너 클래스에 매개 변수로 'chooseItem.addActionListener (listener);를 지정해야합니다. 그런 다음 리스너 클래스에서 액션 리스너를 프리폼합니다. 한 클래스에서이 모든 것을 어떻게 할 수 있는지는 아직 알지 못합니다. 그래도 gui 인스턴스를 생성하지 않고 리스너 클래스에 정보를 전달합니다. 나는 거기에서 의미가 없었을지도 모른다 – DanMc

+1

미안, 나는 당신이 거기에서 무엇을 말하고 있는지에 관해 알지 않는다. 익명 클래스 외부에서 속성에 액세스하는 것에 대해 걱정이된다면 익명 클래스에서 사용할 수있는 속성을 모두 알아야합니다. – gerow

+0

나는 혼란을 해결할 수 있었고, 답은 내가해야만하는 것을 해결하는 방식으로 내 코드에 의문을 제기했다. 고마워. :) – DanMc

관련 문제