如何使用KeyAdapter检测CTRL + SHIFT + ANY_KEY?

时间:2017-02-20 20:49:10

标签: java swing keylistener keyevent key-events

这是我的代码:

        tabbedPane.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {

                CheckShortcut controlShortcut = (key) -> {
                    return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0);
                };

                CheckShortcut controlShiftShortcut = (key) -> {
                    return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK) != 0);
                }; // Does not work <<<<<

                if (controlShortcut.f(KeyEvent.VK_N)) {
                    createNewFile();
                } else if (controlShortcut.f(KeyEvent.VK_O)) {
                    openFile();
                } else if (controlShortcut.f(KeyEvent.VK_S)) {
                    save();
                } else if (controlShiftShortcut.f(KeyEvent.VK_S)) {
                    saveAs();
                } else if (controlShortcut.f(KeyEvent.VK_Q)) {
                    System.exit(0);
                } else if (controlShortcut.f(KeyEvent.VK_W)) {
                    MainFrame.toggleFrame(qrWebcamFrame);
                } else if (controlShortcut.f(KeyEvent.VK_C)) {
                    MainFrame.toggleFrame(comandaCreationFrame);
                } else if (controlShortcut.f(KeyEvent.VK_P)) {
                    if (accessPasswordFrame("Senha de administrador",
                            "Login: ", "Senha de administrador inválida.",
                            ADMIN_TYPE)) {
                        MainFrame.toggleFrame(passwordFrame);
                    }
                }

            }   
        });

controlShortcut完美无缺。然而,当我在测试中添加KeyEvent.SHIFT_MASK时,它不起作用。另外,当我这样做时:

        CheckShortcut controlShiftShortcut = (key) -> {
            return (evt.getKeyCode() == key) && ((evt.getModifiers() & KeyEvent.CTRL_MASK) != 0) && ((evt.getModifiers() & KeyEvent.SHIFT_MASK) != 0);
        };

它不起作用。我不明白为什么,因为我只是添加相同的测试。

3 个答案:

答案 0 :(得分:3)

这不是按位运算符的工作方式。 KeyEvent.CTRL_MASK & KeyEvent.SHIFT_MASK总是给0,因为你正在使用不同的面具。

您要做的是使用OR:

为两者创建一个掩码
int down = KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK;
if ((e.getModifiersEx() & down) == down && (e.getKeyCode() == KeyEvent.VK_D))
    System.out.println(true);

这将打印

  

仅当按下 ctrl + shift + D 时。

如果你写

(e.getModifiersEx() & down) != 0

它将检查是否按下 shift 任何(或两者)。

请注意,您应该使用getModifiersExX_DOWN_MASK而不是getModifiers以及X_MASK

答案 1 :(得分:0)

您在掩码上使用了错误的按位运算符 请参阅JavaDocs

正确的方法应该是:

frame.getContentPane().add(listDisplay, BorderLayout.EAST);

另见以下方法:

int mask = CTRL_DOWN_MASK | SHIFT_DOWN_MASK;
if(evt.getModifiersEx() & mask == mask) {doStuff();}  

答案 2 :(得分:0)

您可以为shift和control创建两个布尔值。

public class DummyClass implements KeyListener{
    boolean shift = false, control = false;

    public void KeyPressed(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_SHIFT)
        {
            shift = true;
        }        
        if(e.getKeyCode() == KeyEvent.VK_CONTROL)
        {
            control = true;
        }
        if(shift && control)
        { 
            //Do something 
        }
        else if(shift)
        { 
            //Do something
        }
        else if(control)
        { 
            //Do something 
        }
    }
    public void KeyReleased(KeyEvent e)
    {
        if(e.getKeyCode() == KeyEvent.VK_SHIFT)
        {
            shift = false;
        }        
        if(e.getKeyCode() == KeyEvent.VK_CONTROL)
        {
            control = false;
        }
    }
}