3
b.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ea){
            System.exit(0);
        }
    });

我正在学习Java并看到了上面的代码。我不明白为什么该addActionlisetner方法需要Actionlistener参数。使用起来不是更简单System.exit(0)吗?

4

4 回答 4

2

这就是 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));
于 2016-02-20T11:45:35.343 回答
2

您可以参考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 方法被调用。

于 2016-02-20T11:59:13.730 回答
1

addActionListener 的参数指定事件处理程序类的实例作为组件的侦听器(在本例中为“ b ”)传递匿名类“ActionListener”的实例或您自己的类的实例(b.actionListener(this)) ,两者都可以。

于 2016-02-20T12:04:37.140 回答
0

基本上,当您按下按钮时,会调用类中的actionPerformed()方法。ActionListener

你不能有b.addActionListener(System.exit(0));,因为System.exit(0)是一种方法。在 Java 中,您不能将方法作为参数传递,但可以传递类。

于 2016-02-20T12:37:52.137 回答