Java KeyListener: How to perform an action when two keys are pressed?

java, key-events, keylistener, swing

Solution

You are mixing key code and modifiers:

 if(k.getKeyCode()==KeyEvent.VK_A 
     && (k.getModifiers & KeyEvent.CTRL_MASK==KeyEvent.CTRL_MASK))

But more generally, it is better to use KeyBindings instead of KeyListener. It will make your life a lot easier and avoid you to have to make those kind of tests.

1.Create an Action like this:

 public class MyAction extends AbstractAction {

     public void actionPerformed(ActionEvent e) {
          JOptionPane.showMessageDialog(null, "OK");
     }
 }

2.Bind the action to the key stroke:

check.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "doSomething");
check.getActionMap().put("doSomething", new MyAction());

Caveats: I haven't tested this code so may have to fix minor glitches.

Problem

Please have a look at the following code ``` import java.awt.event.*; import javax.swing.*; import java.awt.*; public class KeyCheck extends JFrame { private JButton check; private JPanel panel; private FlowLayout flow; public KeyCheck() { check = new JButton("Check"); check.addKeyListener(new KeyWork()); panel = new JPanel(); panel.setLayout(new FlowLayout()); panel.add(check); getContentPane().add(panel); } private class KeyWork extends KeyAdapter { public void keyPressed(KeyEvent k) { if(k.getKeyCode()==KeyEvent.VK_CONTROL && KeyEvent.VK_A) { JOptionPane.showMessageDialog(null, "OK"); } } } public static void main(String[]args) { KeyCheck k = new KeyCheck(); k.setVisible(true); k.setSize(200,200); k.validate(); k.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } ``` In this case, I have added an keylister to the button and I need to it to display the Message "OK" when CTRL + A is pressed together (control key and "A" key). But the above code is wrong. So, please help me to get message when both the keys are pressed together.

Original source