【问题标题】:ActionListener - adding action to a ArrayList of JButtonsActionListener - 将动作添加到 JButtons 的 ArrayList
【发布时间】: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() 似乎不是这样。

感谢您的回答!

【问题讨论】:

标签: java swing arraylist actionlistener


【解决方案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 发布了一个更合适的解决方案。但是谢谢 - 我学到了新东西!
猜你喜欢
  • 2014-10-26
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 2013-02-14
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多