将GWT单元树打开到特定节点

时间:2012-05-15 11:03:22

标签: gwt tree cell

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

这不起作用,因为在将子项添加到任何节点之前,循环以其完整性完成。因此,第一级节点按原样打开,但是当循环第二次出现时没有任何子节点。

我情不自禁地觉得我错过了一些明显的东西,或者以错误的方式做了这件事,但我看不到它。任何帮助很多(即使它说“不要傻,你不能这样做)

1 个答案:

答案 0 :(得分:5)

如果您从TreeViewModel {同步填充数据,您的代码应该 <(> locateNode我认为它做了什么,即迭代currentNode.getChildValue(i) i0之间的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>AA2运行。

然后我只运行setChildOpen代码。由于TreeViewModel对于这些节点是同步的,因此setChildOpen返回非空值。