java - 有人能解释一下为什么我在 Java 中遇到这个错误吗?

标签 java swing

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_测试类

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。当我按下按钮时,我希望应用程序将标签文本从之前的文本更改为“测试”。

最佳答案

这里

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,而不是将私有(private)实例变量分配给新的 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();

关于java - 有人能解释一下为什么我在 Java 中遇到这个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344989/

相关文章:

java - 如何通过另一个构造函数添加到数组列表?

java - 如何修复 Can not set io.appium.java_client.android.AndroidElement 错误

java - Swing 中的堆栈面板

java - 鼠标点击事件改变颜色

java - 更新 Java Swing 应用程序中的按钮状态

java - 如何刷新 Java 串行 InputStream?

java - 关于java中的方法重载

java - 可以退出代码还是应该终止 main ?

java - 向图例添加监听器

Java Swing [JDialog]