繁体   English   中英

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

[英]How can a KeyListener detect key combinations (e.g., ALT + 1 + 1)

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

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

预先感谢一百万的任何建议!

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

您不应将 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 时可以使用的不同代码,请参阅KeyStroke的 javadoc。 这些修饰符可以组合在一起来表示各种键组合。

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

表示Ctrl + Shift键的时间。

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

为此,您可以通过组合某些东西来使用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键是否被按下。 同样, Alt键组合可以通过使用e.isAltDown()方法使用相同的方法完成。

这背后的逻辑是, 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”,我建议尝试以下操作:

在 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
    }
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);
                   }
               }
           });
        }
   }

我建议不要使用组合键,而是在窗口isVisible()和焦点时考虑一些输入字段。 该字段可以隐藏,如 Windows 的文件资源管理器隐藏文件名搜索(输入目录,键入文件名并集中对应),或者是可见的,如在 Ubuntu 中。

组合键不是为包含多个键而不是修饰符而设计的,尽管您可以实现这一点。

我认为我正在使用一种更简单的方法。 如果 KeyEvent 是 ev 那么如果你调查:

(int)ev.getKeyChar()

你发现ctrl - a是 1, ctrl - b是 2 等等。 我想使用ctrl -s进行保存。 所以我只是使用:

(((int)ev.getKeyChar())==19)

检测它。 不知道为什么,但它工作正常,而:

ev.isControlDown() && ev.getKeyChar()=='s'

才不是。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM