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我知道,即使它比匿名类的语法糖更重要!很好的答案,正是我想要的。谢谢。很好的答案,正是我想要的。非常感谢。