我有一个需要加载 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());
}
}
}
}
我想对这个设计策略发表意见,如果这里有更好的解决方案?