JavaFX FXML setUserData DAO

У меня есть приложение, которое принимает FXML для загрузки. FXML является внешним по отношению к приложению (не разработчиком).

Приложение имеет соединение с сервером для получения данных телеметрии.

Мне нужно обновить узлы на основе этих данных телеметрии. В связи с этим я создал объект пользовательских данных NodeData, который разработчики FXML могут добавлять к каждому узлу в FXML.

Пользовательские данные FXML показывались для демонстрации

<AnchorPane fx:id="rootPane" xmlns="http://javafx.com/javafx/9" xmlns:fx="http://javafx.com/fxml/1">
    <Label fx:id="label1">
        <userData>
            <NodeData>
                <queries>
                    <FXCollections fx:factory="observableArrayList">
                        <String fx:value="select name from TABLE_1" />
                        <String fx:value="select title from TABLE_2 />
                    </FXCollections>
                </queries>
            </NodeData>
        </userData>
    </Label>
</AnchorPane>


Объекты пользовательских данных Java

/** Node DAO */
public class NodeData {

    private ObservableList<NodeQuery> queries;

    public ObservableList<NodeQuery> getQueries() {
        return queries;
    }

    public void setQueries(ObservableList<NodeQuery> queries) {
        this.queries = queries;
    }

}

public class NodeQuery {

    private String query;

    public String getQuery() {
        return query;
    }

    public void setQuery(String query) {
        this.queries = queries;
    }

}

Я планировал, что NodeData отправит запросы и получит ответ.

Когда ответ получен, я хотел обновить узел. Я не совсем уверен, как бы я это сделал. Нет никаких данных, наблюдаемых на пользовательских данных назад к узлу, который я могу слушать.

Одно из решений:
Возможно, я мог бы заставить контроллер работать. В инициализации @FXML я мог бы перебирать корневую панель, к которой у меня есть доступ, находить все узлы, получать его NodeData, отправлять запросы. Когда получено обновление узла. Однако это кажется немного грязным.

@FXML
private void initialize() {
    Stack<Node> nodes = new Stack<>();
    nodes.addAll(rootPane.getChildren());

    while (!nodes.empty()) {
        Node node = nodes.pop();

        Object userData = node.getUserData();
        if (userData instanceof NodeData) {
            NodeData nodeData = (NodeData) userData;
            // Do work on nodeData.
        }

        if (node instanceof Pane) {
            Pane pane = (Pane) node;
            nodes.addAll(pane.getChildren());
        } else if (node instanceof TitledPane) {
            TitledPane titledPane = (TitledPane) node;
            Node content = titledPane.getContent();
            if (content instanceof Pane) {
                Pane pane = (Pane) content;
                nodes.addAll(pane.getChildren());
            }
        }
    }
}


Я хотел бы получить мнение об этой стратегии дизайна, если, возможно, есть лучшее решение здесь?

0 ответов

Другие вопросы по тегам