InputMap - зарегистрировать нажатие клавиши, которое контролирует нажатие клавиши, и не повторяет виртуальные
По-видимому, этот вопрос задавался до и до и до, но либо ответы не решают проблему, либо используют язык, который я не понимаю.
Я должен зарегистрировать действие клавиатуры, используя JComponent.WHEN_IN_FOCUSED_WINDOW
так KeyListener
это не альтернатива. Я должен отслеживать нажатие и отпускание клавиши, скажем, клавиши курсора. У меня не может быть многократных срабатываний при нажатии / отпускании из-за повторения некоторых встроенных клавиш. Я действительно хочу знать, когда клавиша физически нажата и нажата. Например, запуск таймера при нажатии, остановка таймера при отпускании (и не запускайте и не останавливайте таймер десятки раз из-за повторения виртуальной клавиши).
Я считаю, что это работает правильно на OS X, но я сейчас на Linux (OpenJDK 7).
Как?
1 ответ
Как отмечали несколько человек, это странность (или ошибка) в Linux.
Обходной путь идет следующим образом. Допустим, урок пресс-действия называется ActionPress
и класс действия релиза называется ActionRelease
,
- оба поддерживают
long lastWhen
это обновляется вactionPerformed
сe.getWhen
, У них есть публичный методgetLastWhen
это можно назвать их коллегами. ActionRelease
поддерживаетjavax.swing.Timer
с несколькими миллисекундами. Это регулярноactionPerformed
перезапускает таймер, больше ничего.ActionPress
в егоactionPerformed
вызывает соответствующийActionRelease
"sgetLastWhen
, Если результат идентичен его собственномуlastWhen
, игнорировать действие и вернуться, в противном случае выполнить действие.ActionRelease
в дополнительномActionListener
дляTimer
выполняет фактическое действие. В своемgetLastWhen
реализация, он останавливает таймер перед возвратомlastWhen
,