I register
getInputMap().put(KeyStroke.getKeyStroke("pressed RIGHT"), "go right");
在测试代码时,我得到:当我按住向右箭头键时,该操作会反复触发,而不是像我预期的那样只有一次。
有趣
getInputMap().put(KeyStroke.getKeyStroke("released RIGHT"), "stop");
触发器仅在最终释放密钥时停止。
有没有办法在输入映射上注册击键,以便在按下键时仅触发一次关联的操作?
击键文档:
击键表示键盘上的键操作或等效项 输入设备。击键只能对应于按下或释放 一个特定的键,就像KEY_PRESSED和KEY_RELEASED键事件一样; 或者,它们可以对应于键入特定的 Java 字符, 就像KEY_TYPED KeyEvents一样。在所有情况下,击键都可以指定 修饰符(alt、shift、control、meta、altGraph 或组合) 其中),在操作过程中必须存在才能完全匹配。
要在发布时仅触发一次事件,我建议注册
getInputMap().put(KeyStroke.getKeyStroke("typed RIGHT"), "go right");
KeyStroke.getKeyStroke(String) 的文档是:
分析字符串并返回击键。字符串必须具有 以下语法:
修饰符* (typedID | pressedReleaseID) 修饰符 := shift | control | ctrl | meta | alt | altGraph typedID := typed > typedKey := 长度为 1 的字符串,给出 Unicode 字符。 按下释放ID := (按下 | 释放) 键 key := KeyEvent 键代码名称,即"VK_"后面的名称。
为了在发稿时仅触发一次事件,我建议注册新闻并发布事件以管理自己使用布尔值的闩锁。
有没有办法在输入映射上注册击键,以便在按下键时仅触发一次关联的操作?
从输入映射中删除按键绑定。然后,对于 keyRelease Action,您将 keyPressed 绑定添加回 InputMap。
但是,即使这样也可能导致问题,因为在 Windows 操作系统上,KeyEvents 的顺序是:
pressed, pressed, pressed.... released.
这对我来说是有道理的,因为通常当你按住键时,你希望角色重复。但是,在Mac上,我相信顺序是:
pressed, released, pressed, released, pressed, released
这对我来说没有意义,并且很难确定密钥何时真正发布。
"keytyped"事件按平台行为运行 - 自1980年代之前以来,作为标准,始终包括自动重复。这将由来自操作系统的低级事件驱动。
你可以试着不按住按键吗?你不应该捣碎键盘,它是一种精密仪器。
您可以更改击键绑定(以避免接收自动重复)或以其他方式使用自定义事件侦听器并仅处理一次低级键/键控事件。但是,低级事件可能会公开键码(因为它们低于实际键入任何一个字符的级别)而不是字符。