0

我正在尝试制作一个简单的应用程序,它可以让您选择一些文件并对其进行一些逻辑处理。我通过 IntelliJ IDEA 中的 JFrame Palette 构建器创建了界面。

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; 

}

这就是我的 App 类的外观,它是应用程序的重点。没有使用“新”初始化程序定义任何字段,因为 IntelliJ 会自动为我执行此操作,如果我单击查看组件的用法(请参见以下屏幕截图): 变量的绑定 所以,我有我的应用程序扩展了 JFrame,我的 JButtons 由 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();
    });
}

发生了什么,在 initViews 方法中我设置了侦听器,但它抛出了 NullPointerException。在方法内部,它看起来像这样:

 buttonFolder.addActionListener(e -> {
        //code

}

例外:

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

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

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

我检查了是否在 EDT 线程上调用了 initViews,答案是肯定的。我尝试在 Swing 工作者中初始化视图以明确强制它在 EDT 线程上,但它不起作用。我还尝试将添加侦听器等推迟 200-400 毫秒以将 GUI 提供给 init,但我没有成功。

期待任何意见,谢谢。

4

1 回答 1

0

你说 IntelliJ IDEAnew()为你做了这些,但是......我在你的代码中没有看到它。

// 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 - 而是创建一个实例。

于 2020-01-15T11:59:24.400 回答