2011-11-02 33 views
0

我正在编写某种对象浏览器,用文件夹组织。当用户选择列表中的某个文件夹时,我必须在树中展开适当的节点。 我已经在树中实现了树扩展,元素选择,但BUT扩展可能发生在超出可见区域的树的一部分(CellTree在ScrollPane上)。 因此,我确实有一个TreeNode的实例 - 我如何以编程方式滚动以使其可见?GWT CellTree滚动到任意节点

回答

2

这是不可能的,目前的API,但你可以试试,我没有测试过这一点,但应该是很容易:

  1. 对于树中的每个对象渲染和无形的标签,标识这对象,像一个<input type="hidden" id="yourObjectId"/>
  2. 确保你有一个SelectionModel设置,当你的nodeinfo等
  3. 当你知道你要滚动到,打电话yourSelectionModel.setSelected(object,true);什么对象。这应该展开树并显示您选择的对象。
  4. 在这个阶段,你想要做的是:
Element cellTreeElement = yourCellTree.getElement(); 
NodeList<Element> objectIds = cellTreeElement.getElementsByTagName("input"); 
for (int i=0;i<elementsByTagName.getLength();i++) 
{ 
    Element e = objectIds .getItem(i); 
    if (e.getId().equals(yourObjectId) { 
    e.scrollIntoView(); 
    } 
} 

很肯定这应该只是罚款。

+0

不错,谢谢! – sab

+0

一些注释: 最好是滚动到一些可见的元素,否则滚动(在我的情况下)到单元格的顶部(我在元素的render()中添加标记的元素)。但也许我必须使用样式将这个元素向下移动到底部。 并且关于第3点 - 仅仅调用'setSelected'是不够的 - 相反,我必须使用我的数据模型找到选定元素路径中的所有对象,然后使用 'tree.getRootTreeNode'和'rootNode.setChildOpen(。 ..)”。诀窍是'rootNode.setChildOpen(...)'返回打开的孩子作为'TreeNode'。 非常感谢! – sab

0

另一个版本(如果你想的元素移动到CellTree的顶部):

Element cellTreeElement = yourCellTree.getElement(); 
    NodeList<Element> objectIds = cellTreeElement.getElementsByTagName("input"); 
    for (int j = 0; j < objectIds.getLength(); j++) { 
     Element e = objectIds.getItem(j); 
     if (e.getId().equals("r" + iDistrictID)) { 
      yourCellTree.getElement().getParentElement().getParentElement().setScrollTop(e.getParentElement().getParentElement().getOffsetTop()); 
     } 
    }