在我的应用程序中,我为窗口类型创建了两个单独的启动器。该过程是单页应用程序(SPA)或多文档接口。
为了确保正确管理这些窗口,我提供了类似于以下内容的启动器:
public static void openSPA(String spaFXML, String windowTitle, String iconString, double x, double y) {
try {
FXMLLoader loader = new FXMLLoader();
Parent node = loader.load(SPALauncher.class.getClassLoader().getResource(spaFXML).openStream());
Scene scene = new Scene(node);
scene.getStylesheets().add(SPALauncher.class.getClassLoader().getResource("css/application.css").toExternalForm());
Stage stage = new Stage();
SPAControllerBase controller = (SPAControllerBase)loader.getController();
controller.setScene(scene);
controller.setPrimaryStage(stage);
controller.buildAvailableLayoutMenu();
stage.setTitle(windowTitle);
stage.setScene(scene);
stage.setX(x);
stage.setY(y);
stage.getIcons().add(new Image(iconString));
stage.show();
controller.initSPA();
}catch(Exception e){
//process the error
}
}
如果不保留对已打开窗口的引用,是否有办法在JVM中查找该阶段?基本上,如果用户试图再次打开同一个窗口,我宁愿把它放在焦点上 - 不要再打开它。由于用户可能在不同的上下文中打开同一个阶段,我希望根据标题(这将是唯一的)来查看并打开或提前。
我知道我可以保留参考文献,但是我需要管理删除它们,我可以做...只是想知道是否有更好的方法?
谢谢!
答案 0 :(得分:3)
您可以使用StageHelper。getStages()(仅限JavaFX 8 // Java 8),或者定义您自己的类扩展Stage,并自己处理内部引用。
如果我是你,我宁愿选择第二种选择。事实上,StageHelper是内部API的一部分" JavaFX(尚未公开,也许它永远不会被公开)。
关于"自己处理内部引用",一些Singleton模式可以完成这项工作。那么你的发射器应该测试" CustomStage" (为了示例,让我们这样称它)已经被实例化(使用CustomStage类中的方法)。 注意:处理引用应该是启动器的工作,但似乎你不希望它发生。所以扩展阶段仍然是一个选择。