0

我已经为我的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[])。子类可以覆盖

稍后编辑

最后我找不到任何调用这个函数的方法,所以我实现了一个解决方法:我在我的模型实例上创建了一个包装器,它也有一个“父”字段。每当我将实例插入树中(在我的getChildrengetElements方法中)时,我实际上都会创建包装器的实例并相应地设置父级。

这样,无论何时hasChildren调用,我都可以从当前节点导航到根。

4

1 回答 1

1

查看 Eclipse '搜索引用'的源代码说没有任何东西TreePath调用filter.

ITreeContentProvider有一个getParent(object)方法可以用来遍历树。

于 2015-02-23T16:35:37.153 回答