如何让我的自定义KeyListener
听取ALT
(或CTRL
的组合)+多个其他键的组合?
假设我希望应用程序执行11个不同的操作,具体取决于按下的键的组合。 ALT + 0
- ALT + 9
显然不会造成任何问题,而对于ALT + 1 + 0
(或“ALT + 10”,因为它可以在帮助文件或类似文件中描述)我找不到任何好处解决方案在网络上(或在我脑海中)的任何地方。我不相信this solution with a timer是唯一可行的方式。
提前一百万感谢任何建议!
编辑:操作0-9 +操作10 = 11个操作。谢谢@ X-Zero。
答案 0 :(得分: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);
请参阅KeyStroke的javadoc,了解获取KeyStroke时可以使用的不同代码。这些修饰符可以一起进行“或”运算,以表示各种键组合。如
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK
| java.awt.event.InputEvent.SHIFT_DOWN_MASK)
表示按下Ctrl + Shift
键的时间。
编辑:正如已经指出的那样,这不会回答你的问题,而应该被视为一些好的建议。
答案 1 :(得分:19)
您可以通过组合某些内容将KeyListener
用于此目的。请查看以下示例,该示例应放在重写的keyPressed(KeyEvent e)
方法中。
if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
System.out.println("Select All");
}
按下 Ctrl + a 时,将显示字符串Select All
。方法e.isControlDown()
检查是否按下 Ctrl 键。
同样,使用e.isAltDown()
方法可以使用相同的方法完成 Alt 组合键。
这背后的逻辑是,e.getKeyChar()
返回按键和按键的字符。 e.getKeyCode()
返回其ASCII码。按住 Ctrl 后,e.getKeyChar()
将不会返回a
,e.getKeyCode()
将是相同的65
。希望你明白这一点。随意问更多。
答案 2 :(得分:2)
ALT + 1 + 0(或" ALT + 10"因为它可以在帮助文件或类似文件中描述)
似乎与(你的一条评论)发生冲突:
因此,例如,如果用户想要更改第11列中的数据(将被称为" 10"),则他/她按ALT + 1 + [放开ALT和1] 0。
假设ALT + 10表示按下ALT,按下并释放1,按下并释放0,释放ALT'我建议尝试这个:
在keyPressed中,监听ALT键,激活一个布尔标志,isAltPressed,并创建一个缓冲区来保存发生的按键(比如一个字符串)。 在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
}
答案 3 :(得分:0)
appService.setName("john");
$scope.name = getName();
答案 4 :(得分:0)
我建议不要使用键组合,而是在窗口isVisible()
聚焦时考虑一些输入字段。该字段可以隐藏,如Windows的文件浏览器隐藏文件名搜索(输入目录,键入文件名和对应关系),或者是可见的,如在Ubuntu中。
除了修饰符之外,键组合不是为了包含多个键而设计的,尽管您可以实现此目的。
答案 5 :(得分:0)
我认为我使用的方式比较简单。如果KeyEvent是ev,那么如果你调查:
(int)ev.getKeyChar()
你发现 ctrl - a 是1, ctrl - b 是2,依此类推。我想用 ctrl - s 进行保存。所以我只使用:
(((int)ev.getKeyChar())==19)
检测它。不知道为什么,但它工作正常,而且:
ev.isControlDown() && ev.getKeyChar()=='s'
没有。