4

FXMLoader でロードしたシーンからコントローラーを取得したいと考えています。使用例は次のとおりです。

  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">

バインド値を持つインスタンスを取得したい (この場合は name と呼ばれる TextField)

前もって感謝します

4

1 に答える 1

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

これにより、目標を達成するための回避策と近道が得られます。

Node#lookup()2) ノードに id がある場合は、for ループを構築するのではなく、それ を直接指定できます。

TextField txt = (TextField) pane.lookup("#nodeId");
于 2012-04-11T15:10:56.070 に答える