Когда вызывается метод filter(Viewer,TreePath,Object[])?

Я создал и добавил новый фильтр в свой TreeViewer объект. Это прекрасно работает, но я не могу понять, когда это filter(Viewer,TreePath,Object[]) называется.

Таким образом, фильтр на самом деле является экземпляром класса, который расширяет ViewerFilter и должен реализовать абстрактный метод выбора. В моем случае 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 аргумент для того, чтобы быть в состоянии фильтровать элементы на основе указанного уровня.

В документации я смог найти только следующее объяснение:

Фильтрует данные элементы для данного средства просмотра. Входной массив не изменяется. Реализация этого метода по умолчанию вызывает фильтр (Viewer, Object, Object[]) с родителем из пути. Подклассы могут переопределять

Позже редактировать

В конце концов я не смог найти способ вызова этой функции, поэтому я применил обходной путь: я создал оболочку для экземпляров модели, которая также имеет поле "родитель". Всякий раз, когда я вставляю свои экземпляры в дерево (в моем getChildren а также getElements методы), я фактически создаю экземпляры моей обертки и устанавливаю родителей соответственно.

Таким образом, всякий раз, когда hasChildren я могу перейти от текущего узла к корню.

1 ответ

Решение

Глядя на исходный код, "поисковые ссылки" Eclipse показывают, что ничто не вызывает TreePath версия filter,

Ваш ITreeContentProvider имеет getParent(object) метод, который вы можете использовать для обхода дерева.

Другие вопросы по тегам