我有一个文件浏览器类型的应用程序,包含一个显示层次结构的CellTree和一个显示当前节点内容的浏览器窗格。
应用程序必须处理的层次结构可能太大而CellTree无法有效处理,因此浏览器窗格中显示的位置与树中的开放节点没有很强的耦合。
我希望实现一个按钮,它将打开CellTree中的当前浏览位置。我的服务器端数据模型在所有对象上都有父/子引用,因此获取层次结构很简单,但我正在努力将其应用于树。
这是我目前的尝试,它是包含我的树的小部件上的一个方法,并从接收方调用。 RecordTreeLevel对象每个都代表树中的一个级别。
public void navigateTo(List<RecordTreeLevelProxy> hierarchy) {
TreeNode currentNode = tree.getRootTreeNode();
ListIterator iter = hierarchy.listIterator(hierarchy.size());
while (iter.hasPrevious()){
RecordTreeLevelProxy level = (RecordTreeLevelProxy) iter.previous();
Integer nodeIndex = locateNode(level.getUniqueRef(), currentNode);
if (nodeIndex != null){
currentNode = currentNode.setChildOpen(nodeIndex, true, true);
}
}
}
这不起作用,因为在将子项添加到任何节点之前,循环以其完整性完成。因此,第一级节点按原样打开,但是当循环第二次出现时没有任何子节点。
我情不自禁地觉得我错过了一些明显的东西,或者以错误的方式做了这件事,但我看不到它。任何帮助很多(即使它说“不要傻,你不能这样做)
答案 0 :(得分:5)
如果您从TreeViewModel
{同步填充数据,您的代码应该 <(> locateNode
我认为它做了什么,即迭代currentNode.getChildValue(i)
i
和0
之间的currentNode.getChildCount()
。
我在类似场景中做的事情(我实际上是用CellBrowser
做的)是我预加载缓存(我正在缓存各种响应树的分支使用层次结构到选定的节点,然后运行与您的代码非常相似的代码。 TreeViewModel
如果值在缓存中则同步运行,否则异步运行(向服务器询问已打开节点的子节点)。
例如,对于以下树:
- A
+- A1
+- A1a
+- A2
+- A2a
+- A2b
- B
+- B1
+- B2
如果应该预先选择A2a节点,我首先加载根分支,A
分支,然后加载A2
分支:
<root> -> [ A, B ]
A -> [ A1, A2 ]
A2 -> [ A2a, A2b ]
这样,我确信我的TreeViewModel
将同步为节点<root>
,A
和A2
运行。
然后我只运行setChildOpen
代码。由于TreeViewModel
对于这些节点是同步的,因此setChildOpen
返回非空值。