在 Swing 中禁用按键重复
Disabling key repeat in Swing
我正在开发一个 Java/Swing 应用程序,我正在 JFrame
.
上使用 KeyListener
自己处理关键事件
我的问题是,OS 的按键重复功能导致当我按住一个键时发生多个 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()
returns int
。)另一个问题是按下一个键,在另一个 window 中释放它,然后在我的应用程序中再次按下它不会注册事件.
所以,有没有更好的方法
- 在我的应用程序中禁用按键重复或
- 可靠地检测重复事件?
用 HashSet<Integer>
或 TreeSet<Integer>
替换您的布尔数组。按键重复是OS的一个功能,所以没有办法禁用它,只能考虑它。
我正在开发一个 Java/Swing 应用程序,我正在 JFrame
.
KeyListener
自己处理关键事件
我的问题是,OS 的按键重复功能导致当我按住一个键时发生多个 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()
returns int
。)另一个问题是按下一个键,在另一个 window 中释放它,然后在我的应用程序中再次按下它不会注册事件.
所以,有没有更好的方法
- 在我的应用程序中禁用按键重复或
- 可靠地检测重复事件?
用 HashSet<Integer>
或 TreeSet<Integer>
替换您的布尔数组。按键重复是OS的一个功能,所以没有办法禁用它,只能考虑它。