KeyListener如何检测组合键(例如,ALT + 1 + 1)

s.d*_*s.d 19 java swing combinations keyevent keylistener

我怎样才能让我的自定义KeyListener听取ALT(或者CTRL说那个)+多个其他键的组合?

假设我希望应用程序执行11个不同的操作,具体取决于按下的键的组合.ALT + 0- ALT + 9显然不会造成任何问题,而对于ALT + 1 + 0(或"ALT + 10",因为它可以在帮助文件或类似文件中描述),我无法在网络上(或在我脑海中)的任何地方找到一个好的解决方案.我不相信这种带定时器的解决方案是唯一可行的方法.

提前一百万感谢您的任何建议!

编辑:操作0-9 +操作10 = 11个操作.谢谢@ X-Zero.

Jon*_*ner 27

您不应该将KeyListener用于此类交互.而是使用键绑定,您可以在Java Tutorial中阅读.然后,您可以使用InputEvent掩码来表示何时删除各种修饰键.例如:

// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                            java.awt.event.InputEvent.CTRL_DOWN_MASK),
                    "actionMapKey");
component.getActionMap().put("actionMapKey",
                     someAction);
Run Code Online (Sandbox Code Playgroud)

有关在获取KeyStroke时可以使用的不同代码,请参阅KeyStroke的javadoc .这些修饰符可以一起进行"或"运算,以表示各种键组合.如

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                       java.awt.event.InputEvent.CTRL_DOWN_MASK
                       | java.awt.event.InputEvent.SHIFT_DOWN_MASK)
Run Code Online (Sandbox Code Playgroud)

表示Ctrl + Shift按下按键的时间.

编辑: 正如已经指出的那样,这不会回答你的问题,而应该只是作为一些好的建议.

  • 我同意100%推荐你的推荐键绑定并因此而对你的答案进行了投票,但这个答案并没有解决他的主要问题:捕获alt +两个不同的按键组合. (3认同)

Sas*_*nan 19

您可以KeyListener通过组合某些内容来实现此目的.请看下面的示例,该示例应放在重写的keyPressed(KeyEvent e)方法中.

if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
        System.out.println("Select All"); 
}
Run Code Online (Sandbox Code Playgroud)

按下+ Select All时将显示该字符串.该方法检查是否按下了键.类似地,可以使用相同的方法通过使用方法来完成组合键.Ctrlae.isControlDown()CtrlAlte.isAltDown()

这背后的逻辑是,e.getKeyChar()返回按键的字符并e.getKeyCode()返回其ASCII码.当Ctrl按住时,e.getKeyChar()将不会返回a并且e.getKeyCode()将是相同的65.希望你明白这一点.随意问更多.