2

我有一个文件浏览器类型的应用程序,它由一个显示层次结构的 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);
        }
    }
}

这是行不通的,因为在将子节点添加到任何节点之前,循环在其整体中完成。因此,第一级节点按应有的方式打开,但在第二次循环出现时没有任何子节点。

我不禁觉得我遗漏了一些明显的东西,或者以错误的方式做这件事,但我看不到。非常感谢任何帮助(即使是说“别傻了,你不能那样做)

4

1 回答 1

5

如果您从您的同步填充数据,您的代码应该可以工作TreeViewModel(前提是按照我的想法进行,即使用between和locateNode进行迭代)。currentNode.getChildValue(i)i0currentNode.getChildCount()

我在类似的场景中所做的(我实际上是用 a 做的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返回一个非空值。

于 2012-05-15T12:19:33.590 回答