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

我想获取具有绑定值的实例(在这种情况下,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();

这提供了解决方法和实现目标的捷径。

2)如果您的节点有一个 id 那么您可以直接使用Node#lookup()它而不是构造一个 for-loop :

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