I want to get the controller from a scene that i've loaded with FXMLoader. The use case is:
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
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");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With