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