如何知道用户何时真正在Java中释放了密钥?
(为清楚起见,已编辑)
我想检测用户何时在Java Swing中按下并释放一个键,忽略键盘自动重复功能。我也想要一个纯Java的方法,在Linux,Mac OS和Windows上工作。
要求:
- 当用户按下某个键时,我想知道该键是什么键;
- 当用户释放一些密钥时,我想知道那是什么密钥;
- 我想忽略系统自动重复选项:我希望每次按键只接收一个按键事件,每个按键释放只接收一个按键释放事件;
- 如果可能的话,我会使用项目1到3来了解用户是否一次持有多个键(即,她点击“a”并且没有释放它,她点击了“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 以相同的时间戳发送关键的新版本和新按键。这使得很难知道密钥何时真正被释放。
有什么想法吗?
谢谢