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? P>
5 Réponses :
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 P>
interfaces liées à la souris serait p>
Mouselistener MousemotionListener Mousewheellisener P>
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.
Vous devez utiliser la vitrine de Jframe: http: // java. Sun.com/j2se/1.4.2/docs/api/javax/swing/jframe.html#getglasspane () p>
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. P>
Vous voudrez peut-être mettre en œuvre une sous-classe de Mouseadapter Code> , 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 code> 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. P>
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.
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. p>
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. P>
(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.) P>
[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) p>
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);
Ceci n'est pas autorisé dans des applets non signés
Tu es un sauveur!