2010-08-01 18 views
9

Tengo un JPanel para el que he creado un MouseListener y estoy viendo un comportamiento que no puedo explicar.MouseListener para JPanel mouse missing Eventos clonados

Por lo general, al hacer clic en el ratón dentro del JPanel, veo los siguientes eventos de incendios:

mousePressed 
mouseReleased 
mouseClicked 

En algunas ocasiones, no veo el fuego mouseClicked caso, sólo veo:

mousePressed 
mouseReleased 

No creo que esté haciendo nada fuera de lo común cuando hago clic en estos momentos. ¿Alguien podría explicar por qué podría no estar viendo el evento MouseClicked?

No estoy seguro si es relevante, pero sí tengo una animación ejecutándose en el panel usando javax.swing.Timer.

Cualquier ayuda es apreciada.

EDIT: agregando el código de prueba que replica el problema. No estoy seguro, pero me pregunto si mi mouse tiene algo que ver con eso. Tengo uno de esos ratones de juego súper sensibles (de mis viejos días de COD4).

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Test { 

    public static void main(String[] args) { 
     final Test test = new Test(); 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       test.createAndShowGUI(); 
      } 
     }); 
    } 

    protected void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setPreferredSize(new Dimension(1024, 768)); 
     frame.setTitle("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel panel = new JPanel(); 
     panel.setBackground(Color.WHITE); 

     panel.addMouseListener(new MouseListener() { 
      @Override 
      public void mouseReleased(MouseEvent e) { 
       System.out.println(":MOUSE_RELEASED_EVENT:"); 
      } 
      @Override 
      public void mousePressed(MouseEvent e) { 
       System.out.println("----------------------------------\n:MOUSE_PRESSED_EVENT:"); 
      } 
      @Override 
      public void mouseExited(MouseEvent e) { 
       System.out.println(":MOUSE_EXITED_EVENT:"); 
      } 
      @Override 
      public void mouseEntered(MouseEvent e) { 
       System.out.println(":MOUSE_ENTER_EVENT:"); 
      } 
      @Override 
      public void mouseClicked(MouseEvent e) { 
       System.out.println(":MOUSE_CLICK_EVENT:"); 
      } 
     }); 

     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

} 
+0

¿Se puede publicar algún código? –

+0

Acaba de agregar una clase que replica el problema. Pensé que podría ser que mi mouse fuera demasiado sensible y obtuviera eventos MouseMoved entre los eventos MousePressed y mouseReleased, pero agregué un detector para mouseMoved y pude replicar el problema sin ver un mouseMove en el medio. – BillMan

+0

Gracias por esta pregunta, junto con todas las respuestas. ¡Tuve exactamente el mismo problema! (Probablemente mi ratón sensible también). – Hidde

Respuesta

16

por http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html:

". Va a ver un evento de ratón-lanzado Si no se mueve el ratón, un evento de ratón se hace clic siga"

Acabo de tener este problema. Si mueve el mouse EN TODO, un evento cliqueado no sucederá. Realmente no tengo idea de qué buen ratón se le da este conocimiento. Me fijo mediante el uso de mouseReleased y comprobar si el ratón estaba dentro del objeto:

public void mouseReleased(MouseEvent e) { 
    if(objectWithListener.contains(e.getPoint())){ 
     doClickAction(); 
    } 
} 
3

Creo que he encontrado el problema aquí. Obtuve eventos intermedios mouseDragged entre el mousePress y mouseRelease. mouseMoved no parece causar el problema, pero mouseDragged sí.

No estoy seguro de la solución correcta ahora, pero al menos ahora puedo explicar lo que está sucediendo.

Saludos

-Bill

0

Un par de sugerencias para los que tienen este problema.

Primero: podría ser que su ratón se está poniendo viejo. Estaba adquiriendo un comportamiento extraño y resultó ser el mouse que de vez en cuando arrojaba coordenadas que estaban muy lejos y luego volvía a su posición original. Esto dará los eventos de arrastre del mouse. Pruebe con un mouse diferente ...

Segundo: Tengo un problema donde necesito un jPanel (A), que estaba dibujando, configurado como BorderLayout.CENTER dentro de otro jPanel (B) que era, en sí mismo, dentro un jScrollPane.

Cuando jPanel (B) se redimensionó, el panel de dibujo (A) se escalaría al tamaño correcto debido al administrador de diseño BorderLayout pero (A) ignoraría cualquier clic fuera de sus dimensiones originales si (A) ahora fuera más grande que su tamaño original.

Cuando se modificó el tamaño de jPanel (B), el administrador de diseño no estaba configurando las dimensiones (A) para el nuevo tamaño cuando escalaba (A) para caber en el CENTRO de jPanel (B). El evento de clic del mouse solo se activará para clics dentro de las dimensiones originales de jPanel (A). Tuve que establecer manualmente el tamaño de jPanel (A) en sus nuevas dimensiones escaladas para obtener clics del mouse para todas las áreas de jPanel (A).

0

En los casos en que todo lo que quiero es el evento cliqueado, entonces uso un simple ActionListener en lugar del MouseListner. El evento actionPerformed, para botones y por lo menos al mismo tiempo, se activa como queremos que sea un evento de clic, es decir, mientras el mouse esté en el mismo control en el tiempo de liberación que en el tiempo presionado, se producirá un evento actionPerformed despedido.

Cuestiones relacionadas