2014-04-29 28 views
0

考慮到this example如何從主代碼獲取或設置窗體上的任何內容?如何與JavaFX中的FXML表單進行交互?

所有我們就像是

@Override 
public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("fxml_example.fxml")); 

    Scene scene = new Scene(root, 300, 275); 

    stage.setTitle("FXML Welcome"); 
    stage.setScene(scene); 
    stage.show(); 
} 

在FXML所述的模板簡單的主要功能。

和一個從未明確實例化的控制器類。

由於我沒有指向主代碼中控制器類實例的鏈接,因此如何從控制器外部訪問表單上的任何內容?

回答

1

你可以做的一件事就是爲控制器創建一個默認的構造函數,並將它存儲到一個私有的靜態變量中this。然後您可以爲該變量創建一個靜態獲取器來檢索控制器實例。然後,您可以直接暴露@FXML -annotated字段,也可以爲它們設置getter方法。如果您加載同一控制器的多個實例,則會中斷,原因很明顯。

雖然我對JavaFX沒有多少經驗,但我無法確定這是否是好的/壞的解決方案......我只知道它適用於更簡單的情況。

編輯:這個答案有更好的解決方案:Accessing FXML controller class

基本上是:

FXMLLoader fxmlLoader = new FXMLLoader(); 
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream()); 
FooController fooController = (FooController) fxmlLoader.getController(); 
+0

不要使用靜態變量在控制器公開數據。控制器數據本質上是非靜態的,因爲它特定於控制器實例。 –

+0

是的,我意識到......只要你最多隻需要一次加載該FXML文件,它就可以工作,並且在這種情況下很方便,但是如果你有多個實例,肯定不會工作。同一個控制器。 – awksp