2012-04-11 21 views
4

私はFXMLoaderでロードしたシーンからコントローラを取得したいと思います。ユースケースは、次のとおりです。JavaFX 2.0 + FXML。別のタスクからシーン値を更新する

  1. マイJSONマネージャは、私が立ち上げてきたタスクが、私は空のシーンを持って、その後

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

    を使用して、新しいシーンを示してJSONオブジェクト

  2. を受けます。

  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); 
        } 
    } 
    

私の質問を埋めるために、これを行うこれを行うための簡単な方法はありますか?私は

<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に(この場合は名前呼ばれるのTextField)バインド値

おかげでインスタンスを取得したい)あなたは、コントローラを得ることができますFXMLで指定されたコントローラを持っています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(); 

これは回避策と目標を達成するためのショートカットを提供します。あなたのノードはその後、IDを持っている場合

2)あなたは直接Node#lookup()むしろ構築するよりも、forループすることができます:あなたの答えのための

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

おかげで、それはnode.lookup使用してポイントでした。私は現在のコントローラインスタンスが必要なので、あなたがコントローラを取得するために表示する方法は私のために動作しません。この方法で、新しいコントローラと新しいペインが作成されます。 – Javier

+0

なぜですか?このコードを 'FXMLLoader.load(getClass()。getResource(" foo.fxml "));の代わりに使用すると、コード内と同じペインが表示されます。 –

+0

@Javier。答えを更新しました。見てください。 –

関連する問題