我的应用程序构建中有两个主屏幕,使用FXML(loginWindow和mainWindow)。 用户可以
现在我正在使用此方法通过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加载器?
答案 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();