我正在将ViewerFilter
应用于几个分支的树上,但主要是离开。过滤器确实适用于叶子,使用叶子内的属性。所有树枝都保持不变,以便它们的叶子可以出现。
但是我想过滤掉不包含选定叶子的分支,我可以在ViewerFilter
中看不到允许这样做的机制。
这有可能吗?
例如,给定下面的概念树(其中b
是分支,L
是叶子)
b0
b1
L2
L4
L8
b2
L1
L3
L5
我想应用ViewerFilter
,它只选择包含偶数叶子的树叶和树枝。结果树将是......
b0
b1
L2
L4
L8
..分支b2
未显示,因为它不包含选定的子项,但分支b0
和b1
可以。
答案 0 :(得分:13)
class MyFilter extends ViewerFilter{
private boolean isLeaf(Object element){
// implement this
}
private boolean isEvenLeaf(Object leaf){
// implement this
}
@Override
public boolean select(Viewer viewer, Object parentElement, Object element){
if (isLeaf(element))
return isEventLeaf(element);
else {
StructuredViewer sviewer = (StructuredViewer) viewer;
ITreeContentProvider provider = (ITreeContentProvider) sviewer.getContentProvider();
for (Object child: provider.getChildren(element)){
if (select(viewer, element, child))
return true;
}
return false;
}
}
}
答案 1 :(得分:2)
另请查看org.eclipse.ui.dialogs.FilteredTree
关于孩子的正确事情。
答案 2 :(得分:1)
是的,如果你没有过滤掉分支节点,即使它们没有叶子也会显示它们。如果您希望过滤器永久打开,您可以考虑使用ITreeContentProvider作为过滤器。
由于内容提供者同时拥有getChildren()和hasChildren()方法,因此您可以获得更多控制权。
答案 3 :(得分:0)
我不确定你选择的叶子是什么意思。如果您的意思是在视图中选择,您可以通过调用Viewer.getSelection()来找到它。您在过滤器中实现的select方法将传递给viewer,parent和leaf。您应该能够使用此信息来决定是否选择了叶子并将其过滤掉。如果您可以提供更多信息,我可以回答更详细的信息。