Кажется, не может создать экземпляр ненулевого FXMLLoader - PullRequest
2 голосов
/ 20 марта 2019

Я прочитал несколько похожих сообщений на эту тему, но не смог использовать их для решения своей проблемы.Я считаю, что моя неудача связана с пониманием, а не с тем, что я сталкиваюсь с уникальной проблемой.Но я нахожусь в полном тупике.

Я создаю приложение CRUD с использованием JavaFX.Одна из кнопок моего приложения, «Импорт данных», выдает NullPointerExceptions:

// *a button that opens a new window with a textField where the user can paste text data*
@FXML
private void importDataButton(ActionEvent event) {
    // *load the fxml file*
    URL viewLocation = getClass().getResource("/importView.fxml");
    // *get the file's controller*
    FXMLLoader loader = new FXMLLoader();
    ImportController importController = loader.getController();
    importController.setMainController(this);
    loader.setLocation(viewLocation);

    try {
        loader.load();
    } catch (IOException exception) {
        System.out.println("IO Exception thrown.");
        return;
    }
....
}

Я пока не очень хорошо отлаживаю IntelliJ, но я использовал его, чтобы определить, что объект FXMLLoader равен нулю.Поэтому, когда

importController.setMainController(this);

выполняется, генерируется исключение NullPointerException, поскольку объект , на который ссылается , равен нулю.Я думаю.Поэтому

ImportController importController = loader.getController();

не может извлечь контроллер из объекта FXMLLoader (загрузчик).

Для справки setMainController () находится в другом классе с именем ImportController, и код этого метода выглядит следующим образом:

public void setMainController(MainController mainController) {
    this.mainController = mainController;
}

Вещи, которые я пробовал:

Я прочитал этот пост и этот пост , обарекомендую мне запустить loader.load () [учитывая FXMLLoader loader = new FXMLLoader ()], чтобы получить данные из объекта.Тем не менее, я попробовал это, и я просто получаю ошибки при ошибках: InvocationTargetExceptions и IllegalStateExceptions.Я также попытался создать экземпляр объекта FXMLLoader, который не является нулевым, используя

FXMLLoader load = new FXMLLoader(getClass.getResource("sample.fxml"));

Но, похоже, он не влияет на содержимое объекта (и да, я заменяю "sample.fxml" намое имя файла.)

Я ненавижу делать подобное сообщение, но я не знаю, что делать.

1 Ответ

2 голосов
/ 20 марта 2019

Проблема в том, что вы звоните loader.getController() до loader.load(). Вот почему ваш importController равен нулю при вызове importController.setMainController(this).

Звоните loader.load() Сначала:

URL viewLocation = getClass().getResource("/importView.fxml");
FXMLLoader loader = new FXMLLoader(viewLocation);

try {
    loader.load();

    ImportController importController = loader.getController();
    importController.setMainController(this);
} catch (IOException exception) {
    exception.printStackTrace();
}

Но имейте в виду, что метод initialize() в вашем ImportController вызывается до setMainController().

...