Компоненты Java Swing Init NullPointerException [дубликаты]

Я пытаюсь создать простое приложение, которое позволит вам выбрать некоторые файлы и поработать с ними. Я создал интерфейс через конструктор палитр JFrame, встроенный в IntelliJ IDEA.

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; 

}

Вот так выглядит мой класс приложения, являющийся основным пунктом приложения. Ни одно из полей не определено с помощью «нового» инициализатора, потому что 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();
    });
}

Что происходит, внутри метода initViews я устанавливаю слушателей, но он генерирует исключение NullPointerException. Внутри метода это выглядит так:

 buttonFolder.addActionListener(e -> {
        //code

}

Исключение:

Исключение в потоке "AWT-EventQueue-0" java.lang.NullPointerException

Нажав на ошибку, он указывает на строку, где я устанавливаю actionListener для buttonFolder.

Моя теория заключается в том, что каким-то образом возникает конфликт между начальным потоком приложения, потоком EDT, в котором должен выполняться / редактироваться графический интерфейс пользователя, и созданием компонентов между ними.

Я проверил, вызывается ли initViews в потоке EDT, и ответ - да. Я попытался инициализировать представления в рабочем приложении Swing, чтобы явно принудительно вызвать его в потоке EDT, но это не сработало. Я также попытался отложить добавление слушателей и так далее на 200-400 мс, чтобы дать графический интерфейс для инициализации, и у меня не было успеха.

С нетерпением жду любого ввода, спасибо.

Всего 1 ответ


Вы говорите, что IntelliJ IDEA делает new() для вас, но ... я не вижу его в вашем коде.

// Still null
private JButton buttonFolder;

В этом текущем состоянии buttonFolder имеет значение null. У вас есть два варианта:

// 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 - вместо этого создайте экземпляр.


Есть идеи?

10000