Erkennung von Maus-enter/exit-Ereignisse überall auf JPanel
Grundsätzlich gibt es ein JPanel, auf dem ich wissen will, wenn die Maus betritt den Bereich des JPanel und verlässt den Bereich des JPanel. Also habe ich ein Maus-listener, aber wenn es-Komponenten auf dem JPanel und die Maus geht über einen von Ihnen erkannt wurde, als eine Ausfahrt auf die JPanel, obwohl die Komponente auf dem JPanel. Ich Frage mich, ob jemand weiß, jeder Weg, um dieses problem zu lösen, ohne etwas zu tun, wie das hinzufügen von Listenern auf alle Komponenten auf dem JPanel?
Die Antworten in dieser Frage sind zutreffend zu deinem problem: stackoverflow.com/questions/1882055/...
InformationsquelleAutor Mano | 2010-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es eine sehr einfache Lösung für dieses problem, die funktionieren kann :
Diese Weise, Sie ignorieren einfach die mouseExited-event, wenn es tritt auf ein Kind-element.
mouseEntered
nochmouseExited
genannt werden.InformationsquelleAutor Darksharcoux
Hier ist ein Weg, es zu tun für eine Komponente, die möglicherweise enthalten noch weitere Komponenten:
Fügen Sie eine Globale AWT-event-listener, um alle Maus-events. Zum Beispiel:
Umsetzung der
TargetedMouseHandler
zu ignorieren, Ereignisse, die nicht bezogen, indem Sie das Bedienfeld oder von einem von der Jury Kinder (Sie könnenSwingUtilities.isDescendingFrom
um dies zu prüfen).Verfolgen, ob oder nicht die Maus bereits innerhalb der Grenzen der Ihr panel. Wenn Sie einen
MouseEvent.MOUSE_ENTERED
Ereignis in Ihrem panel oder einem Ihrer Kinder, setzen Sie ein flag auf true.Wenn du einen
MouseEvent.MOUSE_EXITED
event, nur das flag zurücksetzen, wenn der Punkt in derMouseEvent
außerhalb der Grenzen Ihres Ziel-Bedienfeld.SwingUtilities.convertPoint
undComponent.getBounds().contains()
wird kommen in praktisch hier.können Sie bitte, dass Sie entweder schalten Sie die Maus-Ereignisse für oder fügen Sie ein Maus-listener, um
panel
. Ansonsten werden keine Mausereignisse ausgelöst werden wird, siehe auch die MouseEvent-Dokumentation.InformationsquelleAutor Ash
Dies ist Beispielcode implementieren Ash Lösung. Für mich, der JFrame nicht erkennen, alle exit-Veranstaltungen richtig, aber eine innere JPanel hast, also ich ging in zwei Komponenten - eine für die Prüfung Nachkommen und eine für die Prüfung der Grenze.
InformationsquelleAutor brian_d
Wenn Sie möchten, um alle Ereignisse senden, um eine top-level-Fenster können Sie einen listener hinzufügen, um die Glasscheibe des JFrame. Siehe: http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/RootPaneContainer.html#getGlassPane%28%29
InformationsquelleAutor Itay Maman
Ein simpeler Lösung mit java 1.8+
InformationsquelleAutor Frank Dekker