Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing:按下“InputMap”上的键时,会在按住键的同时触发其动作数次_Java_Swing_Key Bindings_Keystroke_Pressed - Fatal编程技术网

Java Swing:按下“InputMap”上的键时,会在按住键的同时触发其动作数次

Java Swing:按下“InputMap”上的键时,会在按住键的同时触发其动作数次,java,swing,key-bindings,keystroke,pressed,Java,Swing,Key Bindings,Keystroke,Pressed,我登记 getInputMap().put(KeyStroke.getKeyStroke("pressed RIGHT"), "go right"); 在测试我得到的代码时:当我按住向右箭头键时,动作会反复触发,而不是像我预期的那样只触发一次 有趣的是 getInputMap().put(KeyStroke.getKeyStroke("released RIGHT"), "stop"); 触发器仅在最终释放密钥时停止 是否有一种方法可以在输入地图上注册按键笔划,以便相关操作在按键时只触发一次

我登记

getInputMap().put(KeyStroke.getKeyStroke("pressed RIGHT"), "go right");
在测试我得到的代码时:当我按住向右箭头键时,动作会反复触发,而不是像我预期的那样只触发一次

有趣的是

getInputMap().put(KeyStroke.getKeyStroke("released RIGHT"), "stop");
触发器仅在最终释放密钥时停止

是否有一种方法可以在输入地图上注册按键笔划,以便相关操作在按键时只触发一次?

以下文档:

击键表示键盘上的键操作或等效操作 输入设备。击键只能对应于按下或释放 一个特定的按键,就像按键按下和按键释放按键事件一样; 或者,它们可以对应于键入特定的Java字符, 正如键入的按键事件一样。在所有情况下,击键都可以指定 修改器(alt、shift、control、meta、altGraph或其组合 其中)必须在行动期间出现,以实现精确匹配

要仅在发布时触发一次事件,我建议注册

getInputMap().put(KeyStroke.getKeyStroke("typed RIGHT"), "go right");
以下文件为:

解析字符串并返回击键。字符串必须具有 以下语法:

  • 修改器*(typedID | pressedReleasedID)

  • 修饰符:=shift | control | ctrl | meta | alt | altGraph
  • typedID:=键入的
  • typedKey:=长度为1的字符串,提供Unicode字符。
  • 按下释放按钮:=(按下释放)键
  • key:=KeyEvent密钥代码名,即“VK_”后面的名称

    要仅在按下时触发一次事件,我建议注册按下和释放事件,以使用布尔值管理自己的闩锁。

    按平台行为操作“按键类型”事件,自20世纪80年代以来,作为标准,它始终包括自动重复。这将由操作系统的低级事件驱动

    你可以试着不按钥匙吗?你不应该把键盘弄坏,它是精密仪器

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

    是否有一种方法可以在输入地图上注册按键笔划,以便相关动作在按键时只触发一次

    从InputMap中删除按键绑定。然后,对于keyReleased操作,将按键绑定添加回InputMap

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

    pressed, pressed, pressed.... released.
    
    这对我来说很有意义,因为通常当你按下键时,你希望角色重复。但是,在Mac上,我认为顺序是:

    pressed, released, pressed, released, pressed, released
    

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

    这适用于聚焦组件,但当您的场景是聚焦窗口中的
    时,
    KeyListener
    没有帮助。。。