是否有任何的JavaFX
问题描述:
“场景改变监听器”我有一个应用程序,我用一个插件管理器加载插件:我加载FXML,并显示该窗口后是否有任何的JavaFX
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);
}
}
,我加载插件( Module.class)。每个模块都有一个initModule()方法,我调用它来初始化该插件。我将primaryStage传递给它,以便我可以在StartWindow上进行更改,但是从StartWindow的控制器中打开多个窗口,其他fxmls与其他控制器打开。
我的问题是,有没有办法写某种“SceneChangedListener”的,所以我的模块插件将被通知,如果一个新窗口打开,这样我可以从我的插件修改呢?
答
有一个SceneProperty您可以监视,看看如果场景附加到一个窗口的变化。
没有公共Java API 8监控所有已知的JavaFX运行的窗口。如果您想查看JavaFX source code,您可能会发现该信息可以从不受支持的私有API获得,但不建议在大多数应用程序中使用不受支持的私有API。可能在内部,ScenicView以这种方式工作,您可以通过询问ScenicView开发人员获得更多有关该过程的信息。
答
,因为它似乎没有对此没有本地方法,最后我解决这个问题有一个更容易的伎俩,利用EventBus,我每次当我火了一个新的窗口时间发送自定义事件。我的插件订阅了该事件。还发送场景作为参数与事件,所以我的插件可以修改任何窗口。
答
只为那些可能在未来看到这个。自Java 9以来,Window类具有公共静态可观察列表
public static ObservableList<Window> getWindows()
它可用于跟踪当前打开的窗口。不再需要黑客了。