JavaFX FXML setUserData DAO - PullRequest
       31

JavaFX FXML setUserData DAO

0 голосов
/ 09 мая 2018

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

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

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

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

<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());
            }
        }
    }
}


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

...