Java Swing组件初始化NullPointerException

Java Swing组件初始化NullPointerException,java,swing,user-interface,event-dispatch-thread,eventqueue,Java,Swing,User Interface,Event Dispatch Thread,Eventqueue,我正试图有一个简单的应用程序,让你挑选一些文件,并与他们做一些逻辑。 我通过IntelliJ IDEA中的JFrame调色板生成器创建了该界面 public class App extends JFrame implements ActionListener { JPanel panelComponent; private JButton buttonFolder; private JTextPane textPane; private JPanel myPanel; private JButt

我正试图有一个简单的应用程序,让你挑选一些文件,并与他们做一些逻辑。 我通过IntelliJ IDEA中的JFrame调色板生成器创建了该界面

public class App extends JFrame implements ActionListener {
JPanel panelComponent;
private JButton buttonFolder;
private JTextPane textPane;
private JPanel myPanel;
private JButton buttonCreatePackage;
private JTextField textFieldFolder;
private JLabel nameFolderUnderContentLabel;
private JButton buttonAdd;
private JPanel panelList;
private JScrollPane scrollPane;
private JPanel consolePanel;
private JScrollPane tableScrollPane;
private JTable table1; 
}

这就是我的应用程序类的外观,它是应用程序的要点。 没有一个字段是用“new”初始化器定义的,因为如果我单击“查看组件的用法”(请参见以下屏幕截图),IntelliJ会自动为我执行此操作: 因此,我的应用程序扩展了JFrame,我的JButton由IDE初始化和绑定,我这样启动它:

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
            myApp = new App();
            myApp.setVisible(true);
            control = true;
            myApp.initViews();
            myApp.document = (StyledDocument) myApp.textPane.getDocument();
            myApp.buttonCreatePackage.setEnabled(false);
            myApp.documentWriter = new DocumentWriter(myApp.document);
            myApp.setContentPane(myApp.myPanel);
        worker.execute();
    });
}
 buttonFolder.addActionListener(e -> {
        //code
在initViews方法中,我设置了侦听器,但它抛出了一个NullPointerException。在方法内部,它看起来就像这样:

  public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
            myApp = new App();
            myApp.setVisible(true);
            control = true;
            myApp.initViews();
            myApp.document = (StyledDocument) myApp.textPane.getDocument();
            myApp.buttonCreatePackage.setEnabled(false);
            myApp.documentWriter = new DocumentWriter(myApp.document);
            myApp.setContentPane(myApp.myPanel);
        worker.execute();
    });
}
 buttonFolder.addActionListener(e -> {
        //code
}

例外情况:

线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常

单击错误,它会将我指向在buttonFolder上设置actionListener的行

我的理论是,应用程序的初始线程、应该在其中完成/编辑GUI的EDT线程和它们之间的组件创建之间存在冲突

我已经检查了是否在EDT线程上调用了initViews,答案是肯定的。 我曾尝试在Swing worker中初始化视图,以显式地将其强制到EDT线程上,但没有成功。 我还尝试将添加侦听器等延迟200-400ms,以便将GUI提供给init,但没有成功

期待任何意见,
谢谢。

你说IntelliJ IDEA为你做了
new()
,但是。。。我在你的代码里没看到

// Still null
private JButton buttonFolder;
在此当前状态下,
buttonFolder
为空。您有两个选择:

// Change your class level button declaration to this:
private JButton buttonFolder = new JButton();
或者,让它保持原样,并从你的主要

// You probably want to go with this method - since you want to identify the button
buttonFolder = new JButton("This is button Folder");

您必须为每个JComponent执行此操作。最后,我建议不要扩展JFrame,而是创建一个实例。

从屏幕截图上看,项目有一个
App.form
文件,这似乎是IntelliJ保存使用GUI生成器结果的方式。我假设有问题中未显示的代码读取此内容并将其应用于字段。@VGR更有意义。这是因为我无法在当前VPN上查看图像。sleepToken不幸的是,在我的第一篇文章中,我无法将图片嵌入到文章中,因此它们会通过“(请参见下面的屏幕截图)”部分后的链接自动引用。正如@VGR所说,IntelliJ自动构建它,并用一个名称和一个id绑定它。我已经仔细检查了名称,结果很好。我也尝试过关闭按钮,但它确实是空的。我不知道的是为什么会发生这种情况。在buttonFolder.addActionListener之前,添加
System.out.println(buttonFolder)。然后再次运行该程序。如果程序的输出显示为
null
,则buttonFolder未正确初始化。如果是这样的话,我首先怀疑App.form包含打字错误,比如
binding=“buttonfolder”
之类的。