Erfassung globaler Drücken von Tasten in Java
Frage
So ich ein Ereignis auslösen soll (Pause / Die Fortsetzung einig Medien), wenn der Benutzer in dem meinem Swing-App spacebar überall drückt.
Da gibt es so viele Kontrollen und Platten, die den Fokus haben könnten, es ist nicht wirklich möglich keyevents sie alle (nicht zu erwähnen brutto).
hinzufügenSo fand ich
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()
, die genial ist, können Sie global keypress Pre-Handler registrieren. Es gibt ein großes Problem, obwohl - Räume die ganze Zeit in Eingabefelder eingegeben werden, Tabellenzellen, usw., und ich nicht offensichtlich dann die Pause Ereignis auslösen soll
So irgendwelche Ideen? Vielleicht gibt es Weise global zu erkennen, ob sich der Cursor auf etwas fokussiert ist, die Texteingabe ermöglicht, ohne durch eine Liste aller editierbaren Kontrollen zu überprüfen, die (erbrechen!)?
Lösung
Ich glaube, Sie antwortete, dass sich - ja, ich denke, man kann das aktuelle Element herausfinden, das den Fokus hat, und wenn es ein instanceof eine bestimmte Feldklasse gibt, ignorieren Sie den Raum zum Zweck der Pause Veranstaltung. Wenn es plump Nähte, keine Sorge, instanceof ist sehr schnell für die JVM (und in jeder Ursache sprechen Sie Menschenmaß Ereignisse, die eine eon an einen Prozessor sind).
Andere Tipps
Ich bin auf dem Schwingen rostig, aber ich denke, Sie sollten versuchen, Toolkit.addAWTEventListener mit einem KEY_EVENT_MASK
. Anschließend können Sie die AWTEvent Verarbeitungsfilter auf der Grundlage seiner Art und Quelle.
Ok ... Nun im Versuch, basierend auf Quelle zu filtern. Das Problem ist meine editierbare Combobox ... Sie sind instanceof
javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField
Und da BorderlessTextField eine private innere Klasse ist, ich kann nicht tun offenbar eine instanceof Prüfung gegen sie.
Ideen?
EDIT: ok so das funktioniert ....
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {
public boolean postProcessKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
Object s = e.getComponent();
if (!(s instanceof JTextField) &&
!(s instanceof JTable && ((JTable) s).isEditing())
) {
music_player.pauseEvent();
}
//System.out.println(s.getClass().toString());
}
return true;
}
});
Sein total grob und ich hasse es. Ich wünschte, ich könnte einen Weg finden, um zu überprüfen, ob die keypress von jeder Komponente verbraucht wurden -. Dann konnte ich nur das Pause-Ereignis auslöst, wenn der Tastendruck nicht durch irgendeine Komponente actioned wurde