我已经为我的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(Viewer, Object, Object[])。子类可以覆盖
稍后编辑
最后我找不到任何调用这个函数的方法,所以我实现了一个解决方法:我在我的模型实例上创建了一个包装器,它也有一个“父”字段。每当我将实例插入树中(在我的getChildren
和getElements
方法中)时,我实际上都会创建包装器的实例并相应地设置父级。
这样,无论何时hasChildren
调用,我都可以从当前节点导航到根。