[英]How to work with FXML (pass or get values from interface) without using controller class in JavaFX?
[英](JavaFX) How to pass instance of class to an FXML controller without knowing that controller's name?
我正在開發具有幾個“子” FXML視圖的JavaFX應用程序。 我正在努力確保所有孩子都可以使用“根”布局。
這是我的應用程序的基本層次結構:
RootLayout
-> SubLayout1
-> UnknownLayout
SubLayout1
是從FXML文件時,點擊了一個按鈕創建RootLayout
。
在SubLayout1
控制器中,我有一些代碼將動態實例化並加載UnknownLayout
(FXML)和UnknownLayoutController
(關聯控制器)文件:
FXMLLoader loader = new FXMLLoader(getClass().getResource(file.toString()));
loader.setController(controller);
loader.setRoot(this);
loader.load();
在完成FXML加載之前就同時分配了file
和controller
。
由於我是動態進行的,因此我不知道UnknownLayout
或其控制器的實際名稱是什么。
我的問題是我不知道如何將RootLayout
控制器的實例傳遞給UnknownLayoutController
以便它可以訪問該控制器中的方法。 我在每個UnknownLayoutController
類中都有一個方法,該方法使我可以將RootLayout
的控制器RootLayout
給它:
public void setRootLayoutController (RootLayoutController rootController) {}
將RootController
傳遞給SubLayout1
並不是問題,因為我可以使用構造函數傳遞它。 但是,如果不知道UnknownLayout
的實際名稱,我將如何調用該方法? 有沒有辦法從FXMLLoader
塊中調用新控制器的構造函數? 有什么“最佳實踐”方法可以做到這一點?
我的controller
參考在這里創建:
StringBuilder controller = new StringBuilder();
controller.append(title + "Controller.java");
預先感謝您提供的任何幫助!
編輯:我已經嘗試了其他一些建議來實現此目的,包括傳遞參數JavaFX FXML ,但是我發現的所有內容都假設我在運行時知道新控制器的名稱。
我還研究了在UnknownLayoutController
實現一個接口,但是隨后在此代碼上收到NullPointerException錯誤:
UnknownLayoutInterface subController = loader.getController();
subController.setRootController(rootController);
controller
變量是一個String, 它確實包含有問題的控制器的名稱,但是甚至有沒有辦法將String轉換為相同名稱的Object並以這種方式訪問它呢?
(我現在在FXML fx:controller
標記中而不是在代碼中定義FXMLs控制器)。
我可以通過簡化代碼並根據文件名(動態確定)確定類類型來解決這種情況:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.