JavaFX的2.0 + FXML。 从不同的任务更新的场景值(JavaFX 2.0 + FXM

2019-06-23 12:43发布

我想从我已经加载了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">

我想用绑定值的实例(文本字段在这种情况下,所谓的名)

提前致谢

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


文章来源: JavaFX 2.0 + FXML. Updating scene values from a different Task