2012-04-11 75 views
4

我想從我用FXMLoader加載的場景獲取控制器。用例是:JavaFX 2.0 + FXML。更新不同任務的場景值

  1. 我的JSON經理收到一個JSON對象
  2. 我發起的任務說明使用

    Parent p = FXMLLoader.load(getClass().getResource("foo.fxml")); 
    Scene scene = new Scene(p); 
    stage.setScene(scene); 
    

    之後,新的場景,我有空的場景。

  3. 現在我這樣做,以填補部件

    AnchorPane pane = (AnchorPane)((AnchorPane) scene.getRoot()).getChildren().get(0); 
    for(Node node : pane.getChildren()){ 
        String id = node.getId(); 
        if(id.equals(NAME)){ 
         ((TextField)node).setText(value); 
        } 
    } 
    

我的問題,是有更簡單的方式來做到這一點?我在FXML指定控制器

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="526.0" minWidth="356.0" prefHeight="526.0" prefWidth="356.0" 
xmlns:fx="http://javafx.com/fxml" fx:controller="bar.foo"> 

我想用綁定值(文本字段在這種情況下,所謂的名)

感謝實例提前

回答

14

1)你可以得到控制從FXMLLoader但不知道是否有可能從Scene

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

要在以後使用fooController在你的代碼的不同部分,你可以使用Node#setUserData()。例如,在上面的代碼之後:

p.setUserData(fooController); 
... 
// after a while of app logic and code 
bar.foo controller_of_p = (bar.foo) p.getUserData(); 

這給出了一種解決方法和捷徑來實現您的目標。

2)如果您的節點有一個id,那麼你可以直接Node#lookup()它,而不是構建一個for循環:

TextField txt = (TextField) pane.lookup("#nodeId"); 
+0

謝謝您的回答,這是使用node.lookup點。您顯示獲取控制器的方式對我無效,因爲我需要當前控制器實例。這種方式創建一個新的控制器和一個新的窗格。 – Javier 2012-04-11 16:04:04

+0

爲什麼?使用此代碼而不是'FXMLLoader.load(getClass()。getResource(「foo.fxml」));'並且您將獲得與代碼中相同的窗格。 – 2012-04-11 16:27:11

+0

@Javier。更新了答案。請看一看。 – 2012-04-11 16:44:10