2010-11-08 26 views
1

J'ai écrit une application où vous pouvez faire glisser à gauche et à droite une ligne de temps. Lorsque je fais glisser, je sais qu'il s'agit d'un événement mouseDragged. Depuis que je déplace le curseur de la souris à l'extérieur du composant, il arrête de glisser, mais je ne le veux pas. Donc je veux verrouiller en quelque sorte l'événement mouseDragged sur ce composant, mais si je déplace le curseur hors du composant, je ne reçois plus l'événement mouseDragged.Verrouiller l'événement à la sortie de la souris java

Comment puis-je résoudre ce problème? Mon collègue me dit qu'il existe une fonction comme captureMouse.

Répondre

0

Je ne pense pas que ce soit une bonne idée de capturer la souris. Je ne pense pas non plus que ce soit nécessaire pour ce que tu veux. Dans mon expérience, les événements mouseDragged() fonctionnent bien même lorsque vous déplacez la souris en dehors de la zone du composant: elle continuera à signaler les positions X et Y à l'intérieur du composant qui sont les plus proches de la souris. , mais il ne terminera pas le glisser de la souris comme si vous aviez relâché le bouton gauche.

Si le comportement de votre application est différent, vous avez peut-être un bug différent dans la gestion de votre souris?

Par exemple, essayez le chemin applet moitié dans cette page: vous verrez que vous pouvez commencer à glisser le rectangle et déplacez votre souris en dehors de la zone de l'applet, et il continuera à travailler: http://www.dgp.toronto.edu/~mjmcguff/learn/java/04-mouseInput/

(Je ne sais pas l'auteur du code ci-dessus, il est juste l'un des premiers que j'ai trouvé avec une recherche de applet java mouseDragged.)

+0

J'ai essayé ce que dit JTeagle, mais j'ai réalisé que Irish Buffer avait raison et je n'avais même pas besoin d'utiliser AWTListener. – Ivansek

0

Quelle partie de votre «chronologie» est le composant réel recevant l'événement mouseDragged()? Normalement, à la réception de cet événement, vous déplacez le composant pour qu'il corresponde à l'action de glissement. Ainsi, le composant doit toujours être sous la souris et recevoir toujours l'événement mouseDragged() jusqu'à ce que vous le lâchiez. Déplacer ce composant lorsque vous traitez les événements? Un petit rectangle en forme de bouton utilisé comme curseur ferait un excellent composant à utiliser.

(Si vous essayez de traiter votre timeline tout comme le composant et ne sont donc pas en mouvement pour qu'il corresponde, que voulez-vous arriver si l'utilisateur fait glisser la souris à l'extérieur?)

Bien que Windows (et éventuellement d'autres) supportant la capture de la souris, Java ne semble pas. Vous pourriez être en mesure de fournir une file d'attente d'événements personnalisés quelque chose comme ceci:

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() 
    { 
     public void eventDispatched(AWTEvent e) 
     { 
      // Look for mouse messages and handle them... 
     } 

    } 
, AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK); 
0
JComponent.setAutoScrolls(...);