添加ActionLister参数

addActionLister parameter

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

我遇到错误 -"Exception in thread "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 变量为空,因为你从未在 新对象 上调用 go()(你调用它对原来的,但这对新的没有影响)。即使您通过将所有折叠到 EventHandling1 构造函数中来摆脱调用 go() 的需要,您仍然是一棵树,因为 jb 变量将不会引用与显示的 GUI 相同的对象。

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

例如,

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!!");
        }
    }
}

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

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

你问:

in my code when I am using this reference, is it referring EventHandling1 object with reference jb ? >

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

Also, which all objects can be passed to addActionListener() ? in your code its taking MyEventHandler

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