当前位置: 首页 > 面试题库 >

将按键绑定添加到从操作命令获取其操作的JButtons?

洪飞驰
2023-03-14
问题内容

我在另一个问题中找到了一种创建JButton的好方法,该JButton的操作可以
通过简单的方式编写和查看:

public JButton makeToolbarButton(String title, String actionCommand) {
    JButton button = new JButton(title);
    button.setActionCommand(actionCommand);
    button.addActionListener(this);
    return button;
}

此方法所在的类实现ActionListener,并且按钮命令由以下方式分配:

public void actionPerformed(ActionEvent e) {
    int action = Integer.parseInt(e.getActionCommand());
    switch(action) {
        case 1:
            System.out.println("This button pressed.");
        break;
    }
}

And the buttons are made by:

    JButton button1 = makeToolbarButton("Button 1", "1");

所以我的问题是:可以通过这种方法将KeyStrokes添加到按钮吗?我尝试过这样的事情(在makeToolbarButton方法内部):

    button.getInputMap().put(KeyStroke.getKeyStroke("B"), "button_pressed");
    button.getActionMap().put("button_pressed", button.getAction());

但是我认为这是行不通的,因为action命令实际上并未将操作分配给特定的按钮。有没有一种方法来添加一些
makeToolbarButton()方法和参数的按键就能做到这一点?


问题答案:

我认为您缺少ActionAPI的要点。AAction旨在提供一个独立的工作单元。这意味着
actionCommand实际上并不需要,因为 触发actionListener事件时,您确切知道执行事件的上下文

我还要避免使用KeyStroke.getKeyStroke(String),因为文本是您要执行的操作的冗长描述(即pressed B,但是,不必说,这是很痛苦的事情)

因此,以下内容演示了如何使用Actions并将它们分配给
按钮和键绑定

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ActionTest {

    public static void main(String[] args) {
        new ActionTest();
    }

    public ActionTest() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            add(createButton(new ActionOne(), KeyStroke.getKeyStroke(KeyEvent.VK_1, 0)));
            add(createButton(new ActionTwo(), KeyStroke.getKeyStroke(KeyEvent.VK_2, 0)));
        }

        public JButton createButton(Action action, KeyStroke keyStroke) {
            JButton btn = new JButton(action);
            btn.getInputMap(WHEN_IN_FOCUSED_WINDOW).put(keyStroke, "button_pressed");
            btn.getActionMap().put("button_pressed", action);
            return btn;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.dispose();
        }

    }

    public class ActionOne extends AbstractAction {

        public ActionOne() {
            putValue(NAME, "1");
            putValue(Action.ACTION_COMMAND_KEY, "Action.one");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(e.getActionCommand());
        }

    }

    public class ActionTwo extends AbstractAction {

        public ActionTwo() {
            putValue(NAME, "2");
            putValue(Action.ACTION_COMMAND_KEY, "Action.two");
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println(e.getActionCommand());
        }

    }

}

See How to Use
Actions for
more details



 类似资料:
  • 启动多个whistle 如果你想在同一台机器启动多个whistle,方便多个浏览器或者供多人使用,有两种方式: 切换到不同的系统用户,在每个系统用户启动一个whistle代理服务(每个服务的端口号可以用命令行参数w2 start -p xxxx来指定) 也可以通过切换规则目录和端口号的方式来解决(注意S、C都是大写, newStorageDir为空表示使用当前配置) w2 start -S new

  • 1. echo :在命令行打印一些内容 redis 127.0.0.1:6379> echo HongWan “HongWan” 2. quit :退出连接。 redis 127.0.0.1:6379> quit 3. -x选项从标准输入(stdin)读取最后一个参数。 比如从管道中读取输入: echo -en “chen.qun” | redis-cli -x set name 4. -r -i

  • 本文向大家介绍C#获取注册表指定键值操作,包括了C#获取注册表指定键值操作的使用技巧和注意事项,需要的朋友参考一下 某些程序必须依赖指定运行环境。那么读取注册表来判断此电脑是否有执行环境是个很不错的办法。因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的。 那么首先就需要找到那个具体的独一无二的键值,以便程序在运行之前能够去读取以判断。 代码如下: 现在查找含有E:\Arc

  • 标准 go 语言项目文件目录格式 项目文件夹就是 GOPATH 指向的文件夹 src 文件夹是专门用于存放源码文件的 main 文件夹是专门用于存储 package main 包相关源码文件的 其它文件夹是专门用于存储除 package main 包以外源码文件的 bin 文件夹是专门用于存储编译之后的可执行程序的 pag 文件夹是专门用于存储编译之后的 .a 文件的 |---项目文件夹 ----

  • 我做了,有一个按钮,我想在通知和按钮点击上执行两个不同的

  • 主要内容:常用命令Redis string 类型提供了一些专门操作 数值的命令,比如 INCRBY(自增)、DECRBR(自减)、INCR(加1) 和 DECR(减1) 等命令。数值操作,同样有特定的应用场景,比如常见的点赞、取消点赞、关注、取消关注等,这类和计数相关的场景都可以使用数值操作来实现。 注意:此时  key 对应的 value 值是必须是一个整数,或浮点数,使用命令对这个数值进行自增或自减操作。当然,