2016-07-23 68 views
0

我正在開發一個具有幾個「子」FXML視圖的JavaFX應用程序。我正在努力確保所有的孩子都能使用「根」佈局。(JavaFX)如何在不知道控制器名稱的情況下將類的實例傳遞給FXML控制器?

這裏是我的應用程序的基本層次:

RootLayout 
    -> SubLayout1 
    -> UnknownLayout 

SubLayout1是從FXML文件創建時點擊了RootLayout一個按鈕。

SubLayout1控制器,I有代碼,將實例化並裝載UnknownLayout(FXML)和UnknownLayoutController(相關聯的控制器)文件動態:

FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString())); 
loader.setController(controller); 
loader.setRoot(this); 
loader.load(); 

兩個filecontroller分配只是之前FXML裝載正在完成。

由於我動態地這樣做,我不知道UnknownLayout或其控制器的實際名稱是什麼。

我的問題是,我不知道如何將RootLayout控制器的實例傳遞給UnknownLayoutController,因此它可以訪問該控制器中的方法。我有在每個UnknownLayoutController類中的方法,讓我的RootLayout控制器傳遞給它:

public void setRootLayoutController (RootLayoutController rootController) {} 

薪火RootControllerSubLayout1是不是一個問題,因爲我可以用構造函數傳遞。但是,如果不知道UnknownLayout的實際名稱,我將如何稱呼該方法?有沒有辦法從FXMLLoader區塊內調用新控制器的構造函數?任何「最佳實踐」方式來實現這一目標?

controller參考這裏創建:

StringBuilder controller = new StringBuilder(); 
controller.append(title + "Controller.java"); 

預先感謝您的任何幫助,您可以提供!

編輯:我已經嘗試了幾個其他的建議來完成這個任務,包括Passing Parameters JavaFX FXML,但是我發現的一切都假設我在運行前知道新控制器的名稱。

我也看了成實現在UnknownLayoutController一個接口,但後來我得到這個代碼NullPointerException錯誤:

UnknownLayoutInterface subController = loader.getController(); 
subController.setRootController(rootController); 

controller變量是一個字符串,確實持有有問題的控制器的名稱,但是有沒有辦法將字符串轉換爲同名的對象並以這種方式訪問​​它?

(我現在定義FXML fx:controller標記中的FXMLs控制器而不是代碼中)。

+0

*有沒有辦法從內部調用新的控制器的構造函數FXMLLoader塊嗎?*你能澄清一下嗎?你如何創建控制器?在fxml中使用'fx:controller'?使用工廠/策略/命令模式? – fabian

回答

0

我能夠通過簡化我的代碼以及基於文件名類的類型(這是動態確定),以解決情況:

Class subLayout; 
    SubLayout2Interface subInterface = null; 
    try { 
    subLayout = Class.forName([Full Package Name] + subLayoutTitle); 
    subInterface = (SubLayout2Interface) subLayout.newInstance(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
} 

subInterface.setRootController(this); 
相關問題