简而言之,我创建了一个类Something女巫有一个JFrame函数,我有一个标签和一个按钮。在按钮上我有一个addActionListener(new changeLabel())。 我在src包中为侦听器做了类changeLabel,但是当我启动应用程序并单击按钮时,在changeLabel上抛出NullPointerException
nameLabel.setText("名称已更改");
线。我想提一下,如果我在Something类中创建这个监听器类,那就完美了。 我不知道为什么抛出null异常,因为标签首先被初始化,然后按钮只想更改文本。 我试着制作一个getFunction,调用那个标签,我尝试使用对象Something,对象changeLabel等......但是没有用。 这是一些代码
package trying;
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.*;
public class Something {
JFrame frame;
JLabel changeName;
JButton button;
public void gui(){
frame = new JFrame();
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//is just an example
changeName = new JLabel("Stefan");
//is just an example
button = new JButton("Change");
button.addActionListener(new changeLabel());
frame.getContentPane().add(changeName, BorderLayout.NORTH);
frame.getContentPane().add(button, BorderLayout.SOUTH);
frame.setVisible(true);
}
public static void main(String args[]){
new Something().gui();
}
}
听众类
package trying;
import java.awt.event.*;
public class changeLabel extends Something implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
changeName.setText("Andrei");
}
}
我该如何解决这个问题?
答案 0 :(得分:1)
问题是因为changeLabel
类扩展了Something
,它将包含它自己的changeName
变量,该变量未初始化== {{1} }。强>
你可以:
null
实现私有类Something(良好实践)或changeLabel
传递给其构造函数。 JLabel
两种方式都不应延伸changeLabel
。
代码示例#1:
Something
代码示例#2:
public class Something {
JFrame frame;
JLabel changeName;
JButton button;
public void gui(){
frame = new JFrame();
frame.setSize(200, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//is just an example
changeName = new JLabel("Stefan");
//is just an example
frame.getContentPane().add(changeName, BorderLayout.NORTH);
button = new JButton("Change");
button.addActionListener(new changeLabel());
frame.getContentPane().add(button, BorderLayout.SOUTH);
frame.setVisible(true);
}
public static void main(String args[]){
new Something().gui();
}
class changeLabel implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
changeName.setText("Andrei");
}
}
}
public class Something {
...
public void gui() {
...
button.addActionListener(new changeLabel(changeName));
}
}