如何在不重新加载FXML文件的情况下切换javafx应用程序控制器?

时间:2014-01-04 10:24:16

标签: javafx fxml

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

  • loginWindow 登录到 mainWindow
  • mainWindow 退出到 loginWindow

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

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();
}

此方法切换到登录和主窗口:

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加载器?

1 个答案:

答案 0 :(得分:0)

您可以创建控制器实例,然后将控制器设置为加载程序。

如果您只想为应用程序提供一个控制器实例,则可以使用singleton pattern来获取控制器。

来自Passing Parameters JavaFX FXML

的示例代码
CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2);

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

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