2014-09-10 77 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() 

它可用於跟蹤當前打開的窗口。不再需要黑客了。