2014-09-10 79 views
0

“场景改变监听器”我有一个应用程序,我用一个插件管理器加载插件:我加载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”的,所以我的模块插件将被通知,如果一个新窗口打开,这样我可以从我的插件修改呢?

回答

1

有一个SceneProperty您可以监视,看看如果场景附加到一个窗口的变化。

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

0

,因为它似乎没有对此没有本地方法,最后我解决这个问题有一个更容易的伎俩,利用EventBus,我每次当我火了一个新的窗口时间发送自定义事件。我的插件订阅了该事件。还发送场景作为参数与事件,所以我的插件可以修改任何窗口。

0

只为那些可能在未来看到这个。自Java 9以来,Window类具有公共静态可观察列表

public static ObservableList<Window> getWindows() 

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