KeyListener如何检测组合键(例如,ALT + 1 + 1)
我怎样才能让我的自定义KeyListener
监听ALT
(或CTRL
组合)+多个其他键?
假设我想要应用程序执行11个不同的操作,具体取决于按下的组合键。 ALT + 0
– ALT + 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 All
。 e.isControlDown()
方法检查Ctrl键是否被按下。 同样,通过使用e.isAltDown()
方法,可以使用相同的方法完成Alt键组合。
这背后的逻辑是, e.getKeyChar()
返回键按下的字符& e.getKeyCode()
返回它的ASCII码。 当按住Ctrl键时, e.getKeyChar()
将不会返回a
和e.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您可以实现这一点。