2008-09-12 18 views
126

Estoy tratando de obtener un evento para disparar cada vez que se realiza una elección desde un JComboBox.Selección de JComboBox ¿Escucha de cambio?

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

He intentado usar actionPerformed() pero nunca se dispara.

Corto de anular el modelo para el JComboBox Me quedo sin ideas.

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

Editar: Tengo que disculparme resulta que yo estaba usando una subclase mal comportamiento de JComboBox, pero voy a dejar la cuestión hasta ya que su respuesta es buena. Comience a votar abajo. :)

+0

Excelente pregunta, ya me he dado cuenta de que actionPerformed incendios sobre la carga de un cuadro combinado, pero no en la selección cuando uno lo esperaría. –

Respuesta

129

Se debe responder a ActionListeners, así:

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

@John Calsbeek señala con razón que addItemListener() va a funcionar, también. Sin embargo, puede obtener 2 ItemEvents, uno para anular la selección del artículo seleccionado previamente, y otro para la selección del nuevo artículo. ¡Simplemente no use ambos tipos de eventos!

+42

Preferiría ItemListener (solo asegúrese de verificar ItemEvent para ver si es una selección o anulación de selección incluso).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. –

+4

Sé que esta pregunta es antigua, pero para complementar, ActionListener también se activa si se llama al método addItem. –

21

Probaría el método itemStateChanged() de la interfaz ItemListener si falla la solución de jodonnell.

7

Puede probar estos

int selectedIndex = myComboBox.getSelectedIndex(); 

-o-

Object selectedObject = myComboBox.getSelectedItem(); 

-o-

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

Sé por qué esto fue votado negativamente, pero creo que esos votos abajo deberían reconsiderarse ... Si revisas el índice seleccionado en el método actionPerformed, verás que esto funciona. Dispara, y excluyendo -1 eventos le permitirá excluir la falsa cocción al inicio. ¡Resolvió mi problema! –

132

ejemplo Código de ItemListener aplicació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 vamos a obtener solo el elemento seleccionado.

Entonces sólo tiene que añadir a su oyente JComboBox

addItemListener(new ItemChangeListener()); 
+1

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

+3

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

+0

@dmark Gracias, su comentario me ayudó a resolver una pregunta :) – Tia

4

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

How do I get the previous or last item?

7

Aquí está creando un ComboBox adición de 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 
     } 
    }); 
} 
+2

¿esta respuesta mejora las respuestas anteriores en ese ...? Por favor, no duplicar! Sin relación: nunca haga ningún tamaño/ubicación manual de los componentes, esa es la tarea exclusiva de un LayoutManager adecuado – kleopatra

Cuestiones relacionadas