【问题标题】:Is there any 'Scene Changed Listener' in JavaFXJavaFX 中是否有任何“场景更改侦听器”
【发布时间】:2014-09-10 22:16:43
【问题描述】:

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

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”,以便在打开新窗口时通知我的模块插件,以便我可以从我的插件中修改它?

【问题讨论】:

    标签: java javafx stage


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      仅适用于将来可能会关注此内容的人。从 Java 9 开始,Window 类有一个公共的静态可观察列表

      public static ObservableList<Window> getWindows()
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-05-17
          • 1970-01-01
          • 2023-03-20
          • 2021-01-14
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          相关资源
          最近更新 更多