显然有人问过这个问题before和 before和 before ,但要么答案不能解决问题,要么使用我无法理解的语言。
我必须使用 JComponent.WHEN_IN_FOCUSED_WINDOW
注册键盘操作,因此 KeyListener
不是替代方案。我必须跟踪按下和释放键,比如光标键。由于某些内置键重复,我无法进行多次按下/释放触发。我真的很想知道什么时候按键被物理按下和按下。例如,按下时启动计时器,释放时停止计时器(并且不要因为虚拟键重复而多次启动和停止计时器)。
我相信这在 OS X 上工作正常,但我现在在 Linux (OpenJDK 7) 上。
如何?
最佳答案
正如许多人指出的那样,这是 Linux 上的一个怪事(或:错误)。
解决方法如下。假设按下 Action 类称为 ActionPress
,释放 Action 类称为 ActionRelease
。
- 两者都维护一个
long lastWhen
,它在actionPerformed
中用e.getWhen
更新。他们有一个公共(public)方法getLastWhen
可以被对方调用。 ActionRelease
维护一个具有几毫秒的javax.swing.Timer
。它是常规的actionPerformed
重新启动计时器,没有别的。ActionPress
在其actionPerformed
中调用相应的ActionRelease
的getLastWhen
。如果结果与自己的lastWhen
相同,则忽略该 Action 并返回,否则执行该 Action 。ActionRelease
在Timer
的附加ActionListener
中执行实际操作。在其getLastWhen
实现中,它在返回lastWhen
之前停止计时器。
关于java - InputMap - 注册一个监控按键的击键,没有虚拟重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245868/