JavaFX中是否有“Scene Changed Listener”

时间:2014-09-10 22:16:43

标签: java javafx stage

我有一个应用程序,我使用插件管理器来加载插件:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        Platform.setImplicitExit(false);    

        try {
            AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("/StartWindow.fxml"));
            Scene scene = new Scene(root, 420, 215);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch(Exception e) {
        }

        try {
            final PluginManager pluginManager = new DefaultPluginManager();
            pluginManager.loadPlugins();
            pluginManager.startPlugins();
            List<Module> modules = pluginManager.getExtensions(Module.class);

            for (Module module : modules) {
                module.initModule(primaryStage);
            }
        } catch(Exception ex) {
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

加载fxml并显示窗口后,我加载了插件(Module.class)。每个模块都有一个initModule()方法,我调用它来初始化该插件。我将primaryStage传递给它,以便我可以对StartWindow进行更改,但是从StartWindow的控制器中我打开了多个窗口,其他fxmls与其他控制器一起。

我的问题是,有没有办法编写某种“SceneChangedListener”,所以我的模块插件会在新窗口打开时收到通知,以便我可以从我的插件中修改它?

4 个答案:

答案 0 :(得分:1)

您可以监视SceneProperty以查看附加到窗口的场景是否发生变化。

没有公共Java 8 API来监视JavaFX运行时已知的所有窗口。如果您想查看JavaFX source code,可以从不受支持的私有API获取该信息,但不建议大多数应用程序使用不受支持的私有API。可能在内部,ScenicView以这种方式工作,您可以通过询问ScenicView开发人员获得有关该过程的更多信息。

答案 1 :(得分:0)

由于似乎没有本机方法,最后我用一个更容易的技巧解决了这个问题,使用EventBus,每当我启动一个新窗口时我都会发送一个自定义事件。我的插件订阅了该活动。还将场景作为参数发送给事件,以便我的插件可以修改任何窗口。

答案 2 :(得分:0)

仅限那些将来可能会关注此事的人。从Java 9开始,Window类有一个公共静态可观察列表

public static ObservableList<Window> getWindows()

可用于跟踪当前打开的窗口。不再需要黑客了。

答案 3 :(得分:-2)

对于仍在寻找答案的人们,我在 primaryStage sceneProperty 中添加了监听器,并且能够检测到场景变化。

primaryStage.sceneProperty().addListener((observable, oldValue, newValue) -> {
        System.out.println("Scene changed");
        if (newValue == scene){
            System.out.println("Second Scene");
        }
    });