JComboBox Selection Change Listener?


145

Estou tentando fazer com que um evento seja acionado sempre que uma escolha é feita a JComboBox.

O problema que estou tendo é que não existe um addSelectionListener()método óbvio .

Eu tentei usar actionPerformed(), mas nunca dispara.

Com exceção de substituir o modelo JComboBox, estou sem ideias.

Como sou notificado de uma alteração de seleção em um JComboBox**?

Edit: Eu tenho que me desculpar. Acontece que eu estava usando uma subclasse de comportamento inadequado JComboBox, mas deixarei a pergunta em aberto, já que sua resposta é boa.


Excelente pergunta, já que eu notei que o actionPerformed é acionado ao carregar uma caixa de combinação, mas NÃO para selecionar quando se espera.
22413 Brian Knoblauch

Respostas:


160

Ele deve responder aos ActionListeners , assim:

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

@ John Calsbeek ressalta, com razão, que addItemListener()também funcionará. Você pode obter 2 ItemEvents, no entanto, um para desmarcar o item selecionado anteriormente e outro para a seleção do novo item. Só não use os dois tipos de evento!


45
Eu preferiria o ItemListener (apenas verifique o ItemEvent para ver se é uma seleção ou desmarcação). O ActionListener pode ser acionado mesmo que a seleção não tenha sido alterada (ou seja, se o usuário clicar no item já selecionado). Isso pode ou não ser o que você deseja.
Dan Dyer

6
Eu sei que essa pergunta é antiga, mas para complementar, o ActionListener também é acionado se o método addItem for chamado.
Gabriel Câmara

150

Exemplo de código de ItemListenerimplementação

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

Agora obteremos apenas o item selecionado.

Em seguida, basta adicionar o ouvinte ao seu JComboBox

addItemListener(new ItemChangeListener());

2
Eu tentei esse código, um problema é que, quando clico no item que já está selecionado, o ouvinte não será acionado, porque não há alteração de estado.
DMark

4
@mark Acho que isso é razoável, porque nada foi alterado. Talvez você deva reorganizar suas ações de alguma forma para não depender desse cenário.
Viacheslav 23/02

@dmark Obrigado, seu comentário me ajudou a resolver um ques :)
Tia


11

Aqui está criando uma ComboBox adicionando um ouvinte para alteração na seleção de itens:

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
essas respostas aprimoram as respostas anteriores em que ...? Por favor, não duplique! Alheios: nunca nunca fazer qualquer dimensionamento Manual / localização de componentes, que é a tarefa exclusiva de uma LayoutManager adequado
kleopatra

7

Você pode tentar estes

 int selectedIndex = myComboBox.getSelectedIndex();

-ou-

Object selectedObject = myComboBox.getSelectedItem();

-ou-

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

Sei por que isso foi rebaixado, mas acredito que esses rebaixamentos devem ser reconsiderados ... Se você verificar o índice selecionado no método actionPerformed, verá que isso funciona. Ele dispara, e a exclusão de -1 eventos permitirá que você exclua o disparo falso no início. Resolvido meu problema!
22413 Brian Knoblauch

4

Recentemente, eu estava procurando por essa mesma solução e consegui encontrar uma solução simples sem atribuir variáveis ​​específicas para o último item selecionado e o novo item selecionado. E essa pergunta, embora muito útil, não forneceu a solução que eu precisava. Isso resolveu meu problema, espero que resolva o seu e os outros. Obrigado.

Como obtenho o item anterior ou o último?

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.