У меня есть приложение, которое загружает 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());
}
}
}
}
Я хотел бы получить мнение об этой стратегии проектирования, если, возможно, здесь есть лучшее решение?