哪种方法正确?多个ActionListener与一个ActionListener

时间:2019-04-07 02:02:16

标签: java swing actionlistener

哪种方式实现ActionListener更正确? 有什么主要的性能差异吗?

在类中实现ActionListener

public class MainFrame implements ActionListener {

    JButton exampleButton1 = new JButton();
    JButton exampleButton2 = new JButton();
    JButton exampleButton3 = new JButton();

    public MainFrame(){
        exampleButton1.addActionListener(this);
        exampleButton2.addActionListener(this);
        exampleButton3.addActionListener(this);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();

        if(src.equals(exampleButton1)){
            //Do something
        }else if(src.equals(exampleButton2)){
            //Do something
        }else if(src.equals(exampleButton3)){
            //Do something
        }
    }
}

相对于向每个JButton添加ActionListeners:

public class MainFrame {

    JButton exampleButton1 = new JButton();
    JButton exampleButton2 = new JButton();
    JButton exampleButton3 = new JButton();

    public MainFrame(){
        exampleButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });

        exampleButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });

        exampleButton3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });
    }
}

或者甚至可以使用Lambdas。?

2 个答案:

答案 0 :(得分:3)

我希望使用单独的Word作为按钮的侦听器。 Action是稍微高级一点的侦听器,可以在可以使用ActionListener的任何地方使用。

它提供了其他功能,例如:

  1. 同一Action可以被多个组件(例如JButton,JMenuItem)使用。
  2. 您可以禁用操作,这将禁用所有使用该操作的组件
  3. 它允许为您的组件分配助记符和加速器

有关此概念的更多信息和示例,请参见https://nlp.stanford.edu/nlp/javadoc/javanlp/index.html?edu/stanford/nlp/ling/Word.html上的Swing教程。

答案 1 :(得分:0)

您可以发现,对于单个ActionListener方法来说,每个单个if测试都有三个分支,按下了那个按钮。尚未执行任何操作,因此没有实际动作,只是测试按下了哪个按钮。

  • 现在,如果要实现高质量的工作,可以使用branch coverage之类的指标。首先,如果您采用单一的ActionListener方法,那么每个if都会创建两个分支。因此,您必须拿出6个测试来测试ActionListener的基本概念是否正确运行,以便找出按下了哪个按钮以及是否使用了正确的部件。这是一些开销的工作。

  • 其次,这里有单一责任范式(SRP)。它指出,每个班级仅应负责一项任务。现在,单个ActionListener正在处理三件事。

  • 第三,单个ActionListener的重用非常有限,并且在很大程度上取决于按钮。

  • 第四,我也将这种单一的ActionListener方法称为Manual written Object Orientation,因为如果没有面向对象的方法,而您必须进行切换,或者如果/否则,这将是一种方法。调用不同的方法,例如exampleButton1Pressed()exampleButton2Pressed()等。但是,这可以通过三个专用的ActionListener来实现。

因此,请专门使用ActionListener