Wie versendet Java KeyEvents?

8

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, fehlt die Beschreibung und / oder ist etwas falsch?

  

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 :

%Vor%

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.)

    
Geoffrey Zheng 14.10.2010, 03:45
quelle

1 Antwort

1

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:

  1. Setze Zeitstempel und Modifikatoren des aktuellen Ereignisses .; Vorversender. Führen Sie die erforderlichen Retargeting / Neuanordnungen durch, bevor wir AWTEventListeners benachrichtigen.
  2. Erlauben Sie dem Toolkit, dieses Ereignis an AWTEventListeners zu übergeben.
  3. Wenn niemand ein Schlüsselereignis verbraucht hat, lassen Sie ihn vom KeyboardFocusManager verarbeiten.
  4. Eingabemethoden dürfen das Ereignis verarbeiten
  5. Bearbeiten Sie besondere Ereignisse vor der Auslieferung
  6. Liefert das Ereignis für die normale Verarbeitung
  7. Sonderbehandlung für 4061116: Hook für Browser, um modale Dialoge zu schließen.:
  8. Erlaube dem Partner, das Ereignis zu verarbeiten. Außer KeyEvents werden sie nach allen KeyEventPostProcessors von einem Peer verarbeitet (siehe DefaultKeyboardFocusManager.dispatchKeyEvent ())

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.

    
Suraj Chandran 18.06.2011, 05:56
quelle

Tags und Links