如何阻止keyPressed方法因按键长按被重复调用?
解决keyPressed长按重复触发的问题
问题说明
按下箭头键时,keyPressed(KeyEvent e)方法会先触发一次,过段延迟后就开始快速重复调用,和长按键盘打连续字符(比如eeeeeeeeeeeeeeeeeeeeeee)的情况一样。示例代码如下:
public void keyPressed(KeyEvent e) { System.out.println(e); // 长按按键时会重复打印这个事件 }
想让这个方法只在按键首次按下时触发一次,不想用布尔变量记录按键状态的方式,有没有更简洁的方案?
可行方案
直接用KeyEvent的isAutoRepeat()方法
Java的KeyEvent自带了isAutoRepeat()方法,这个方法能判断当前事件是不是长按重复触发的:如果是重复触发的就返回true,首次按下触发的返回false。直接在方法里加个判断就行,完全不用额外维护状态:
public void keyPressed(KeyEvent e) { if (!e.isAutoRepeat()) { System.out.println(e); // 只有首次按下时才执行逻辑 } }
这应该是最简便的方案了,直接利用事件本身的属性来过滤重复触发的情况。
兼容旧版本的备选方案(如果用不了isAutoRepeat)
要是你的Java版本比较老(比如1.4及以前)不支持isAutoRepeat(),可以结合keyReleased方法重置状态,比你原本想的方式更规整:
private boolean keyHeld = false; public void keyPressed(KeyEvent e) { if (!keyHeld) { System.out.println(e); keyHeld = true; } } public void keyReleased(KeyEvent e) { keyHeld = false; }
不过这个还是需要维护状态变量,优先选第一种方案。
内容的提问来源于stack exchange,提问作者BobTheDragon
相关产品推荐
相关产品推荐

