2010-06-22 43 views
1

我試圖創建一個FilteredTree與幾列沒有運氣。如果我使用TreeViewer列的工作正常,但當我切換到使用FilteredTree我只能讓它工作,如果我刪除的列,所以我想知道是否有一種方式使用FilteredTree與列。在Eclipse中的列和FilteredTree

回答

1

您當然可以在列查看器中使用FilteredTree。例如(這也表明保留使用FilteredTree使用TreeColumnLayout的):

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 2015-01-22 08:28:04

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實例。在基於列的樹視圖中,樹葉沒有單個文本表示。

因此,如果您使用TreeViewerColumns作爲樹列,PatternFilter將爲每列使用ColumnLabelProvider。在這種情況下,你會通過繼承PatternFilter修復,並覆蓋它自己isLeafMatch(..)

否則,使用TreeColumns時定義列,該TreeViewer將需要有一個ITableLabelProvider。除此之外,您將子類PatternFilter,並再次覆蓋方法isLeafMatch(..)