Контроллер JavaFX возвращает значение null

#javafx #model-view-controller

Вопрос:

Я пытаюсь вызвать функцию setTodos, которая находится в контроллере OverviewController. Когда я пытаюсь сделать это таким образом, это не работает, потому что контроллер равен нулю. Кто-нибудь знает, в чем здесь может быть проблема? (не очень много знаю о JavaFX…)

 @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("view/JavaTodoApp.fxml"));
        primaryStage.setTitle("JavaTodoApp");
        primaryStage.setScene(new Scene(root, 600, 500));
        primaryStage.show();
        // access to controller
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/JavaTodoApp.fxml"));
        OverviewController controller = loader.getController();
        controller.setTodos(this);
    }
 

Комментарии:

1. можете ли вы показать свой файл fxml, я думаю, вы неправильно установили контроллер в файле fxml

2. Контроллер не создается до тех пор, пока не будет загружен FXML. Нет смысла вызывать методы на контроллере, который ничем не управляет.

3. В FXML-файле подключен контроллер. Откроется окно, а затем я попытаюсь получить данные в своем представлении списка с помощью метода setTodos. Какие-нибудь другие решения?

Ответ №1:

Вам нужно загрузить FXML из FXMLLoader созданного вами экземпляра, а не из статического метода.

 @Override
public void start(Stage primaryStage) throws Exception {

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(Main.class.getResource("view/JavaTodoApp.fxml"));
    Parent root = loader.load();
    OverviewController controller = loader.getController();
    controller.setTodos(this);

    primaryStage.setTitle("JavaTodoApp");
    primaryStage.setScene(new Scene(root, 600, 500));
    primaryStage.show();
}