(Отредактировано для ясности)
Я хочу определить, когда пользователь нажимает и отпускает ключ в Java Swing, игнорируя функцию автоматического повтора клавиатуры. Я также хотел бы, чтобы чистый подход Java работал на Linux, Mac OS и Windows.
Требования:
- Когда пользователь нажимает какую-то клавишу, я хочу знать, что это за ключ;
- Когда пользователь выпускает какой-либо ключ, я хочу знать, что это за ключ,
- Я хочу игнорировать параметры автоматического повтора системы: я хочу получить только одно событие нажатия клавиши для каждого нажатия клавиши и всего лишь одно событие релиза ключа для каждого выпуска ключа;
- Если возможно, я бы использовал пункты с 1 по 3, чтобы узнать, держит ли у пользователя более одного ключа за раз (т.е. она попадает в "а", и, не выпуская его, она ударяет "Enter").
Проблема, с которой я сталкиваюсь в Java, заключается в том, что в Linux, когда пользователь имеет некоторый ключ, происходит много событий keyPress и keyRelease (из-за функции повторения клавиатуры).
Я пробовал некоторые подходы с без успеха:
- Получите последний раз, когда произошло ключевое событие - в Linux они, похоже, равны нулю для повторения ключей, однако в Mac OS они не являются;
- Рассмотрите событие, только если текущий ключевой код отличается от последнего - таким образом, пользователь не может дважды нажать один и тот же ключ в строке;
Вот основная (не рабочая) часть кода:
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 отправляет новый ключ и новый ключ с той же меткой времени. Это затрудняет понимание того, когда ключ действительно освобожден.
Любые идеи?
Спасибо