我在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接口的任何对象。