(отредактировано для ясности)
Я хочу определить, когда пользователь нажимает и отпускает клавишу в Java Swing, игнорируя функцию автоматического повторения клавиатуры. Я также хотел бы, чтобы подход, основанный исключительно на Java, работал в Linux, Mac OS и Windows.
Требования:
- Когда пользователь нажимает какую-то клавишу, я хочу знать, какая это клавиша;
- Когда пользователь отпускает какой-то ключ, я хочу знать, что это за ключ;
- Я хочу игнорировать параметры автоматического повторения системы: я хочу получать только одно событие нажатия клавиши для каждого нажатия клавиши и только одно событие отпускания клавиши для каждого нажатия клавиши;
- Если возможно, я бы использовал пункты с 1 по 3, чтобы узнать, удерживает ли пользователь более одной клавиши за раз (т. Е. Она нажимает «а» и, не отпуская ее, нажимает «Ввод»).
Проблема, с которой я сталкиваюсь в Java, заключается в том, что в Linux, когда пользователь удерживает какую-то клавишу, происходит много событий keyPress и keyRelease (из-за функции повторения клавиатуры).
Я пробовал некоторые подходы с безуспешно :
- Получите последний раз, когда произошло ключевое событие - в Linux они кажутся равными нулю для повторения ключа, однако в Mac OS их нет;
- Рассматривать событие, только если текущий keyCode отличается от последнего - таким образом, пользователь не может дважды нажать одну и ту же клавишу подряд;
Вот основная (нерабочая) часть кода:
import java.awt.event.KeyListener;
public class Example implements KeyListener {
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
System.out.println("KeyPressed: "+e.getKeyCode()+", ts="+e.getWhen());
}
public void keyReleased(KeyEvent e) {
System.out.println("KeyReleased: "+e.getKeyCode()+", ts="+e.getWhen());
}
}
Когда пользователь держит клавишу (т. Е. 'P'), система показывает:
KeyPressed: 80, ts=1253637271673
KeyReleased: 80, ts=1253637271923
KeyPressed: 80, ts=1253637271923
KeyReleased: 80, ts=1253637271956
KeyPressed: 80, ts=1253637271956
KeyReleased: 80, ts=1253637271990
KeyPressed: 80, ts=1253637271990
KeyReleased: 80, ts=1253637272023
KeyPressed: 80, ts=1253637272023
...
По крайней мере в Linux JVM продолжает пересылать все события клавиш, когда клавиша удерживается. Чтобы усложнить задачу, в моей системе (Kubuntu 9.04 Core 2 Duo) временные метки постоянно меняются. JVM отправляет ключу новую версию и нажатие новой клавиши с той же отметкой времени. Это затрудняет определение того, когда ключ действительно выпущен.
Есть идеи?
Спасибо