如何在不重新加载FXML文件的情况下切换javafx应用程序控制器? [英] How to switch javafx application controller without reloading FXML file?

查看:364
本文介绍了如何在不重新加载FXML文件的情况下切换javafx应用程序控制器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的应用程序构建中有两个主屏幕,使用FXML(loginWindow和mainWindow)。
用户可以

I have two main screens in my application build with FXML ( loginWindow and mainWindow ). User can


  • loginWindow 登录到 mainWindow

  • mainWindow 退出到 loginWindow

  • login from loginWindow to mainWindow
  • logout from mainWindow to loginWindow

现在我正在使用此方法通过fxml文件更改场景

Right now I'm using this method to change scene via fxml file

private Initializable replaceSceneContent(String fxml) throws Exception {

    FXMLLoader loader = new FXMLLoader();
    InputStream in = WRMS.class.getResourceAsStream(fxml);
    loader.setBuilderFactory(new JavaFXBuilderFactory());
    loader.setLocation(WRMS.class.getResource(fxml));

    AnchorPane page;
    try {
        page = (AnchorPane) loader.load(in);
    } finally {
        in.close();
    }

    Scene scene = new Scene(page);

    mainStage.setScene(scene);
    mainStage.sizeToScene();
    return (Initializable) loader.getController();
}

这种切换到登录和主窗口的方法:

And this methods to switch to login and main window:

private void gotoMain() {        
try {                
    MainController mainController = (MainController) replaceSceneContent("Main.fxml");                
    mainController.setApp(this);
} catch (Exception ex) {
    ex.printStackTrace();                
}
}

private void gotoLogin() {        
try {
    LoginController login = (LoginController) replaceSceneContent("Login.fxml");
login.setApp(this);
} catch (Exception ex) {
    log.error(WRMS.class.getName() + ex);

}
}

工作正常。只有一个问题是每次调用我的方法replaceSceneContent都是创建控制器的新实例。 我希望每个控制器只有一个实例并在它们之间切换。可能吗?
如果是,在这种情况下如何使用FXML加载器?

It is working fine. Only one problem is that my method replaceSceneContent every time it is called is creating new instance of controller. I would like to have only one instance of each controller and switch between them. Is it possible? If yes, how to use FXML loader in this case?

推荐答案

您可以创建一个控制器实例然后设置控制器进入装载机。

You can create a controller instance and then set the controller into the loader.

您可以使用单身模式获取控制器如果您只想为应用程序提供一个控制器实例。

You could get the controller using a singleton pattern if you wanted only a single instance of the controller for an application.

传递参数JavaFX FXML

CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2);

FXMLLoader loader = new FXMLLoader(
    getClass().getResource(
        "customerDialog.fxml"
    )
);
loader.setController(dialogController);

Pane mainPane = (Pane) loader.load();

这篇关于如何在不重新加载FXML文件的情况下切换javafx应用程序控制器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆