【问题标题】:Java Swing: Key pressed key stroke on an `InputMap` triggers its action several times while holding down the keyJava Swing:“InputMap”上的按键击键在按住键的同时触发其动作多次
【发布时间】:2013-11-12 10:37:26
【问题描述】:

我注册了

getInputMap().put(KeyStroke.getKeyStroke("pressed RIGHT"), "go right");

在测试我得到的代码时:当我按住右箭头键时,该操作被重复触发,而不仅仅是我预期的一次。

有意思

getInputMap().put(KeyStroke.getKeyStroke("released RIGHT"), "stop");

只有在最终松开按键时触发才会停止。

有没有办法在输入映射上注册一个按键,以便在按键被按下时只触发一次相关的动作?

【问题讨论】:

    标签: java swing key-bindings keystroke pressed


    【解决方案1】:

    KeyStroke的文档:

    KeyStroke 表示键盘上的键操作,或等效项 输入设备。 KeyStrokes 只能对应于按下或释放 一个特定的键,就像 KEY_PRESSED 和 KEY_RELEASED KeyEvents 一样; 或者,它们可以对应于键入特定的 Java 字符, 就像 KEY_TYPED KeyEvents 一样。在所有情况下,KeyStrokes 都可以指定 修饰符(alt、shift、control、meta、altGraph 或组合 其中)必须在动作期间出现才能完全匹配。

    只触发一次,在发布的时候,我建议注册

    getInputMap().put(KeyStroke.getKeyStroke("typed RIGHT"), "go right");
    

    KeyStroke.getKeyStroke(String)的文档是:

    解析一个字符串并返回一个 KeyStroke。该字符串必须具有 以下语法:

  • 修饰符* (typedID | pressReleasedID)

  • 修饰符 := shift |控制 |控制 |元 |替代 |替代图
  • typedID := typed
  • typedKey := 长度为 1 的字符串,给出 Unicode 字符。
  • pressedReleasedID :=(按下 | 释放)键
  • key := KeyEvent 键代码名称,即“VK_”后面的名称。
  • 要仅触发一次事件,在 press 时间,我建议注册 press 和 release 事件,以使用布尔值管理自己的锁存器。

    【讨论】:

    • 这适用于焦点组件,但是当您的场景是 WHEN_IN_FOCUSED_WINDOW 时,KeyListener 没有帮助...
    【解决方案2】:

    有没有办法在输入映射上注册一个按键,以便在按键被按下时只触发一次相关的动作?

    从 InputMap 中移除 keyPressed 绑定。然后为 keyReleased Action 将 keyPressed 绑定添加回 InputMap。

    但是,即使这样也可能导致问题,因为在 Windows 操作系统上,KeyEvents 的顺序是:

    pressed, pressed, pressed.... released.
    

    这对我来说很有意义,因为通常当您按住键时您希望角色重复。但是,在 Mac 上,我相信顺序是:

    pressed, released, pressed, released, pressed, released
    

    这对我来说没有意义,并且很难确定何时真正释放了密钥。

    【讨论】:

      【解决方案3】:

      “key typed”事件按平台行为运行——自 1980 年代以来,作为标准行为,它始终包括自动重复。这将由来自操作系统的低级事件驱动。

      您可以尝试按住按键吗?你不应该捣碎键盘,它是一种精密仪器。

      您可以更改击键绑定(以避免接收自动重复)或以其他方式使用自定义事件侦听器并仅处理低级 keydown/keyup 事件一次。然而,低级事件可能会暴露 keycodes(因为它们低于实际键入任何一个字符的级别)而不是 characters

      【讨论】:

        猜你喜欢
        • 2016-03-11
        • 1970-01-01
        • 2013-01-23
        • 2019-05-19
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        相关资源
        最近更新 更多