专栏& Eclipse中的FilteredTree

时间:2010-06-22 11:45:46

标签: eclipse jface rcp treeviewer

我正在尝试使用多个列创建一个FilteredTree而没有运气。如果我使用TreeViewer列的工作正常,但是当我切换到使用FilteredTree时,如果我删除列,我只能让它工作,所以我想知道是否有使用方法FilteredTree列。

3 个答案:

答案 0 :(得分: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,并且您的列将会出现。

答案 1 :(得分: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());

答案 2 :(得分: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(..)