我已经为我的TreeViewer
对象创建并添加了一个新的过滤器。它工作正常,但似乎无法理解何时调用filter(Viewer,TreePath,Object[])
。
因此,过滤器实际上是一个扩展ViewerFilter
的类的实例,需要实现抽象方法select。在我的例子中,select总是返回true,我通过覆盖public Object[] filter(Viewer viewer, Object parent, Object[] elements)
来过滤元素。
但是,当我尝试覆盖public Object[] filter(Viewer viewer, TreePath parentPath, Object[] elements)
时,根本不会调用此函数。
以下是它的外观:
myTreeViewer.addFilter(new ViewerFilter()
{
@Override
public Object[] filter(Viewer viewer, TreePath parentPath, Object[] elements)
{
/* doesn't get called */
return elements;
}
@Override
public Object[] filter(Viewer viewer, Object parent, Object[] elements)
{
/* gets called normally */
return elements;
}
@Override
public boolean select(Viewer arg0, Object arg1, Object arg2)
{
// TODO Auto-generated method stub
return true;
}
});
我需要使用TreePath
参数覆盖filter方法,以便根据指定的级别过滤元素。
在文档中,我只能找到以下解释:
过滤给定查看器的给定元素。输入数组未被修改。 此方法的默认实现使用路径中的父级调用filter(Viewer,Object,Object [])。子类可以覆盖
稍后修改
最后我找不到任何方法来调用这个函数,所以我实现了一个解决方法:我在我的模型实例上创建了一个包装器,它也有一个“父”字段。每当我将我的实例插入树中时(在我的getChildren
和getElements
方法中),我实际上创建了包装器的实例并相应地设置了父项。
这样,只要调用hasChildren
,我就可以从当前节点导航到根目录。
答案 0 :(得分:1)
查看源代码,Eclipse'搜索引用'说没有任何内容会调用TreePath
的{{1}}版本。
您的filter
有ITreeContentProvider
方法可用于遍历树。