gpt4 book ai didi

java - 添加ActionLister参数

转载 作者:行者123 更新时间:2023-11-29 05:04:28 24 4
gpt4 key购买 nike

当我在 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 变量为空,因为您从未在 新对象 上调用 go()(您调用它对原来的,但这对新的没有影响)。即使你摆脱了调用 go() 的需要,比如通过将所有折叠到 EventHandling1 构造函数中,你仍然卡在树上,因为 jb 变量不会引用同一个对象作为显示的 GUI。

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

例如,

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

你问:

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

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

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

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

关于java - 添加ActionLister参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30873718/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com