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

≡放荡痞女 提交于 2019-12-10 20:35:15

问题


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.


回答1:


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.




回答2:


You should use methods in event k:

if(k.isControlDown() && k.getKeyCode() == KeyEvent.VK_A) {

but remember that this will only work when your button is focused. For example when you add JTextField to your frame and write something in it - Ctrl+A won't work because JTextField is focused.




回答3:



        public void keyPressed(KeyEvent k)
        {
            if(k.getKeyCode() == KeyEvent.VK_A && (k.getModifiers & KeyEvent.CTRL_MASK) != 0)
            {
                JOptionPane.showMessageDialog(null, "OK");
            }
        }
    }



回答4:


You can also use key mnemonics or accelerators which is quite simple: 1. Mnemonics will open a menu 2. Accelerators will pressed the respective menu button

JMenuItem combination = new JMenuItem("Save File");
combination.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.CTRL_MASK));
        combination.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == find) {
                System.out.println("Ctrl+S pressed");
savefile();//depending on what your saving code is                    
                }

            }
        });


来源:https://stackoverflow.com/questions/10655010/java-keylistener-how-to-perform-an-action-when-two-keys-are-pressed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!