JavaFX 2.0 + FXML. Обновление значений сцены из другой Задачи

Я хочу получить контроллер из сцены, которую я загрузил с 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 называется name)

заранее спасибо

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) Если у вашего узла есть идентификатор, то вы можете напрямую Node#lookup() это вместо того, чтобы строить цикл for:

TextField txt = (TextField) pane.lookup("#nodeId");
Другие вопросы по тегам