【问题标题】:How to add actionListener to each Button如何将 actionListener 添加到每个按钮
【发布时间】:2016-09-02 11:24:48
【问题描述】:

回答这个问题可能会让一些人感到困惑,但我会尽量以最好的方式提出我的问题。我正在使用 jdbc 和 gui。基本上我想显示(以按钮格式)从我的 sql 数据库接收到的特定数据。我可以正确获取数据并将其作为名称放入我的按钮数组中。换句话说,我有一个从我的数据库接收到的具有不同名称/文本的按钮的 ArrayList。因此我真的需要制作一个按钮数组列表,因为数据是动态填充的。我的问题是,我很困惑如何为每个按钮创建一个 actionListener。每次单击每个按钮时,它都必须显示与其名称相关的值。我不知道我应该如何至少将按钮的名称传递给我的 actionListener 方法(或动作事件处理程序)。如果您觉得它令人困惑,这里是我的按钮的代码。

todayTaskButton.add(new JButton(taskForToday.get(i)));
todayTaskButton.get(i).setPreferredSize(new Dimension(300,75));
todayTaskButton.get(i).setBackground(Color.GRAY);
todayTaskButton.get(i).setFont(new Font("Century Gothic",Font.PLAIN,30));
todayTaskButton.get(i).setForeground(Color.WHITE);
todayTaskButton.get(i).setFocusable(false);

非常感谢

【问题讨论】:

    标签: java swing user-interface actionlistener


    【解决方案1】:

    您不需要将按钮的名称传递给 ActionListener。它会被自动检测到。你只需要在你的类中实现方法actionPerformed(ActionEvent)

    然后将监听器添加到按钮:

    todayTaskButton.get(i).addActionListener(this);
    

    在您的actionPerformed 方法中,您可以:

    JButton b = (JButton) e.getSource();
    String text = b.getText();
    

    【讨论】:

    • 先生。谢谢你的回答。我有主要的想法。不过我习惯通过这种方式实现actionListener,JButton.addActionListener(this::methodName) {}
    • continuation:然后在我的类中实现 methodName。你能帮助我如何以我习惯的方式实施你的建议吗?非常感谢楼主
    【解决方案2】:

    老实说,您可以通过多种方式实现这一目标,问题在于为您选择合适的...

    你可以...

    为每个按钮创建一个匿名类,每次创建它们时

    todayTaskButton.get(i).addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent evt) {
            //...
        }
    });
    

    虽然这可行,但它会使代码变得非常混乱,您还需要一种方法以某种方式将操作映射回按钮,这可以使用actionCommand 属性或使用source 来完成属性,如果您不介意遍历可用按钮列表

    你可以...

    创建一个为每个按钮实现ActionListener 的目的构建类,它可能需要某种对数据的引用

    todayTaskButton.get(i).addActionListener(new TodayActionListener(taskForToday.get(i)));
    

    这更集中一点,因为您并不真正关心按钮,因为您对侦听器具有“今天”值,因此所有通常重复的代码都可以隔离到一个类中,您只需传入“变量”元素

    你可以...

    充分利用 Action API 并为每个按钮进行单独的、自包含的操作...

    public class TaskAction extends AbstractAction {
    
        public TodayAction(String task) {
            putValue(NAME, task);
        }
        
        @Override
        public void actionPerformed(ActionEvent e) {
            // Specific action for task
        }
        
    }
    

    那么你可以简单地使用

    todayTaskButton.add(new JButton(new TaskAction(taskForToday.get(i))));
    

    虽然这与前一个选项相似,但Action 是一个自包含的工作单元,并具有JButton 可以用来对其进行自我配置的许多属性。 Action 也可以重复用于JMenuItems 和键绑定,使其非常灵活

    请仔细查看How to Use Actions 了解更多详情

    【讨论】:

    • 完美答案先生!太感谢了。老实说,我还在探索 java swing 编程。我们被分配创建一个项目,这是我第一次做一个。非常感谢您的指导!
    • 先生。它完全有效。太感谢了。我将阅读有关您建议的链接的更多信息,以进一步了解这一点。我只是顺便复制了你的代码..谢谢!
    • 有人想强调一下投反对票的原因吗?答案如何不回答操作问题?可以通过哪些方式改进?
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2011-08-20
    相关资源
    最近更新 更多