2010-08-01 12 views
9

J'ai un JPanel pour lequel j'ai créé un MouseListener et je vois un comportement que je ne peux pas expliquer.MouseListener pour JPanel missing mouseClicked événements

Habituellement, lorsque je clique sur la souris dans le JPanel, je vois les événements qui ont suivi le feu:

mousePressed 
mouseReleased 
mouseClicked 

À certaines occasions, je ne vois pas vu le feu de l'événement mouseClicked, je ne:

mousePressed 
mouseReleased 

Je ne pense pas que je fais quelque chose hors de l'ordinaire quand je clique ces fois. Quelqu'un pourrait-il expliquer pourquoi je ne pourrais pas voir l'événement mouseClicked?

Je ne sais pas si c'est pertinent, mais j'ai une animation qui s'exécute dans le panneau en utilisant un javax.swing.Timer.

Toute aide est appréciée.

EDIT: Ajout d'un code de test qui réplique le problème. Je ne suis pas sûr, mais je me demande si ma souris a quelque chose à voir avec ça. J'ai une de ces souris de jeu super sensibles (de mes vieux jours 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

Pouvez-vous poster du code? –

+0

Juste ajouté une classe qui réplique le problème. Je pensais que ma souris était trop sensible et que je recevais des événements mouseMoved entre les événements mousePressed et mouseReleased, mais j'ai ajouté un écouteur pour mouseMoved et j'ai pu répliquer le problème sans voir un mouseMove au milieu. – BillMan

+0

Merci pour cette question, avec toutes les réponses. J'ai eu exactement le même problème! (Probablement ma souris sensible aussi). – Hidde

Répondre

16

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

". Vous verrez un événement libéré-souris Si vous ne déplacez la souris, un événement de la souris cliquée suivra"

J'ai juste eu ce problème. Si vous déplacez la souris AT ALL, un événement cliqué ne se produira pas. Je n'ai vraiment aucune idée de ce que la bonne souris a reçu cette connaissance. Je l'ai fixé en utilisant mouseReleased et vérifier si la souris dans l'objet:

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

Je pense avoir trouvé le problème ici. J'obtenais des événements intermédiaires mouseDragged entre mousePress et mouseRelease. mouseMoved n'a pas semblé causer le problème, mais mouseDragged l'a fait.

Je ne suis pas sûr de la bonne solution maintenant, mais au moins maintenant je peux expliquer ce qui se passe.

Vive

-Bill

0

Quelques suggestions pour ceux qui ont ce problème.

Premièrement: il se pourrait que votre souris vieillisse. J'avais un comportement bizarre et il s'est avéré que la souris lançait parfois des coordonnées qui étaient loin et elle revenait à sa position d'origine. Cela donnera des événements de glisser de la souris. Essayez une autre souris ...

Deuxièmement: J'ai eu un problème où j'avais besoin d'un jPanel (A), sur lequel je dessinais, mis en page BorderLayout.CENTER dans un autre jPanel (B) qui était, lui-même, à l'intérieur un jScrollPane. Lorsque jPanel (B) était redimensionné, le panneau de dessin (A) passait à la taille correcte à cause du gestionnaire de disposition BorderLayout mais (A) ignorait tous les clics en dehors de ses dimensions d'origine si (A) était maintenant plus grand que sa taille d'origine.Lorsque jPanel (B) a été redimensionné, le gestionnaire de disposition ne définissait pas les dimensions (A) à la nouvelle taille quand il était mis à l'échelle (A) pour entrer dans le CENTRE de jPanel (B). L'événement de clic de souris se déclencherait uniquement pour les clics dans les dimensions d'origine de jPanel (A). J'ai dû définir manuellement la taille de jPanel (A) à ses nouvelles dimensions mises à l'échelle afin d'obtenir des clics de souris pour toutes les zones de jPanel (A).

0

Dans les cas où tout ce que je veux est l'événement cliqué, alors j'utilise un simple ActionListener au lieu du MouseListner. L'événement actionPerformed fait, pour les boutons et au moins atleast, se déclencher exactement comme nous voulons qu'un événement click soit, c'est-à-dire tant que la souris est au même contrôle au moment de la libération qu'à l'heure pressée, un événement actionPerformed sera mis à la porte.