JavaFX FXML setUserData DAO

时间:2018-05-09 12:47:38

标签: javafx javafx-8 fxml javafx-9

我有一个需要加载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());
            }
        }
    }
}


如果这里有更好的解决方案,我想对这个设计策略有所了解吗?

0 个答案:

没有答案