2015-05-26 84 views
0

是否可以將兩個FXML(JavaFX)文件連接到一個控制器? 我不能在每個FXML文件中更改「FX:控制器」...一個控制器到2個fxmls(JavaFX)

任何想法?

+0

對於多個FXML文件可以使用相同的控制器類,但是你的代碼將很難遵循,這是一個非常糟糕的主意。 (還要注意,使用'fx:controller'屬性,每次調用'FXMLLoader.load(...)'時,都會有不同的控制器*實例*,即使使用相同的控制器*類*。)每個FXML文件都有一個不同的控制器類。 –

+0

從不需要多個FXML文件共享相同的控制器。如果您需要在控制器之間進行通信,請使用[此處]描述的技術(http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml)。 –

回答

4

是的,你可以這樣做。雖然,它可以做到,我不推薦這種方法

請勿在FXML中放置fx:controller屬性。創建一個新的控制器並將相同的控制器設置爲單獨的FXMLLoader實例。

CustomerDialogController dialogController = 
    new CustomerDialogController(param1, param2); 

FXMLLoader summaryloader = new FXMLLoader(
    getClass().getResource(
     "customerSummary.fxml" 
    ) 
); 
summaryLoader.setController(dialogController); 
Pane summaryPane = (Pane) summaryLoader.load(); 

FXMLLoader detailsLoader = new FXMLLoader(
    getClass().getResource(
     "customerDetails.fxml" 
    ) 
); 
detailsLoader.setController(detailsController); 
Pane detailsPane = (Pane) detailsLoader.load(); 

SplitPane splitPane = new SplitPane(
    summaryPane, 
    detailsPane 
); 

我想要創建一個控制器,因爲我有IMO使用共享控制器只是爲了共享數據不是此優選的解決方案將數據發送beetwen controlers

問題。

相反,無論是共享多個控制器之間的數據,對於此見的例子:

有一個進一步的實例中的位置:

1

使用fx:root構造而不是fx:controller。這在Custom Components section of the FXML docs解釋。如果您想要更大的代碼示例,我在this example for my students中使用了它。

使用這種方法,創建視圖和控制器將變得更加簡單和靈活。您將能夠像在應用程序中使用其他任何對象(例如,通過構造函數或setter方法傳遞數據)一樣在控制器之間共享數據並連接控制器。

如果您使用SceneBuilder,則只需刪除控制器引用並選中「Use fx:root」框。然後按照示例中所示重新編寫代碼。

相關問題