Java 将方法用作事件侦听器而不是类

Java 将方法用作事件侦听器而不是类,java,swing,actionlistener,Java,Swing,Actionlistener,我总是为按钮创建一个事件侦听器,如下所示: class MyClass implements extends JPanel implements ActionListener{ JButton btn1, btn2, btn3; public Myclass(){ .... btn1 = new JButton("button 1"); btn1.addActionListener(t

我总是为按钮创建一个事件侦听器,如下所示:

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);

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

您可以使用匿名类:

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();
    }
});

如果您使用的是Java8,那么可以使用lambda表达式来实现这一点

btn1.addActionListener(e -> this.functionForBTN1());
在Java8之前,您可以创建一个匿名ActionListener来完成相同的任务

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

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

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

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

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

Nit:lambda仍然基于类,这只是对更冗长的匿名类隐藏的另一步。@user2864740我知道,即使它比匿名类的语法糖更重要!Nit:lambda仍然基于类,这只是对更冗长的匿名类隐藏的另一步。@user2864740我知道,即使它比匿名类的语法糖更重要!很好的答案,正是我想要的。谢谢。很好的答案,正是我想要的。非常感谢。