我有一个应用程序,我使用插件管理器来加载插件:
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”,所以我的模块插件会在新窗口打开时收到通知,以便我可以从我的插件中修改它?
答案 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");
}
});