1

显然,这个问题在之前之前之前都被问过,但是答案要么没有解决问题,要么使用了我无法理解的语言。

我必须使用 注册键盘操作JComponent.WHEN_IN_FOCUSED_WINDOW,因此 aKeyListener不是替代方法。我必须跟踪按下和释放键,比如光标键。由于某些内置按键重复,我无法多次按下/释放触发。我真的很想知道何时物理按下和按下键。例如,按下时启动计时器,松开时停止计时器(并且不要因为虚拟键重复而多次启动和停止计时器)。

我相信这在 OS X 上可以正常工作,但我现在在 Linux 上(OpenJDK 7)。

如何?

4

1 回答 1

2

正如许多人所指出的,这是 Linux 上的一个奇怪(或:错误)。

解决方法如下。假设调用了按下动作类,调用ActionPress了释放动作类ActionRelease

  • 两者都维护一个long lastWhenactionPerformed. e.getWhen他们有一个公共方法getLastWhen可以被他们的同行调用。
  • ActionRelease保持javax.swing.Timer几毫秒。它是定期actionPerformed 重新启动计时器,仅此而已。
  • ActionPress在其actionPerformed调用对应ActionReleasegetLastWhen. 如果结果与自己的相同lastWhen,则忽略该操作并返回,否则执行该操作。
  • ActionRelease在附加ActionListenerTimer执行实际动作。在其getLastWhen实现中,它在 return 之前停止计时器lastWhen
于 2014-10-07T22:15:40.683 回答