【问题标题】:Not possible to point to the adress of the JavaFX-controller of a newly loaded FXML无法指向新加载的 FXML 的 JavaFX 控制器的地址
【发布时间】:2016-08-03 02:36:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: java javafx controller fxml


    【解决方案1】:

    在第二种情况下,您尝试在加载 FXML 之前检索控制器。由于控制器类是在 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);
        }
    }
    

    【讨论】:

    • 经过测试和验证,谢谢(还需要 9 分钟才能接受答案...)
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多