java - 将按键监听器或按键绑定(bind)添加到使用 ActionListener 的 JButton

标签 java swing jbutton keylistener

我需要一些帮助来将按键监听器或按键绑定(bind)添加到下一个示例中的按钮。我希望当我在键盘上按 A 或 B 时,做出与用鼠标按时相同的 Action 。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class NetTest {

    static JButton btnA = new JButton("A");
    static JButton btnB = new JButton("B");
    static JPanel jp = new JPanel();
    static JFrame jf = new JFrame("Test APP");
    static JLabel jl = new JLabel("Which button was clicked ?");

    static ActionListener action = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            jl.setText(((JButton)e.getSource()).getText());
        }
    };

    public static void main(String[] args) {
        jf.setVisible(true);
        jf.setSize(400, 400);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        jp.add(btnA);
        jp.add(btnB);
        jp.add(jl);
        jf.add(jp);

        btnA.addActionListener(action);
        btnB.addActionListener(action);
    }
}

最佳答案

为了监听KeyEvents,您需要使用 JComponent#getInputMap()JComponent#getActionMap()方法来放置要监听的输入事件和相应的操作。试试这个例子:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class Demo{

    private void initGUI(){
        AbstractAction buttonPressed = new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(e.getActionCommand());
            }
        };

        JButton submit = new JButton("Submit");
        submit.addActionListener(buttonPressed);

        /*
         * Get the InputMap related to JComponent.WHEN_IN_FOCUSED_WINDOW condition
         * to put an event when A key is pressed
         */
        submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_A,0), "A_pressed");
        /*
         * Add an action when the event key is "A_pressed"
         */
        submit.getActionMap().put("A_pressed", buttonPressed);

        /*
         * Same as above when you press B key
         */
        submit.getInputMap(javax.swing.JComponent.WHEN_IN_FOCUSED_WINDOW).
                put(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B,0), "B_pressed");
        submit.getActionMap().put("B_pressed", buttonPressed);

        JPanel content = new JPanel(new FlowLayout());
        content.add(new JLabel("Test:"));
        content.add(submit);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Demo().initGUI();
            }
        });

    }
}

注意:此示例在按下 JButton 或 A/B 键时使用相同的 AbstractAction,但输出将取决于谁是事件源。

注释 2:如果您使用 JComponent.WHEN_IN_FOCUSED_WINDOW 条件,则只要按下 A 或 B 键,您的操作就会执行。当您有诸如 JTextfieldJTextArea 之类的文本输入组件并且最终用户几乎肯定会多次按 A 或 B 键时,这种行为是不需要的。如果是这种情况,那么您必须使用 JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT 条件。

关于java - 将按键监听器或按键绑定(bind)添加到使用 ActionListener 的 JButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19066859/

相关文章:

java - 无法执行 android :onClick when trying send an image in email 的方法

java - REST Web 服务 JSON 格式

Java:无法使用代码计算中位数

java - 根据内容的大小设置框架最小尺寸

java - 将数据从 MySQL 加载到 JComboBox

java - 合并随机数游戏中按钮的 Action 监听器

java - 使用 Jackson 处理自定义 json 中的 "Unrecognized token"异常

java - 自定义类变量和 GUI 文本字段

java - 如何根据登录的用户设置可见的 JButton?

java - 如何设置某些特定 JButton 组件(在本例中为 btnPlus)的尺寸?