JavaFX 2.0 + FXML. Updating scene values from a different Task
fxml, java, javafx-2
Solution
1) You can get the controller from the `FXMLLoader` but don't know is it possible from `Scene` :
FXMLLoader fxmlLoader = new FXMLLoader();
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
bar.foo fooController = (bar.foo) fxmlLoader.getController();
To use the `fooController` later in a different part of your code, you can use `Node#setUserData()`. For example after the code above:
p.setUserData(fooController);
...
// after a while of app logic and code
bar.foo controller_of_p = (bar.foo) p.getUserData();
This gives a workaround and a shortcut to achieve your goal.
2) If your node has an id then you can directly `Node#lookup()` it rather than constructing a for-loop :
TextField txt = (TextField) pane.lookup("#nodeId");
Problem
I want to get the controller from a scene that i've loaded with FXMLoader. The use case is: - My JSON manager receives a JSON object The task I've launched shows a new Scene using ``` Parent p = FXMLLoader.load(getClass().getResource("foo.fxml")); Scene scene = new Scene(p); stage.setScene(scene); ``` After that, i have the empty scene. Now I do this to fill the components ``` 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); } } ``` My question, is there an easier way to do this? I have a controller specified in 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"> ``` I want to get the instance with the bind values (TextField called name in this case) Thanks in advance