使用方法作为事件侦听器而不是 class

Use method as event listener instead of class

我总是为按钮等创建一个事件监听器:

class MyClass implements extends JPanel implements ActionListener{

      JButton btn1, btn2, btn3;      

      public Myclass(){
            ....
            btn1 = new JButton("button 1");
            btn1.addActionListener(this);
            ....
      }

      public void actionPerformed(ActionEvent e) {

            Object action = e.getSource();
            if(action = btn1){
                functionForBTN1();
            }
            else if(action = btn2){
                functionForBTN2();
            }
            else if(action = btn3){
                functionForBTN3();
            }

      }

      public void functionForBTN1(){...}
      public void functionForBTN2(){...}
      public void functionForBTN3(){...}

}

是否可以将事件直接定向到方法而不是 actionPerformed() 方法?类似于(伪代码):

class MyClass implements extends JPanel implements ActionListener{

          JButton btn1, btn2, btn3;      

          public Myclass(){
                ....
                btn1 = new JButton("button 1");
                btn1.addActionListener(this.functionForBTN1());
                ....
          }

          public void functionForBTN1(){...}
          public void functionForBTN2(){...}
          public void functionForBTN3(){...}
}

您可以使用匿名 类:

btn1.addActionListener(new ActionListener (){
     public void actionPerformed(ActionEvent e) {      
         // ....
     }
});

但是,如果您想像在第二个代码段中那样添加它,您可以执行以下操作:

final ActionListener listener = new ActionListener() {
    @Override
    public void actionPerformed(final ActionEvent e) {
        if (e.getSource() == btn1) {
            //...
        } else if (e.getSource() == btn2) {
            //...        
        }
    }
};

然后:

btn1.addActionListener(listener);
btn2.addActionListener(listener);

我个人更喜欢匿名 类,只要它们可读且不会太长。

如果您使用的是 Java 8,则可以使用 lambda 表达式完成此操作。

btn1.addActionListener(e -> this.functionForBTN1());

在 Java8 之前,您可以创建一个匿名的 ActionListener 来完成相同的任务。

btn1.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e){
        this.functionForBTN1();
    }
});

正如 Maroun Maroun 所说,匿名 class 是个好主意。使用 java-8 您还可以使用 lamdba 使代码稍微好一点;

btn1.addActionListener(event -> functionForBTN1());