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

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

假设我想要应用程序执行11个不同的操作,具体取决于按下的组合键。 ALT + 0ALT + 9显然不会造成任何问题,而对于ALT + 1 + 0 (或“ALT + 10”,因为它可以在帮助文件或类似的描述),我无法find一个好的解决schemenetworking(或在我的头)。 我不相信带有计时器的解决scheme是唯一可行的方法。

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

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

您不应该使用KeyListener进行这种交互。 而是使用键绑定,您可以在Java教程中阅读。 然后,您可以使用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); 

查看KeyStroke的javadoc获取您在获取KeyStroke时可以使用的不同代码。 这些修饰符可以“或”在一起来表示键的各种组合。 如

 KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, java.awt.event.InputEvent.CTRL_DOWN_MASK | java.awt.event.InputEvent.SHIFT_DOWN_MASK) 

表示何时Ctrl + Shift键。

编辑:正如已经指出的,这并不回答你的问题,而应该只是作为一些好的build议。

您可以通过组合某些东西来使用KeyListener 。 看看下面的例子,这个例子应该放在一个被重载的keyPressed(KeyEvent e)方法中。

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

按下Ctrl + a时,将显示string“全Select Alle.isControlDown()方法检查Ctrl键是否被按下。 同样,通过使用e.isAltDown()方法,可以使用相同的方法完成Alt键组合。

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

ALT + 1 + 0(或“ALT + 10”,如帮助文件或类似内容所述)

似乎与(从您的一个评论)冲突:

因此,例如,如果用户想要改变第11列中的数据(将被称为“10”),则他/她将按下ALT + 1 + [放弃ALT和1] 0。

假设ALT + 10的意思是“按ALT,按下并释放1,按下并释放0,释放ALT”,我build议试试这个:

在keyPressed中,监听ALT键,激活一个布尔标志isAltPressed,并创build一个缓冲区来保存发生的按键(比如一个string)。 在keyTyped中,如果isAltPressed是活动的,则将键代码附加到缓冲区。 在keyReleased中,再次监听ALT,打开条件查询缓冲区并执行操作。

  public void keyPressed (KeyEvent e){ if (e.getKeyCode() == KeyEvent.VK_ALT){ buffer = ""; //declared globally isAltPressed = true; } //declared globally } public void keyTyped (KeyEvent e){ if (isAltPressed) buffer.append (e.getKeyChar()); } public void keyReleased (KeyEvent e){ if (e.getKeyCode() == KeyEvent.VK_ALT){ isAltPressed = false; if (buffer.equals (4948)) //for pressing "1" and then "0" doAction(); else if (buffer.equals(...)) doOtherAction(); ... }//if alt } 
 import java.awt.*; import java.awt.event.*; class KDemo { public static void main(String args[]) { Frame f = new Frame(); f.setSize(500,500); f.setVisible(true); f.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e); if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK))) { System.exit(0); } } }); } } 

我会build议,而不是使用组合键,当窗口isVisible()和重点时,考虑一些input字段。 这个字段可以隐藏起来,就像Windows的文件资源pipe理器隐藏文件名search(input一个目录,input文件名和对应关注点),或者像Ubuntu一样是可见的。

除了修饰符以外,键组合并不是为了包含多个键而devise的,尽pipe您可以实现这一点。