如何在Swing中停止重复的keyPressed()/ keyReleased()事件

时间:2009-11-15 06:53:08

标签: java linux swing event-handling keyboard-events

所以我遇到的问题似乎只是在Linux上发生的错误。当按下按键时,我正试图获取我的swing应用记录,然后检测该按键何时被释放。现在这应该不是问题,因为KeyListener应该为我处理这个问题。

问题在于,当我按住键时,我得到了许多重复的keyPressed()/ keyReleased()事件,而不仅仅是单个keypressed()。有没有人有解决方案或解决方法知道什么时候在Linux上真正发布密钥?

谢谢。

5 个答案:

答案 0 :(得分:14)

  

所以我遇到的问题   似乎是一个只发生的错误   在Linux上

是的,这是一个Linux问题。

在Windows上按住某个键时,您会获得多个KeyPressed事件,但只有一个KeyReleased事件。

这个问题经常被问到,我从未见过很好的解决方案。

但我认为解决方案的基础是使用Timer。按下键时,启动计时器。当你得到另一个keyPressed时,你重启Timer。因此,只要定时器间隔大于键盘的重复率,定时器就会在按住键时连续复位。当keyPresses停止生成时,Timer将触发,因此您认为该键已被释放。这意味着您将在处理keyReleased时遇到延迟。

答案 1 :(得分:2)

此问题重复here

Here's a hack作为AWTEventListener实现,可以在应用程序的开头安装。

答案 2 :(得分:1)

以下是Sun的错误(包括示例解决方法):http://bugs.sun.com/view_bug.do?bug_id=4153069

答案 3 :(得分:1)

您可以找到一个非常好的解决方法here

答案 4 :(得分:0)

使用KeyEventDispatcher实现,使用它可以正确地进行键绑定。