10
votes

Comment capturer tous les événements de la souris dans un jframe / balançoire?

J'ai un jframe qui a un grand nombre de composants d'enfants changeants. (De nombreuses couches) Y a-t-il un moyen d'ajouter un auditeur pour tous les événements de la souris? Quelque chose comme KeyEventDispatcher?


0 commentaires

5 Réponses :


0
votes

Implémentez tous les auditeurs liés à la souris dans une classe et enregistrez cette classe comme gestionnaire pour tous les événements liés à la souris

interfaces liées à la souris serait

Mouselistener MousemotionListener Mousewheellisener


1 commentaires

Cela ne fonctionne pas car seul un seul composant de la hiérarchie va publier l'événement de la souris. Cela nécessiterait donc d'enregistrer l'auditeur (s) de la souris sur chaque composant de la hiérarchie.



2
votes

Vous devez utiliser la vitrine de Jframe: http: // java. Sun.com/j2se/1.4.2/docs/api/javax/swing/jframe.html#getglasspane ()

Obtenez simplement la vitre d'un jframe avec frm.getglasspane () et utilisez addmouselistener () dessus pour capturer tous les événements de la souris à l'intérieur de la fenêtre.


0 commentaires

0
votes

Vous voudrez peut-être mettre en œuvre une sous-classe de Mouseadapter , une classe abstraite qui fournit des implémentations vides de toutes les méthodes définies dans les interfaces souris * / code>. Une fois que vous avez fait cela, vous pouvez l'enregistrer avec vos composants enfants sous forme de mouselistener quand ils sont créés. Comme vous indiquez que vos composants «changent», vous voudrez vous assurer que vous souhaitez également désigner votre auditeur si vous espérez libérer vos composants pendant le cycle de vie de votre JFRAME.


2 commentaires

MouseinpuTAdapter - Mouseadapter n'est qu'une implémentation de Mouselistener (clics, sans mouvement ni roue de défilement).


Nate, merci pour la réponse. En regardant le code, je vois que Mouseadapter implémente les trois interfaces.



7
votes

Vous pouvez ajouter un Glasspane sur votre ensemble Jframe, ajoutez un MouseinpputAdapter Pour saisir tous les événements de souris possibles, puis utiliser [Swinguties.getDeipestComponTat ()] [3] pour obtenir le composant réel et [Swingutieux.convertmouseevent ()] [4] Pour déléguer l'événement de la souris à partir du volet en verre à la composante réelle.

Cependant, je ne suis pas sûr de l'impact de la performance de cela - Contrairement à KeyEventDispatcher, qui doit simplement modifier un événement chaque fois qu'une touche est appuyée, plusieurs événements sont générés comme l'utilisateur déplace la souris - et contrairement à KeyEventDispatcher, vous avez besoin. Pour re-envoyer l'événement au composant inférieur pour le gérer.

(Désolé - Stackoverflow ne manipule pas les liens vers les méthodes swinguties correctement ... Les liens sont présentés ci-dessous plutôt que dans le texte.)

[3]: http://java.sun.com/j2se/1.4.2/docs/aplia/javax/swing/swingutilities.html#getdeepestComponTat (java.awt.component , int, int) [4]: http://java.sun.com/j2se/1.4.2/docs/aplia/javax/swing/swingutilities.html#convertmouseventent (Java.awt.commousent , java.awt.event.mousevent, Java .awt.component)


0 commentaires

21
votes

Utilisez un AWTEventListener pour filtrer les souris à doseurs:

long eventMask = AWTEvent.MOUSE_MOTION_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK;
Toolkit.getDefaultToolkit().addAWTEventListener( new AWTEventListener()
{
    public void eventDispatched(AWTEvent e)
    {
        System.out.println(e);
    }
}, eventMask);


2 commentaires

Ceci n'est pas autorisé dans des applets non signés


Tu es un sauveur!