我正在尝试制作一个简单的应用程序,它可以让您选择一些文件并对其进行一些逻辑处理。我通过 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,但我没有成功。
期待任何意见,谢谢。