JavaFX是否提供了一种机制来检查Stage是否已经打开?

时间:2015-10-08 18:28:08

标签: javafx-8

在我的应用程序中,我为窗口类型创建了两个单独的启动器。该过程是单页应用程序(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中查找该阶段?基本上,如果用户试图再次打开同一个窗口,我宁愿把它放在焦点上 - 不要再打开它。由于用户可能在不同的上下文中打开同一个阶段,我希望根据标题(这将是唯一的)来查看并打开或提前。

我知道我可以保留参考文献,但是我需要管理删除它们,我可以做...只是想知道是否有更好的方法?

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以使用StageHelper。getStages()(仅限JavaFX 8 // Java 8),或者定义您自己的类扩展Stage,并自己处理内部引用。

如果我是你,我宁愿选择第二种选择。事实上,StageHelper是内部API的一部分" JavaFX(尚未公开,也许它永远不会被公开)。

关于"自己处理内部引用",一些Singleton模式可以完成这项工作。那么你的发射器应该测试" CustomStage" (为了示例,让我们这样称它)已经被实例化(使用CustomStage类中的方法)。 注意:处理引用应该是启动器的工作,但似乎你不希望它发生。所以扩展阶段仍然是一个选择。