У меня есть довольно большое дерево в базе данных, загрузка всех элементов и добавление их в HierarchicalContainer
при запуске выполняется плохо.
Вместо этого я хочу загрузить дочерние элементы дерева по клику.
Ну на самом деле немного раньше, так как я не areChildrenAllowed()
или hasChildren()
, чтобы вернуть неправильное значение.Как реализовать ленивое дерево загрузки в Ваадине?
Я надеялся найти что-то подобное в JFace TreeViewerITreeContentProvider.
Есть ли какой-либо пример или практика лучшей практики в этой теме?
Это то, что я до сих пор:
public class OutputNodeContainer extends HierarchicalContainer {
/** the view service */
private IViewService service = CommonPlugin.getService(IViewService.class);
private List<Object> childrenRead = new ArrayList<>();
@Override
public boolean areChildrenAllowed(Object itemId) {
if (!childrenRead.contains(itemId)) {
OutputNode node = (OutputNode) itemId;
List<OutputNode> children = service.getChildren(node.getNodeId(), false);
for (OutputNode child : children) {
addItem(child);
setParent(child, itemId);
}
childrenRead.add(itemId);
return !children.isEmpty();
}
return super.areChildrenAllowed(itemId);
}
}
Но addItem(child);
я бегу в это исключение:
java.lang.IllegalStateException: A connector should not be marked as dirty while a response is being written.
at com.vaadin.ui.ConnectorTracker.markDirty(ConnectorTracker.java:489)
at com.vaadin.server.AbstractClientConnector.markAsDirty(AbstractClientConnector.java:143)
at com.vaadin.ui.Tree.markAsDirty(Tree.java:348)
at com.vaadin.ui.AbstractSelect.fireItemSetChange(AbstractSelect.java:1746)
at com.vaadin.ui.AbstractSelect.containerItemSetChange(AbstractSelect.java:1713)
at com.vaadin.ui.Tree.containerItemSetChange(Tree.java:992)
at com.vaadin.data.util.AbstractContainer.fireItemSetChange(AbstractContainer.java:246)
at com.vaadin.data.util.HierarchicalContainer.fireItemSetChange(HierarchicalContainer.java:436)
at com.vaadin.data.util.IndexedContainer.fireItemSetChange(IndexedContainer.java:640)
at com.vaadin.data.util.HierarchicalContainer.enableAndFireContentsChangeEvents(HierarchicalContainer.java:460)
at com.vaadin.data.util.HierarchicalContainer.addItem(HierarchicalContainer.java:489)
at ch.scodi.vaadin.viewer.OutputNodeContainer.areChildrenAllowed(OutputNodeContainer.java:78)
at com.vaadin.ui.Tree.areChildrenAllowed(Tree.java:864)
at com.vaadin.ui.Tree.paintContent(Tree.java:732)
at com.vaadin.server.LegacyPaint.paint(LegacyPaint.java:65)
at com.vaadin.server.communication.LegacyUidlWriter.write(LegacyUidlWriter.java:82)
at com.vaadin.server.communication.UidlWriter.write(UidlWriter.java:143)
at com.vaadin.server.communication.UIInitHandler.getInitialUidl(UIInitHandler.java:284)
at com.vaadin.server.communication.UIInitHandler.synchronizedHandleRequest(UIInitHandler.java:80)
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1422)
... 63 common frames omitted
Не уверен, что, если он по-прежнему в силе для текущей реализации дерева: https://vaadin.com/forum/#!/thread/131803/131802 –