b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ea){
System.exit(0);
}
});
我正在学习Java并看到了上面的代码。我不明白为什么该addActionlisetner
方法需要Actionlistener
参数。使用起来不是更简单System.exit(0)
吗?
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ea){
System.exit(0);
}
});
我正在学习Java并看到了上面的代码。我不明白为什么该addActionlisetner
方法需要Actionlistener
参数。使用起来不是更简单System.exit(0)
吗?
这就是 Java 的工作原理。您需要将匿名类的实例传递给该addActionListener()
方法(毕竟它是一个侦听器)。
这就是您使用 Java 7 或更早版本执行操作的方式。但是,使用Java 8,您可以使用 lambda 表达式来缩短代码(因为ActionListener是一个函数式接口):
// You can do this
b.addActionListener((ActionEvent) ae -> System.exit(0));
// or this
b.addActionListener((ActionEvent) ae -> {
System.exit(0);
});
// or even better, this
b.addActionListener(ae -> System.exit(0));
您可以参考API Java来找到问题的答案。
公共无效 addActionListener(ActionListener l)
将 ActionListener 添加到按钮。
参数:
l - 要添加的 ActionListener
例如,具体类JButton继承了addActionListener(ActionListener l)
类 javax.swing.AbstractButton 的方法。
当你这样做:
new ActionListener(){
public void actionPerformed(ActionEvent ea){
System.exit(0);
}
}
您正在创建ActionListener的匿名子类的实例。
ActionListener 是一个用于接收动作事件的接口。
API说:
对处理动作事件感兴趣的类实现此接口,并且使用该类创建的对象使用组件的 addActionListener 方法注册到组件。当动作事件发生时,该对象的 actionPerformed 方法被调用。
addActionListener 的参数指定事件处理程序类的实例作为组件的侦听器(在本例中为“ b ”)传递匿名类“ActionListener”的实例或您自己的类的实例(b.actionListener(this)) ,两者都可以。
基本上,当您按下按钮时,会调用类中的actionPerformed()
方法。ActionListener
你不能有b.addActionListener(System.exit(0));
,因为System.exit(0)
是一种方法。在 Java 中,您不能将方法作为参数传递,但可以传递类。