Vorbei an Veranstaltungen zu übergeordneten
Ich würde gerne eine app erstellen, wo einige Ereignisse behandelt werden sollen, als wenn Sie geliefert wurden, zu übergeordneten Container. Zum Beispiel habe ich eine JPanel
enthält JLabel
. Die top JPanel
implementiert mousepress und ziehen jetzt. Was muss ich tun, um die Ereignisse schauen, wie Sie kam, um JPanel
anstelle der Bezeichnung selbst. (ändern der source-Objekt ist wichtig)
Gibt es eine bessere Lösung, als die tatsächlich zu implementieren, die Ereignisse und Ihre Replikation in der Elternteil? (dies würde langweilig werden nach einiger Objekte mit >5 Kinder).
- Warum Sie dies tun müssen (Beispiel)?
- Ich habe Objekte mit vielen Etiketten, das sollte gezogen werden, wo Sie eigentlich angeklickt das erste mal. Jetzt sind Sie ziehbar nur, wenn ich auf den hintergrund des Elements, nicht jedes label auf der Innenseite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Ihrem Ereignis-listener können Sie Versand der event an die übergeordnete Komponente.
Wird
myEvent
die event-handling-Funktion argument:Aber diese Lösung impliziert die Schaffung eines neuen EventListener für jedes element hinzufügen.
So, könnten Sie eine einzelne event-handler und verwenden es, indem es auf alle Auserwählten Kinder, wie diese:
Sollten Sie konvertieren Ereignis vor der Abfertigung für die Eltern. Umbau beinhaltet Koordinaten übersetzung relativ zum übergeordneten.
Maus-Ereignisse werden automatisch anvisiert, um die tiefste Komponente, die hat Maus-Listener.
Weil dieses, Ihr Ziel zu erreichen, können Sie einfach entfernen Sie alle Maus-Listener auf dem JLabel und es wird nie ausgesucht als Ziel für die Maus-events.
Den folgenden code deaktivieren Sie die Maus-Listener, der auf den gegebenen Komponenten und Ihre Kinder rekursiv:
focusable
und möglicherweiserequestFocusEnable
.) Wenn das selbe gilt für die Maus-Listener, das mag sein, warum Sie downvoted Sie. Haben Sie testen Sie Ihre Lösung, um sicherzustellen, dass es funktioniert?disableEvents(AWTEvent.MOUSE_EVENT_MASK | AWTEvent.MOUSE_MOTION_EVENT_MASK);
hat es für mich.