Я пытаюсь создать FilteredTree
с несколькими столбцами без везения. Если я использую TreeViewer
, то столбцы работают нормально, но когда я переключаюсь на использование FilteredTree
, я могу заставить его работать, если я удалю столбцы, поэтому мне интересно, есть ли способ использовать FilteredTree
с столбцами.Столбцы и FilteredTree в Eclipse
ответ
Вы можете использовать FilteredTree с функцией просмотра столбцов. Например (и это также свидетельствует о сохранении использования TreeColumnLayout с помощью FilteredTree):
final TreeColumnLayout tl = new TreeColumnLayout();
PatternFilter patternFilter = new PatternFilter();
patternFilter.setIncludeLeadingWildcard(true);
FilteredTree ft = new FilteredTree(treeViewerComposite, SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | toolkit.getBorderStyle() | Window.getDefaultOrientation(), patternFilter, true) {
@Override
protected Control createTreeControl(Composite parent, int style) {
Control c = super.createTreeControl(parent, style);
c.setLayoutData(null);
c.getParent().setLayout(tl);
return c;
}
};
viewer = ft.getViewer();
viewer.getTree().setHeaderVisible(true);
Теперь вы можете просто создать TreeColumn по обычному способу, и ваши столбцы будут отображаться.
Вы можете сделать это так же, как с помощью normal Tree. Вот полная настройка.
PatternFilter patternFilter = new PatternFilter();
patternFilter.setIncludeLeadingWildcard(true);
filteredTree = new FilteredTree(getContainer(), SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, patternFilter, true);
TreeViewer viewer = filteredTree.getViewer();
tree = viewer.getTree();
tree.setHeaderVisible(true);
TreeColumn modelColumn = new TreeColumn(tree, SWT.LEFT);
modelColumn.setText("Model");
modelColumn.setWidth(400);
TreeViewerColumn treeViewerModelColumn = new TreeViewerColumn(viewer, modelColumn);
treeViewerModelColumn.setLabelProvider(new ColumnLabelProvider());
Да, есть способ, и решение это описано здесь: http://eclipsesource.com/blogs/2012/10/26/filtering-tables-in-swtjface/
Дело в том, по умолчанию PatternFilter
нуждается в листья деревьев, чтобы быть экземпляром ILabelProvider
. В дереве TreeViewer на основе столбцов нет единого текстового представления для дерева.
Итак, если вы используете TreeViewerColumns
в качестве столбцов дерева, то PatternFilter
будет использовать ColumnLabelProvider
для каждого столбца. В этом случае вы будете фиксировать наследованием PatternFilter
и опрокинув его с вашим собственным isLeafMatch(..)
В противном случае, при использовании TreeColumns
для определения столбцов, то TreeViewer
нужно будет иметь ITableLabelProvider
. Кроме того, вы подклассифицируете PatternFilter
и, опять же, переопределите метод isLeafMatch(..)
К сожалению, этот код приведет к ошибке утверждения. Таким образом, неправильный код установки макета. – allprog