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 vonActions
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.
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 .
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
.
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 ()
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
.
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
Tags und Links java swing key-bindings keylistener key-events