0

我有一个需要加载 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 发送查询并接收响应。

收到响应后,我想更新节点。我不太确定我会怎么做。返回到我可以收听的节点的用户数据上没有 Observable。

一种解决方案:
也许我可以让控制器完成这项工作。在 @FXML 初始化中,我可以遍历我有权访问的 rootPane,找到所有节点,检索其 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());
            }
        }
    }
}


我想对这个设计策略发表意见,如果这里有更好的解决方案?

4

0 回答 0