我正在开发Java / Swing应用程序,并使用KeyListener
上的JFrame
自己处理关键事件。
我的问题是,当我只想接收一个按键时,操作系统的按键重复功能会导致发生多个keyPressed
事件。
一种解决方案是将键的状态保留在数组中,并且仅在状态更改时才接受事件。
private boolean keysDown[] = new boolean[0x10000];
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (keysDown[key]) return;
keysDown[key] = true;
}
// ...
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (0 <= key && key <= 0xFFFF) {
if (!keysDown[key]) return;
keysDown[key] = false;
}
// ...
}
这行得通,但是非常笨拙,尽管我似乎只找到0到216-1范围内的键码,但是我不确定该范围之外的键码是否存在。 (
getKeyCode()
返回int
。)另一个问题是,按下一个键,在另一个窗口中释放它,然后在我的应用程序中再次按下它不会注册该事件。所以,有没有更好的方法
最佳答案
将您的布尔数组替换为HashSet<Integer>
或TreeSet<Integer>
。重复键是操作系统的功能,因此无法禁用它,只能解决它。