Tastenbindungen im Vergleich zu Tastenhörern in Java

8

Ich stelle fest, dass es in Java / Swing mindestens zwei verschiedene Arten gibt, Schlüsselereignisse zu behandeln:

Was sind die Vorteile / Nachteile von jedem, und wann sollten Sie einen lieber als den anderen bevorzugen?

    
mikera 08.03.2013, 08:52
quelle

2 Antworten

19
  

Wann sollten Sie lieber eine als die andere bevorzugen?

Bevorzugen Sie Key-Bindings, seit sie eingeführt wurden. A KeyListener ist eine Verbindung auf niedrigerer Ebene mit Ereignissen.

Diese Seite für die Tastenbelegung deckt viele der Gründe ab, die ich angehen würde um sie anstelle von KeyListener zu verwenden. Es listet viele Dinge auf, die für KeyListener einfach nicht verfügbar sind. Z.B. Auswahlmöglichkeiten:

  • WHEN_FOCUSED
  • WHEN_ANCESTOR_OF_FOCUSED_COMPONENT
  • WHEN_IN_FOCUSED_WINDOW

Je mehr ich das verknüpfte Dokument lese, desto weniger kann ich die Notwendigkeit verstehen, die Frage zu stellen. E.G .:

  

Eine Alternative zu Tastenbelegungen ist die Verwendung von Tastenhörern. Schlüssel-Listener haben ihren Platz als eine Low-Level-Schnittstelle zur Tastatureingabe, aber um auf einzelne Schlüssel zu reagieren, sind Tastaturbelegungen geeigneter und neigen dazu, leichter zu wartenden Code zu ergeben. Key Listeners sind auch schwierig, wenn die Tastenbindung aktiv sein soll, wenn die Komponente keinen Fokus hat. Einige der Vorteile von Tastenbelegungen sind, dass sie sich etwas selbst dokumentieren, die Containment-Hierarchie berücksichtigen, wiederverwendbare Codestücke ( Action objects) fördern und Aktionen leicht entfernen, anpassen oder freigeben können. Außerdem erleichtern sie das Ändern des Schlüssels, an den eine Aktion gebunden ist. Ein weiterer Vorteil von Actions ist, dass sie einen aktivierten Status haben, der eine einfache Möglichkeit bietet, die Aktion zu deaktivieren, ohne verfolgen zu müssen, an welche Komponente sie angehängt ist.

Textkomponenten

Wie von @Robin bemerkt, haben Textkomponenten auch DocumentListener & amp; DocumentFilter , die für Funktionen hinzugefügt werden können, die besser geeignet sind Textdokumente. Weitere Informationen zu Dokument Textkomponentenfunktionen . docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html#doclisteners">Listener & amp; Filter .

    
Andrew Thompson 08.03.2013, 08:54
quelle
12
  1. KeyBindings (hohe Abstraktion)

Vorteile

  • einstellbar, teilbar,

  • bestimmt für einfache Abkürzungen, ohne un_wollte Nebenwirkungen (die meisten dieser Ereignisse sind ziemlich einfach und einstellbar)

  • behilflich jedes Problem mit Fokus im Fenster zu lösen (auch einstellbar, in Java muss das Fenster den Fokus auf den Bildschirm haben)

  • Swing intern, um KeyBindings, built_in-Verknüpfungen, Aktionen usw. in Key Bindings by @ zu verwenden camickr (in Swing sind interessante Shortcuts und Aktionen implementiert)

  • Ausgabe sollte auf die Swing-Aktion (die gleiche hohe mögliche Abstraktion in Swing) sein

Nachteile

  • nicht möglich, alle Tasten von Tastaturen zu überschreiben

  • nicht möglich zu überschreiben drei oder mehr Tasten werden gleichzeitig gedrückt

  • Code sieht aus wie sehr kompliziert (nicht wahr, Code ist in den meisten Fällen Sortierer im Vergleich mit dem gleichen Code von KeyListener)

  • entfernt für weitere Details, um comment von @camickr zu sehen (erforderlicher Swing-Timer für wiederholte Aktionen)

  • nicht möglich zu konsumieren () mit einer Methode in API

  • implementiert

.

KeyListeners (niedriger Listener)

Vorteile

  • sehr einfach zu bedienen, intuitiv

  • Code ist sehr kurz für zwei Schlüsselereignisse

  • erforderte keinerlei Kenntnisse über Swing, Java

  • ist es möglich, den Baum zu überschreiben, oder es werden mehr Tasten gedrückt (z. B. für sehr komplizierte Tastenkürzel), dann spielt es keine Rolle, welche Tasten ausgelöst werden können, separate Tastenereignisse

  • ist programmatisch zu event.consume ()

  • möglich
  • kann nicht-finalisierte interne Ereignisse von Compound JComponents (JComboBox, JSpinner ...) abhören

Nachteile

  • ist für Teile von Containern und JComponents nicht zugänglich

  • (J) Komponente sollte Fokusinhaber sein und muss fokussierbar sein

  • nicht für Swing JComponents

  • bestimmt

.

AWTEventListener

  • um alle Key- und Mouse-Ereignisse zu kombinieren, Low-Level-Listener, wie es in Java möglich ist

  • Grundsätzlich gibt es keinen Grund, diesen Listener für die meisten (auch sehr komplizierten) GUI zu verwenden, die auf Swing basieren

  • Ich sehe diesen Listener in benutzerdefinierten Componets implementiert basierend auf AWT erforderlichen Peers kam aus dem nativen Betriebssystem

  • Es gibt jedoch hervorragende Implementierungen für AWTEventListener Anwendungsinaktivität und globale Ereignislistener von @camickr

    >

.

Hinweis: Bestellung von Key-Events ist Plattform für Plattform anders

mKorbel 08.03.2013 09:40
quelle