swing - que - mousemoved java ejemplo
MouseListener para JPanel mouse missing Eventos modificados (4)
Tengo un JPanel para el que he creado MouseListener y veo un comportamiento que no puedo explicar.
Por lo general, cuando hago clic con el mouse dentro de JPanel, veo que se disparan los siguientes eventos:
mousePressed
mouseReleased
mouseClicked
En algunas ocasiones, no veo el evento del evento MouseClicked, solo 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 de si es relevante, pero sí tengo una animación ejecutándose en el panel usando javax.swing.Timer.
Cualquier ayuda es apreciada.
EDITAR: agregar 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);
}
}
Creo que encontré 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.
Aclamaciones
-Cuenta
Por http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html :
"Verá un evento liberado por el mouse. Si no movió el mouse, seguirá un evento con el mouse".
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. Lo arreglé usando MouseReleased y comprobando si el mouse estaba dentro del objeto:
public void mouseReleased(MouseEvent e) {
if(objectWithListener.contains(e.getPoint())){
doClickAction();
}
}
Un par de sugerencias para aquellos que tienen este problema.
Primero: podría ser que tu ratón se está haciendo 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: tuve un problema donde necesitaba un jPanel (A), que estaba dibujando, configurado como BorderLayout.CENTER dentro de otro jPanel (B) que estaba, en sí mismo, dentro de jScrollPane.
Cuando se cambia el tamaño de jPanel (B), 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 disposición no estaba configurando las dimensiones (A) para el nuevo tamaño cuando se escalaron (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).
En los casos en que lo único que deseo es el evento cliqueado, entonces uso un ActionListener
simple en lugar del MouseListner
. El evento actionPerformed
, para botones y por lo menos igual, se dispara como queremos que sea un evento de clic, es decir, mientras el mouse esté en el mismo control en el tiempo de lanzamiento que en el tiempo presionado, un evento actionPerformed
será despedido.