JComboBox Selection Change Listener?


145

Estoy tratando de hacer que un evento se active siempre que se haga una elección de a JComboBox.

El problema que tengo es que no hay un addSelectionListener()método obvio .

He tratado de usar actionPerformed(), pero nunca se dispara.

A falta de anular el modelo para el JComboBox, estoy sin ideas.

¿Cómo me notifican un cambio de selección en un JComboBox**?

Editar: tengo que disculparme. Resulta que estaba usando una subclase de mal comportamiento JComboBox, pero dejaré la pregunta ya que su respuesta es buena.


Excelente pregunta, ya que he notado que actionPerformed se dispara al cargar un cuadro combinado, pero NO al seleccionar cuándo se esperaría.
Brian Knoblauch

Respuestas:


160

Debería responder a ActionListeners , así:

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

@John Calsbeek señala acertadamente que addItemListener()también funcionará. Sin ItemEventsembargo, puede obtener 2 , uno para la deselección del elemento seleccionado previamente y otro para la selección del nuevo elemento. ¡Simplemente no use ambos tipos de eventos!


45
Prefiero ItemListener (solo asegúrate de verificar el ItemEvent para ver si es una selección o incluso una deselección). El ActionListener puede activarse incluso si la selección no ha cambiado (es decir, si el usuario hace clic en el elemento ya seleccionado). Esto puede o no ser lo que quieres.
Dan Dyer el

66
Sé que esta pregunta es antigua, pero para complementar, ActionListener también se activa si se llama al método addItem.
Gabriel Câmara

150

Código de ejemplo de ItemListenerimplementación

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

Ahora solo obtendremos el artículo seleccionado.

Luego solo agrega oyente a tu JComboBox

addItemListener(new ItemChangeListener());

2
Probé este código, un problema es que cuando hago clic en el elemento que ya está seleccionado, el escucha no se activará, porque no hay cambio de estado.
dmark

44
@dmark Creo que esto es razonable, porque nada ha cambiado. Tal vez debería reorganizar sus acciones de alguna manera para no depender de tal escenario.
Viacheslav

@dmark Gracias, tu comentario me ayudó a resolver un problema :)
Tia


11

Aquí está creando un ComboBox agregando un oyente para el cambio de selección de elementos:

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
esta respuesta mejora las respuestas anteriores en que ...? ¡Por favor no dupliques! Sin relación: nunca haga ningún tamaño / localización manual de componentes, esa es la tarea exclusiva de un LayoutManager adecuado
kleopatra

7

Puedes probar estos

 int selectedIndex = myComboBox.getSelectedIndex();

-o-

Object selectedObject = myComboBox.getSelectedItem();

-o-

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

Sé por qué esto se votó negativamente, pero creo que esos votos negativos deberían reconsiderarse ... Si marca el índice seleccionado en el método actionPerformed, verá que funciona. Se dispara, y excluir los eventos -1 le permitirá excluir los disparos falsos al inicio. Resuelto mi problema!
Brian Knoblauch

4

Recientemente estuve buscando esta misma solución y logré encontrar una simple sin asignar variables específicas para el último elemento seleccionado y el nuevo elemento seleccionado. Y esta pregunta, aunque muy útil, no proporcionó la solución que necesitaba. Esto resolvió mi problema, espero que resuelva el tuyo y el de los demás. Gracias.

¿Cómo obtengo el artículo anterior o el último?

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.