addActionLister parameter



当我在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 对象,而是

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

相关内容

  • 没有找到相关文章

最新更新