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ügen

So 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!)?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top