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

时间:2011-10-21 15:14:40

标签: java swing combinations keylistener keyevent

如何让我的自定义KeyListener听取ALT(或CTRL的组合)+多个其他键的组合?

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

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

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

6 个答案:

答案 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()将不会返回ae.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'

没有。