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

时间:2015-01-17 21:32:56

标签: java swing actionlistener

我总是为按钮做一个事件监听器,如下所示:

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(){...}
}

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

您可以使用匿名类:

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

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

答案 2 :(得分:1)

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

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