Java addActionLister参数

Java addActionLister参数,java,swing,event-handling,awt,Java,Swing,Event Handling,Awt,当我在addActionListener()调用中使用“此”引用时,我得到了预期的输出,如何直接使用对象调用实现它?当我使用jb.addActionListener(neweventHandling1())时 我收到错误-“线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常” 还需要将哪个对象传递给此方法addActionListener() 下面是由于上述错误而失败的代码 import javax.swing.*; import ja

当我在addActionListener()调用中使用“”引用时,我得到了预期的输出,如何直接使用对象调用实现它?当我使用jb.addActionListener(neweventHandling1())时

我收到错误-“线程“AWT-EventQueue-0”java.lang.NullPointerException中的异常”

还需要将哪个对象传递给此方法addActionListener()

下面是由于上述错误而失败的代码

import javax.swing.*;

import java.awt.event.*;

public class EventHandling1 implements ActionListener {

    JButton jb;

    public static void main(String[] args) {

        EventHandling1 eh = new EventHandling1();
        eh.go();
    }

    public void go() {
        JFrame jf = new JFrame();
        jb = new JButton("New button");
        jb.addActionListener(new EventHandling1());

        jf.getContentPane().add(jb);
        jf.setVisible(true);
        jf.setSize(700, 500);

    }

    public void actionPerformed(ActionEvent event) {
        jb.setText("Pressed!!");

    }

}

获取NPE是因为新EventHandling1对象中的jb变量为null,因为您从未在新对象上调用
go()
(您确实在原始对象上调用它,但这对新对象没有影响)。即使您不需要调用
go()
比如通过将所有内容折叠到EventHandling1构造函数中,您仍然会被困在一棵树上,因为jb变量将不会引用与显示的GUI相同的对象

我建议不要创建新的EventHandling1对象,而是更改EventHandling1,使其不实现ActionListener,然后创建一个新的ActionListener类(匿名内部类或私有内部类),并在参数中实例化该对象

e、 g

或者,如果侦听器变得更复杂,则使用独立的外部类,或者更好的是,使用控件对象。有时我会结合使用匿名内部类和控件对象,如下所示:

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (myControl != null) {
            myControl.myButtonAction(e);
        }
    }
});

你问:


在我的代码中,当我使用此引用时,它是否引用了引用jb的EventHandling1对象?>

当您使用
作为参数时,您使用的是当前显示的对象,该对象具有完全初始化的jb按钮jb。当您创建并传入一个新的事件处理1对象时,您正在传递一个不同的新对象(关键术语是新的),一个未显示的对象,一个没有初始化jb变量的对象--不好

另外,哪些所有对象都可以传递给addActionListener()?在你的代码中,它带走了MyEventHandler


您可以传入实现ActionListener接口的任何对象

在我的代码中,当我使用此引用时,它是否使用引用jb引用EventHandling1对象?另外,哪些所有对象都可以传递给addActionListener()?在你的代码中,它带走了MyEventHandler
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (myControl != null) {
            myControl.myButtonAction(e);
        }
    }
});