Захват определенных нажатий клавиш в Java Swing

Есть много тем о том, как фиксировать нажатия клавиш в Java Swing, но я хотел бы спросить о наилучшей практике. Например, у меня есть окно, в котором я хочу прослушать нажатие клавиши F1 или Command-P на Mac (или CTRL-P на ПК).

Читая официальную документацию по Java для KeyEvent, кажется, лучше использовать события Key Typed, а не события Key Pressed или Key Released, потому что они более высокого уровня. Для меня это имеет смысл, и я даже обнаружил, что для того, чтобы убедиться, что программа независима от платформы, я должен указать объект нажатия клавиши следующим образом:

private KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_P, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());

Это должно позволить захватить клавишу быстрого доступа Command на Mac и клавишу быстрого доступа CTRL на ПК. (Надеюсь, я правильно использую эти термины.) Итак, теперь, когда у меня есть объект KeyStroke, как мне проверить его на соответствие объекту KeyEvent в моем KeyListener? А добавление проверки на событие клавиши F1 только еще больше усложняет дело, хотя, надеюсь, не слишком сильно.

Предложения?


person Sturm    schedule 12.08.2014    source источник
comment
Лучше, чем KeyListener, используйте привязку ключей. Поскольку у вас уже есть KeyStroke, вам нужно прикрепить его к InputMap некоторого компонента, а затем вам понадобится только Action, чтобы прикрепить его к ActionMap компонента.   -  person dic19    schedule 12.08.2014


Ответы (1)


Итак, теперь, когда у меня есть объект KeyStroke, как мне проверить его на объект KeyEvent в моем KeyListener?

Вы не используете KeyListener. Swing был разработан для использования с Key Bindings.

Ознакомьтесь с привязки клавиш, в котором содержится программа для вывода списка привязок клавиш по умолчанию. каждый компонент Swing. Это также дает некоторые примеры того, как вы можете создать свой собственный ey Bindings. Он также содержит ссылку на учебник Swing по привязкам клавиш, в котором более подробно объясняется весь процесс.

person camickr    schedule 12.08.2014
comment
Идеальный! Спасибо за помощь, @camickr и @dic19. Это значительно упрощает работу, и я могу использовать один и тот же объект KeyStroke, чтобы он реагировал на правильные клавиши как на Mac, так и на Windows. - person Sturm; 12.08.2014