2010-06-22 5 views
1

Я пытаюсь создать FilteredTree с несколькими столбцами без везения. Если я использую TreeViewer, то столбцы работают нормально, но когда я переключаюсь на использование FilteredTree, я могу заставить его работать, если я удалю столбцы, поэтому мне интересно, есть ли способ использовать FilteredTree с столбцами.Столбцы и FilteredTree в Eclipse

ответ

1

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

+0

К сожалению, этот код приведет к ошибке утверждения. Таким образом, неправильный код установки макета. – allprog

1

Вы можете сделать это так же, как с помощью 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()); 
0

Да, есть способ, и решение это описано здесь: http://eclipsesource.com/blogs/2012/10/26/filtering-tables-in-swtjface/

image from EclipseSource blog

Дело в том, по умолчанию PatternFilter нуждается в листья деревьев, чтобы быть экземпляром ILabelProvider. В дереве TreeViewer на основе столбцов нет единого текстового представления для дерева.

Итак, если вы используете TreeViewerColumns в качестве столбцов дерева, то PatternFilter будет использовать ColumnLabelProvider для каждого столбца. В этом случае вы будете фиксировать наследованием PatternFilter и опрокинув его с вашим собственным isLeafMatch(..)

В противном случае, при использовании TreeColumns для определения столбцов, то TreeViewer нужно будет иметь ITableLabelProvider. Кроме того, вы подклассифицируете PatternFilter и, опять же, переопределите метод isLeafMatch(..)