ActionListener - 将动作添加到 JButtons 的 ArrayList

Posted

技术标签:

【中文标题】ActionListener - 将动作添加到 JButtons 的 ArrayList【英文标题】:ActionListener - adding action to a ArrayList of JButtons 【发布时间】:2015-11-07 11:58:57 【问题描述】:

我正在构建一个简单的计算器。为了生成所有这些按钮,我制作了一个 ArrayList,在循环中为数字初始化它们,并为其余的手动初始化:

        //Button Initialization
        for(int i=0; i<10; i++) 
            numberButtons.add(new JButton(""+i));   //indexes 0-9 of the ArrayList
        

        numberButtons.add(new JButton(","));        //index 10 and so on
        numberButtons.add(new JButton("C"));
        numberButtons.add(new JButton("+"));
        numberButtons.add(new JButton("-"));
        numberButtons.add(new JButton("\u221A"));
        numberButtons.add(new JButton("*"));
        numberButtons.add(new JButton("/"));
        numberButtons.add(new JButton("="));

我还为它们添加了 ActionListener:

        //Adding ActionListener
        EventHandling handler = new EventHandling(numberButtons);

        for (JButton buttons : numberButtons) 

            buttons.addActionListener(handler);
        

在另一个名为 EventHandling 的类中,我想根据按下的数字启动操作。我已经创建了这个:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;

public class EventHandling implements ActionListener 

     private ArrayList<JButton> numberButtons;

     public EventHandling(ArrayList<JButton> numberButtons) 

        this.numberButtons = numberButtons;
    

    public void actionPerformed(ActionEvent event) 


        if (event.getSource() == numberButtons.get(1)) 
            System.out.println("Button 1 works!");
        

        if (event.getSource() == numberButtons.get(2)) 
            System.out.println("Button 2 works!");
        

     


它工作得很好,但是我想知道是否有更好的方法来处理每个按钮事件而不是使用ifs。 我尝试过使用switch 语句,但它不适用于对象,并且这些按钮中的.getText() 似乎不是这样。

感谢您的回答!

【问题讨论】:

在类似的问题中有一个不错的 community-wiki-answer:***.com/a/31329139/476791 它展示了如何以通用方式创建按钮。 【参考方案1】:

您可以使用 event.getActionCommand() 。这将返回分配给事件源的字符串,在本例中为 JButton

public void actionPerformed(ActionEvent event) 


     switch (e.getActionCommand())
    
        case "1":System.out.println("pressed button 1");
            break;
        case "2":System.out.println("pressed button 2");
                break;
        case "*":System.out.println("pressed button *");
            break;
        case "\u221A":System.out.println("pressed button \\u221A");
            break;

    

 

【讨论】:

感谢您的回复。起初,我阅读了您的帖子并开始在网上搜索getActionCommand(),但它有点太复杂了(正在阅读中)。但是,一旦我回到家,我就运行了您的代码并理解了它 - 使用 ifs 或 switch 获取对象字符串比使用 indexOf 获取对象字符串更好。非常感谢!【参考方案2】:

另一种可能性:

public void actionPerformed(ActionEvent event) 
   int indx = numberButtons.indexOf( event.getSource() );
   if ( indx >= 0 ) 
      // indx is the index of the button that was pushed
   

【讨论】:

谢谢,不过@Ninth-tail 发布了一个更合适的解决方案。但是谢谢 - 我学到了新东西!

以上是关于ActionListener - 将动作添加到 JButtons 的 ArrayList的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中将 actionlistener 添加到文本字段

如何在 Java 中将 ActionListener 添加到 JButton 上

ActionListener添加到JButton但不起作用

在 ActionListener 中添加 GridBagLayout 时遇到问题

为打字游戏添加 ActionListener

从 JButton 中删除一个 ActionListener