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

我收到错误-“线程“ 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()(您确实在原始对象上调用了它,但对新对象没有影响)。即使通过将所有内容折叠到EventHandling1构造函数中而无需调用go()语句,您仍然会陷入困境,因为jb变量将不会引用与显示的GUI相同的对象。

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

例如。,

import javax.swing.*;
import java.awt.event.*;

public class EventHandling1  {

    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 MyEventHandler());

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

    private class MyEventHandler implements ActionListener {
        public void actionPerformed(ActionEvent event) {
            jb.setText("Pressed!!");
        }
    }
}


或者,如果您的侦听器变得更加复杂,则可以使用独立的外部类,或者最好使用Control对象。有时我使用匿名内部类和控制对象的组合,如下所示:

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




你问:


  在我使用此引用的代码中,它是使用引用jb引用EventHandling1对象吗? >


当使用this作为参数时,您正在使用当前显示的对象,该对象带有完全初始化的JButton jb。当创建并传递一个新的EventHandling1对象时,您传递的是一个不同的新对象(关键术语是new),一个不显示,一个没有初始化的jb变量-不好。


  另外,哪些所有对象都可以传递给addActionListener()?在您的代码中使用MyEventHandler


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

09-29 22:36