JComboBox 선택 변경 리스너?


145

에서 선택을 할 때마다 이벤트를 시작하려고합니다 JComboBox.

내가 겪고있는 문제는 확실한 addSelectionListener()방법 이 없다는 것 입니다.

사용하려고 actionPerformed()했지만 절대로 실행되지 않습니다.

에 대한 모델을 재정의 JComboBox하지 않고 아이디어가 없습니다.

선택 변경에 대한 알림을 받으려면 어떻게해야 JComboBox합니까? **

편집 : 사과해야합니다. 내가 잘못 작동하는 하위 클래스를 사용하고있는 것으로 나타 JComboBox났지만 대답이 좋기 때문에 질문을 남겨 두겠습니다.


actionPerformed는 콤보 상자를로드 할 때 발생하지만 예상 시점을 선택하지는 않는다는 것을 알았으므로 훌륭한 질문입니다.
Brian Knoblauch

답변:


160

다음 과 같이 ActionListeners에 응답해야 합니다.

combo.addActionListener (new ActionListener () {
    public void actionPerformed(ActionEvent e) {
        doSomething();
    }
});

@ John Calsbeek도 올바르게 addItemListener()작동 한다고 지적합니다 . ItemEvents그러나 이전에 선택한 항목의 선택 취소와 새 항목의 선택을 위해 2를 얻을 수 있습니다 . 두 가지 이벤트 유형을 모두 사용하지 마십시오!


45
ItemListener를 선호합니다 (ItemEvent를 선택하여 선택 또는 선택 취소인지 확인하십시오). 선택이 변경되지 않은 경우에도 (예 : 사용자가 이미 선택한 항목을 클릭하는 경우) ActionListener를 시작할 수 있습니다. 이것은 당신이 원하는 것일 수도 아닐 수도 있습니다.
Dan Dyer

6
나는이 질문이 오래되었다는 것을 알고 있지만 보완하기 위해 addItem 메소드가 호출되면 ActionListener도 시작됩니다.
Gabriel Câmara

150

ItemListener구현의 코드 예

class ItemChangeListener implements ItemListener{
    @Override
    public void itemStateChanged(ItemEvent event) {
       if (event.getStateChange() == ItemEvent.SELECTED) {
          Object item = event.getItem();
          // do something with object
       }
    }       
}

이제 선택한 항목 만 가져옵니다.

그런 다음 JComboBox에 리스너를 추가하십시오.

addItemListener(new ItemChangeListener());

2
이 코드를 시도했는데 한 가지 문제는 이미 선택된 항목을 클릭하면 상태 변경이 없기 때문에 리스너가 트리거되지 않는다는 것입니다.
dmark

4
@ dmark 이것이 합리적이라고 생각합니다. 아무것도 변경되지 않았습니다. 어쩌면 그러한 시나리오에 의존하지 않도록 행동을 재구성해야 할 수도 있습니다.
Viacheslav

@dmark 감사합니다. 귀하의 의견은 ques를 해결하는 데 도움이되었습니다. :)
Tia


11

다음은 항목 선택 변경을위한 리스너를 추가하는 ComboBox를 작성하는 것입니다.

JComboBox comboBox = new JComboBox();

comboBox.setBounds(84, 45, 150, 20);
contentPane.add(comboBox);

JComboBox comboBox_1 = new JComboBox();
comboBox_1.setBounds(84, 97, 150, 20);
contentPane.add(comboBox_1);
comboBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        //Do Something
    }
});

3
이 답변은 이전 답변을 향상시킵니다 ...? 복제하지 마십시오! 관련 없음 : 구성 요소의 크기를 수동으로 지정하거나 배치하지 마십시오. 이는 적절한 LayoutManager의 독점적 인 작업입니다.
kleopatra

7

당신은 이것을 시도 할 수 있습니다

 int selectedIndex = myComboBox.getSelectedIndex();

-또는-

Object selectedObject = myComboBox.getSelectedItem();

-또는-

String selectedValue = myComboBox.getSelectedValue().toString();

이것이 다운 보트 된 이유를 알고 있지만 이러한 다운 보트를 재고해야한다고 생각합니다. actionPerformed 메소드에서 선택한 인덱스를 확인하면 이것이 작동 함을 알 수 있습니다. -1 이벤트를 제외하면 시작시 잘못된 발사를 제외 할 수 있습니다. 내 문제를 해결했다!
Brian Knoblauch

4

최근 에이 동일한 솔루션을 찾고 마지막으로 선택한 항목과 새로 선택한 항목에 특정 변수를 할당하지 않고 간단한 솔루션을 찾을 수있었습니다. 그리고이 질문은 매우 도움이되었지만 필요한 솔루션을 제공하지 못했습니다. 이것은 내 문제를 해결했으며, 그것이 당신과 다른 사람들을 해결하기를 바랍니다. 감사.

이전 또는 마지막 항목은 어떻게 받습니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.