无法指向新加载的 FXML 的 JavaFX 控制器的地址

Not possible to point to the adress of the JavaFX-controller of a newly loaded FXML

我正在加载几个 FXML 文件并尝试在它们各自的控制器中设置成员。然而,在一些神秘的情况下,我无法指向加载的 FXML 的控制器。起初我以为它只是实现 'Initialize' 的控制器,但经过一些测试后,情况并非如此。

这是一些代码和核心堆栈:

public void showLoginScreen() {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Login.fxml"));
        mMainScene.setRoot((Parent) loader.load());
        LoginController controller = loader.<LoginController>getController();
        //I am able to reach the controller from here
        controller.initManager(this);
    } catch (IOException ex) {
        Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void showMainView(String sessionID) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
        mMainController = loader.<MainController>getController();
        mMainScene.setRoot((Parent) loader.load());
        //TODO : I am not able to reach the controller from here
        System.out.println("pointer adress = " + mMainController);
        mMainController.initManager(this);
    } catch (IOException ex) {
        Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}

核心堆栈:

pointer adress = null

Caused by: java.lang.NullPointerException
    at controller.ControllerManager.showMainView(ControllerManager.java:40)
    at view.LoginController.handle(LoginController.java:49)
    ... 58 more

在第二种情况下,您试图在加载 FXML 之前检索控制器。由于控制器 class 是在 FXML 文件中定义的,加载器在加载 FXML 之前无法实例化它。

只需更改方法调用的顺序:

public void showMainView(String sessionID) {
    try {
        FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/Main.fxml"));
        // mMainController = loader.<MainController>getController();
        mMainScene.setRoot((Parent) loader.load());

        mMainController = loader.<MainController>getController();

        System.out.println("pointer adress = " + mMainController);
        mMainController.initManager(this);
    } catch (IOException ex) {
        Logger.getLogger(ControllerManager.class.getName()).log(Level.SEVERE, null, ex);
    }
}