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"s getLastWhen, Если результат идентичен его собственному lastWhen, игнорировать действие и вернуться, в противном случае выполнить действие.
  • ActionRelease в дополнительном ActionListener для Timer выполняет фактическое действие. В своем getLastWhen реализация, он останавливает таймер перед возвратом lastWhen,
Другие вопросы по тегам