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

12

我遇到的问题似乎只会在Linux上出现bug。 我正在尝试让我的Swing应用程序记录按下键盘的按键,然后检测何时释放该按键。这不应该成为问题,因为KeyListener应该为我处理这个问题。

问题在于,当我按住键时,我会收到很多重复的keyPressed()/keyReleased()事件,而不是只有单个keyPressed()。 是否有人有解决方案或解决Linux上真正释放按键的解决方法?

谢谢。


我在JavaFX中遇到了类似的问题。当我按下一个键时,我会收到一个keypressed事件,然后大约半秒钟什么都不会发生,然后只要我按住键,就会不断收到keypressed事件。这似乎是一个操作系统级别的问题,因为在任何文本编辑器或终端窗口中都会发生完全相同的情况。 - undefined
5个回答

14

我遇到的问题似乎是仅在Linux上发生的一个bug。

是的,这是一个Linux问题。

在Windows上,当按键被按住时,您会收到多个KeyPressed事件,但只有一个KeyReleased事件。

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

但我认为解决方案的基础是使用计时器。当按下按键时,启动一个计时器。当再次按下按键时,重新启动计时器。因此,只要计时器间隔大于键盘的重复率,当按键保持按下状态时,计时器将被不断重置。当键入停止生成时,计时器将触发,因此您可以假设该键已被释放。这意味着您将在处理KeyReleased时有一个延迟。


1
我该如何在Java中获取“键盘重复率”?那是操作系统用户首选项设置,对吗? - 0__

2

1

你可以在这里找到一个相当不错的解决方案。


链接又挂了。Wayback机器:https://web.archive.org/web/20151114111041/http://brunez.net63.net/tutorials/keypressfix/keypressfix.php - Suma

0

0
使用KeyEventDispatcher实现,这样你就可以正确地绑定按键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接