2011-03-10 12 views
13

Quiero reemplazar un JButton por un JLabel y quiero que mi código realice alguna acción cuando se hace clic en JLabel.¿Puedo agregar un detector de acciones a un JLabel?

Cuando tuve el JButton que utiliza el oyente de action para manejar los clics en el botón:

myButton.addActionListener(new clicksListener(arg1,this)) 

cuando reemplacé myButton por myLabel me dieron el mensaje de error en el Eclipse:

El método addActionListener (ChipsListener) es indefinido para el tipo JLabel

Pero sí sé que debería ser posible adjuntar un controlador de clic a JLabel. ¿Alguien sabe cómo se puede hacer?

Respuesta

23

Agregue MouseListener al JLabel.

Dado que JLabel es un Component, usted puede agregar MouseListener s a él. Use esa interfaz y escriba el evento mouseClicked en su MouseListener para manejar el clic.

+0

No consigo su lógica aquí. ¿Quiere decir que todo 'Componente' puede agregar' MouseListener' (cualquier referencia)? ¿Y qué tipo de widget puede agregar 'ActionListener'? – Tony

+2

Sí, el método 'addMouseListener()' se define en 'Component'. Esta clase genera objetos 'MouseEvent' cuando un mouse entra o sale del componente, o cuando se presiona un botón dentro del componente o se libera después de haber sido presionado dentro del componente. Cualquier clase que amplíe 'Component' puede tener cualquier número de referencias' MouseListener' que escuchen estos eventos. 'addActionListener()' se define en 'AbstractButton' y genera objetos' ActionEvent' cuando se presiona el botón. Como 'JLabel' no extiende' AbstractButton', no genera objetos 'ActionEvent'. Prueba 'JButton'. –

11

Un enfoque más fácil es simplemente utilizar un JButton ya que ya es compatible con esta funcionalidad mediante el uso de un ActionListener.

Puede hacer que el JButton parezca un JLabel mediante el uso de:

button.setBorderPainted(false); 

Este enfoque es para cuando se desea manejar un clic de ratón, ya que un ActionEvent se garantiza que se genera, mientras que como evento mouseClicked al utilizar Es posible que MouseListener no se genere en todas las situaciones, lo que puede confundir al usuario.

+0

Me temo que es más complicado, vea http://stackoverflow.com/questions/3025320/draw-a-jbutton-to-look-like-a-jlabel-or-at-least-without-the-button-edge – xmedeko

+0

¿Cuáles son las situaciones en las que no se generará el evento mouseClicked? – Buffalo

+1

@Buffalo, un evento MouseClicked se genera cuando se generan un evento mousePressed y mouseReleased en el mismo punto. Entonces, si el usuario mueve el mouse por un píxel entre estos dos eventos, no obtiene el mouse. – camickr

7
/*add a mouselistener instead and listen to mouse clicks*/ 
    jlable.addMouseListener(new MouseAdapter() { 
       @Override 
       public void mouseClicked(MouseEvent e) { 
        System.out.println("Yay you clicked me"); 
       } 

      }); 
+0

Siempre intenta dar alguna explicación más allá de solo publicar el código. Mientras tanto, podría ser obviamente trivial para ti, podría ser difícil de entender para otras personas. –

Cuestiones relacionadas