我总是为按钮做一个事件监听器,如下所示:
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(){...}
}
答案 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());