何时调用过滤器(Viewer,TreePath,Object [])方法?

时间:2015-02-23 16:24:17

标签: eclipse jface rcp treeviewer treepath

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

稍后修改

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

这样,只要调用hasChildren,我就可以从当前节点导航到根目录。

1 个答案:

答案 0 :(得分:1)

查看源代码,Eclipse'搜索引用'说没有任何内容会调用TreePath的{​​{1}}版本。

您的filterITreeContentProvider方法可用于遍历树。