【问题标题】:JavaFX 2.0 + FXML. Updating scene values from a different TaskJavaFX 2.0 + FXML。从不同的任务更新场景值
【发布时间】:2012-04-23 20:52:16
【问题描述】:

我想从使用 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)

提前致谢

【问题讨论】:

    标签: java javafx-2 fxml


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回答,这是使用 node.lookup 的重点。您显示获取控制器的方式对我不起作用,因为我需要当前的控制器实例。这种方式会创建一个新的控制器和一个新的窗格。
    • 为什么?使用此代码而不是 FXMLLoader.load(getClass().getResource("foo.fxml"));,您将获得与代码中相同的窗格。
    • @哈维尔。更新了答案。请看一看。
    • 这正是我要找的 Uluk Bly,谢谢! @Sergey:如果您使用 loader.getResource(...) 不同的时间,每次控制器实例都会不同。
    • @Javier,我研究过历史,没有人建议这样做。但是当你解决了你的问题时,nvm。 :)
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2017-07-09
    • 2015-05-28
    • 2016-05-10
    • 2013-09-08
    相关资源
    最近更新 更多