当我在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 类,可以是匿名内部类,也可以是私有内部类,并在参数中实例化该对象。
例如,
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 对象时,您正在传递一个不同的新对象(键术语是新的),一个不显示的对象,一个没有初始化的 jb 变量的对象 -- 不好。
另外,哪些所有对象都可以传递给addActionListener()? 在你的代码中,它需要MyEventHandler
可以传入实现 ActionListener 接口的任何对象。