Ich habe das bestimmte Tutorial zu Tastenbelegungen einige Male gelesen, aber Mein Gehirn-Cache scheint nicht groß genug, um die komplizierten Prozesse zu halten.
Ich habe ein Key-Binding-Problem getestet (es stellte sich heraus, dass ich die falsche JComponent.WHEN_*
-Bedingung verwendete), und ich stolperte über ein prägnantes und urkomisches Javadoc für das Paket private javax.swing.KeyboardManager
von einem (leider) anonymen Java-Ingenieur.
Meine Frage ist: Abgesehen von KeyEventDispatcher
, das am Anfang überprüft wird,
Die KeyboardManager-Klasse wird verwendet Hilfe Versand Tastaturaktionen für die WHEN_IN_FOCUSED_WINDOW Stil Aktionen. Aktionen mit anderen Bedingungen sind direkt in JComponent behandelt.
Hier ist eine Beschreibung der Symantiken [sic] wie Tastatur-Dispatching sollte zumindest so funktionieren wie ich es verstehen.
KeyEvents werden an die fokussierte Komponente. Der Fokusmanager bekommt ersten Riss bei der Verarbeitung dieses Veranstaltung. Wenn der Fokusmanager dies nicht tut will es, dann ruft die JComponent auf super.processKeyEvent () dies ermöglicht Zuhörer eine Chance, die zu verarbeiten Veranstaltung.
Wenn keiner der Listener "konsumiert" Das Ereignis dann die Tastaturbelegungen bekommen Schuss. Hier fangen die Dinge an interessant werden. Erstens, KeyStokes [sic] definiert mit dem WHEN_FOCUSED Zustand erhalten eine Chance. Wenn keiner von diese wollen das Ereignis, dann das Komponente geht, obwohl es [Eltern] ist suchte nach Aktionen vom Typ WHEN_ANCESTOR_OF_FOCUSED_COMPONENT.
Wenn noch niemand es genommen hat, dann ist es geht hier hoch. Wir suchen dann nach Komponenten registriert für WHEN_IN_FOCUSED_WINDOW Ereignisse und Feuer zu ihnen. Beachten Sie, dass wenn keiner von denen gefunden werden, dann übergeben wir das Ereignis an die Menübars und lassen Sie sie knacken daran. Sie werden anders behandelt.
Zuletzt überprüfen wir, ob wir uns ansehen ein interner Rahmen. Wenn wir es sind und nicht man wollte das Ereignis, dann rücken wir auf zum Ersteller des internen Frames und sehen wenn jemand das Ereignis will (und so weiter und so weiter).
(UPDATE) Wenn Sie sich jemals über diese fettgedruckte Warnung im Key Bindings Guide Gedanken gemacht haben:
Da die Reihenfolge der Suche nach den Komponenten unvorhersehbar ist, vermeiden Sie doppelte WHEN_IN_FOCUSED_WINDOW-Bindungen!
Es liegt an diesem Segment in KeyboardManager#fireKeyboardAction
:
Die Reihenfolge der Suche ist also vorhersehbar , hängt aber offensichtlich von dieser speziellen Implementierung ab, daher ist es besser nicht , sich darauf zu verlassen. Halten Sie es unvorhersehbar.
(Javadoc und Code stammt von jdk1.6.0_b105 auf WinXP.)
Wir müssen das Debuggen von Component.dispatchEventImpl .
Wenn Sie nur die Quellkommentare der Methode durchlesen, erhalten Sie die perfekte Vorstellung davon, wie Ereignisse in Swing fließen (Sie können auch eine Ebene höher von EventQueue.pumpEventsForHeirarchy aus starten).
Aus Gründen der Klarheit lassen Sie mich einen Auszug aus dem Code geben:
Jetzt können Sie den obigen Fluss mit Ihrer Beschreibung vergleichen, um festzustellen, ob sie richtig ist oder nicht. Aber der Punkt ist, Sie sollten wirklich nicht auf Javadocs von privaten Klassen abhängen, der Grund ist, dass die Entwickler normalerweise nicht kümmern, um die Kommentare von privaten Klassen zu aktualisieren, wenn Code ändert, so dass die Dokumente veraltet werden können.
Tags und Links java swing keyevent key-bindings