2009-08-19 14 views
9

¿Puede alguien explicarme por qué este código se imprime en la consola cuando mueve el mouse sobre la casilla de verificación? ¿Cuál es el evento de "cambio" que tiene lugar?JCheckbox change listener recibe una notificación de mouse sobre eventos

import javax.swing.JCheckBox; 
import javax.swing.JFrame; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 


public class Test { 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 
     JCheckBox c = new JCheckBox("Print HELLO"); 
     c.addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.out.println("HELLO"); 
      } 
     }); 
     f.getContentPane().add(c); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

NOTA: No consumo un oyente de action porque en mi programa que quiero ser capaz de hacer:

checkBox.setSelected(boolean) 

y tener mi oyente notificado, que no se puede hacer con una oyente de acción. Entonces, ¿hay alguna manera de desactivar este evento "mouse over" u otra forma en que pueda implementar mi escucha?

+0

Impar, pensé que usar 'setSelected' activaría los oyentes de cambio. Debo estar pensando en otra cosa. – jeef3

+0

Si ejecuto eso en Java 5 en Mac OSX, no obtengo el mouse sobre los eventos. – banjollity

+0

@ jeef3: setSelected DOES activa eventos de cambio. Es por eso que lo estoy usando. La cosa es que los eventos de cambio también se desencadenan con el mouse sobre los movimientos :) –

Respuesta

28

Obtiene eventos al pasar el mouse sobre como el enfoque ganado/perdido representa un cambio en el estado del componente.

En lugar de eso, podría usar un ItemListener que le dará ItemEvents.

El objeto que implementa la interfaz ItemListener obtiene este ItemEvent cuando se produce el evento. El oyente se ahorra los detalles del procesamiento de los movimientos individuales del mouse y clics del mouse, y en su lugar puede procesar un evento "significativo" (semántico) como "elemento seleccionado" o "elemento no seleccionado".

Puede agregarlo a su casilla de verificación con el método addItemListener() en la clase AbstractButton. Basta con sustituir addChangeListener con esto:

c.addItemListener(new ItemListener() { 

    public void itemStateChanged(ItemEvent e) { 
     System.err.println(e.getStateChange()); 
    } 
}); 
+0

Gracias esto funciona. Siempre pensé que los detectores de elementos se aplicaban solo a la lista de componentes similares. :) –

+1

No hay problema. En realidad, es ListSelectionListener que se utilizan para las listas. Existe una interfaz diferente para las listas y los botones porque las selecciones de la lista deben admitir seleccionar un rango de celdas que requiera un tipo de evento diferente. – Aaron

1

El estado de la casilla de verificación (incluso solo el modelo de casilla de verificación) cambia dependiendo de si tiene el mouse encima o no. Por lo tanto, se debe esperar un evento de cambio de estado.

Por lo tanto, simplemente vuelva a consultar para ver en qué estado está la casilla de verificación y actualice en consecuencia. Es mejor ir directamente al modelo, en lugar de utilizar la interfaz del componente "hinchado".

6

Uso c.setRolloverEnabled(false) `y no obtendrá ningún caso por los movimientos del ratón.

Cuestiones relacionadas