java - InputMap - 注册一个监控按键的击键,没有虚拟重复

标签 java linux swing key-bindings action-interface

显然有人问过这个问题beforebeforebefore ,但要么答案不能解决问题,要么使用我无法理解的语言。

我必须使用 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 中调用相应的ActionReleasegetLastWhen。如果结果与自己的lastWhen相同,则忽略该 Action 并返回,否则执行该 Action 。
  • ActionReleaseTimer 的附加 ActionListener 中执行实际操作。在其 getLastWhen 实现中,它在返回 lastWhen 之前停止计时器。

关于java - InputMap - 注册一个监控按键的击键,没有虚拟重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26245868/

相关文章:

java - 如何根据 JButton 的大小自动增加或减少 JButton 文本的大小?

c - 系统调用 : maximum arguments in

安卓linux环境变量

java - 让 JOptionPane.showConfirmDialog() 在 Mac OSX 上运行

java - 属性更改列表器不调用 propertychangeevent 方法

java - 关闭单个窗口会关闭java中的所有框架

java - 手动编辑tomcat中的文件夹内容?

java - 为什么这些可变参数方法(在 Java 6 中工作正常)在 Java 8 中是不明确的

java - spring 在频繁刷新/ajax 调用后卡住

linux - 如何使用终端从 Ubuntu 16.04 中的特定文件夹中删除特定文件