0
我在数据库中有一棵相当大的树,加载所有项目并在启动时将它们添加到HierarchicalContainer
表现不佳。
相反,我想单击加载树项目的子项。
好吧,实际上早一点,因为我没有areChildrenAllowed()
或hasChildren()
返回错误的值。如何在Vaadin中实现延迟加载树?
我希望能找到类似于JFace TreeViewer的东西ITreeContentProvider。
有没有这个主题的任何示例或最佳实践描述?
这是我走到这一步:
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 –