Когда вызывается метод 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)
метод, который вы можете использовать для обхода дерева.