Java Swing:在“InputMap”上按键在按住该键的同时多次触发其操作



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年代之前以来,作为标准,始终包括自动重复。这将由来自操作系统的低级事件驱动。

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

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

    相关内容

    • 没有找到相关文章

    最新更新