Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
576 views
in Technique[技术] by (71.8m points)

java - JavaFX 2.0 + FXML. Updating scene values from a different Task

I want to get the controller from a scene that i've loaded with FXMLoader. The use case is:

  1. My JSON manager receives a JSON object
  2. 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.

  3. 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

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...