Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at A_test.addButton(A_test.java:27)
at A_test.<init>(A_test.java:17)
at Main$1.run(Main.java:11)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
主要课程
import javax.swing.*;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new A_test();
}
});
}
}
A_test课程
import java.awt.event.*;
import javax.swing.*;
public class A_test implements ActionListener {
private JFrame jf;
public A_test() {
JFrame jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
jf.setVisible(true);
}
public void addButton() {
JButton jb = new JButton("Submit");
jf.getContentPane().add(jb);
jb.addActionListener(this);
jf.getContentPane().add(jb);
}
@Override
public void actionPerformed(ActionEvent ae) {
((JLabel) jf.getContentPane().getComponent(0)).setText("test");
}
}
我正在使用A_test类来创建一个带有标签和按钮的JFrame。当我按下按钮时,我希望应用程序将标签的文本更改为之前的“测试”。
答案 0 :(得分:4)
下面
JFrame jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
jf.setVisible(true);
您正在创建新的JFrame,而不是将私有实例变量分配给新的JFrame。 到达这一点时:
JButton jb = new JButton("Submit");
jf.getContentPane().add(jb);
jb.addActionListener(this);
jf.getContentPane().add(jb);
jf
仍然为空;
这样做:
jf = new JFrame("A simple swing Program");
jf.setSize(275,100);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JLabel jl = new JLabel("Swing powers the modern JAVA GUI");
jf.getContentPane().add(jl);
this.addButton();
答案 1 :(得分:1)
你有两个jf实例。一个是该类的成员,并未初始化。另一个是初始化的构造函数中的局部变量。因此,当调用addButton时,您尝试访问的成员变量为null,因此为NullPointerException。
答案 2 :(得分:1)
您应该开始使用Eclipse或netbeans等编辑器并注意警告。他们会告诉你到底出了什么问题(你的变量正在影响一个成员变量)。
Java提供了令人敬畏的警告 - Java的“挑剔”导致许多人认为语言更“困难”,但它实际上使它变得更容易。从长远来看,语法冗长的语言实际上要困难得多。