захват глобальных нажатий клавиш в Java - PullRequest
3 голосов
/ 05 ноября 2008

Поэтому я хочу вызвать событие (приостановка / приостановка воспроизведения некоторых носителей) всякий раз, когда пользователь нажимает пробел в любом месте приложения Swing.

Поскольку существует так много элементов управления и панелей, которые могут иметь фокус, на самом деле невозможно добавить ключевые события ко всем (не говоря уже о брутто).

Итак, я нашел

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

что удивительно, вы можете зарегистрировать глобальные пре-обработчики нажатия клавиш. Однако есть серьезная проблема - пробелы будут вводиться постоянно в полях ввода, ячейках таблицы и т. Д., И, очевидно, я не хочу вызывать событие паузы!

Так есть идеи? Возможно, есть способ глобально определить, сфокусирован ли курсор на чем-то, что позволяет вводить текст, без необходимости проверять список всех редактируемых элементов управления (рвота!)?

Ответы [ 3 ]

2 голосов
/ 05 ноября 2008

Я думаю, что вы сами на это ответили - да, я думаю, что вы можете узнать текущий элемент, который имеет фокус, и если это экземпляр определенного класса поля, вы игнорируете пробел с целью события паузы. Если это кажется серьезным, не волнуйтесь, instanceof ОЧЕНЬ быстр для JVM (и в любом случае вы говорите о событиях человеческого масштаба, которые являются эоном для процессора).

1 голос
/ 05 ноября 2008

У меня на Swing ржавчина, но я думаю, что вы должны попробовать зарегистрировать глобального слушателя, используя Toolkit.addAWTEventListener с KEY_EVENT_MASK. Затем вы можете отфильтровать обработку AWTEvent на основе ее типа и источника.

0 голосов
/ 06 ноября 2008

Хорошо ... Ну, я пытаюсь фильтровать на основе источника. Проблема в моих редактируемых списках ... Они являются экземпляром

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

И поскольку BorderlessTextField является закрытым внутренним классом, я, очевидно, не могу выполнить проверку его экземпляра.

идеи

EDIT: Хорошо, так что это работает ....

 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;
            }
        });

Это грубо, и я ненавижу это. Я хотел бы найти способ проверить, использовалось ли нажатие клавиши каким-либо компонентом - тогда я мог бы выполнить событие паузы, только когда нажатие клавиши не было задействовано ни одним компонентом.

...