java—keylistener如何检测组合键(例如alt+1+1)

6jjcrrmo  于 2021-07-03  发布在  Java
关注(0)|答案(6)|浏览(559)

我怎样才能让我的习惯 KeyListener 听一听这些词的组合 ALT (或 CTRL 就这一点而言,你还有其他的钥匙吗?
假设我有11个不同的操作,我希望应用程序执行,这取决于按下的键的组合。 ALT + 0 - ALT + 9 显然不会带来任何问题 ALT + 1 + 0 (或者“alt+10”可以在帮助文件或类似文件中描述)我在网络上(或在我的头脑中)找不到一个好的解决方案。我不相信这个带定时器的解决方案是唯一可行的方法。
提前感谢您的建议!
编辑:操作0-9+操作10=11个操作。谢谢@x-zero。

w8rqjzmb

w8rqjzmb1#

我想我用的是一种更简单的方法。如果keyevent是ev,那么如果您调查:

(int)ev.getKeyChar()

你会发现ctrl-a是1,ctrl-b是2,依此类推。我想用ctrl-s保存。所以我就用:

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

去发现它。不知道为什么,但效果很好

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

没有。

3okqufwl

3okqufwl2#

我建议不要使用组合键,而是在窗口打开时考虑一些输入字段 isVisible() 而且很专注。该字段可以是隐藏的,就像windows的fileexplorer隐藏文件名搜索(输入一个目录,键入文件名,然后将对应的文件集中起来),也可以是可见的,就像在ubuntu中一样。
组合键不是为包含除修饰语以外的多个键而设计的,尽管您可以实现这一点。

fwzugrvs

fwzugrvs3#

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

smdncfj34#

alt+1+0(或“alt+10”,如帮助文件或类似文件所述)
似乎与(你的一条评论)有冲突:
因此,例如,如果用户想要更改第11列中的数据(称为“10”),他/她会按alt+1+[放弃alt和1]0。
假设alt+10表示“按下alt,按下并释放1,按下并释放0,释放alt”,我建议尝试以下操作:
在keypressed中,监听alt键,激活一个布尔标志isaltpressed,并创建一个缓冲区来保存发生的按键(比如说字符串)。在keytyped中,如果isaltpressed处于活动状态,则将键代码附加到缓冲区。在keyreased中,再次监听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
    }
vwhgwdsa

vwhgwdsa5#

你可以用 KeyListener 为了这个目的,把某些东西结合起来。请看下面的示例,它应该放在 keyPressed(KeyEvent e) 方法。

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

绳子 Select All 按ctrl+a时将显示。方法 e.isControlDown() 检查是否按下ctrl键。类似地,alt组合键也可以通过使用 e.isAltDown() 方法。
这背后的逻辑是, e.getKeyChar() 返回按键的字符 e.getKeyCode() 返回其ascii码。按住ctrl键时 e.getKeyChar() 不会再回来了 a 以及 e.getKeyCode() 会是一样的 65 . 希望你能理解。请随便问更多。

abithluo

abithluo6#

对于这种类型的交互,不应使用keylister。而是使用键绑定,您可以在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);

请参阅javadoc以获取击键时可以使用的不同代码。这些修饰语可以组合在一起表示各种键的组合。例如

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

代表 Ctrl + Shift 钥匙被按下了。
编辑:正如已经指出的,这并不能回答你的问题,而是应该作为一些好的建议。

相关问题