我将ViewerFilter应用于几个分支的树,但主要是离开。过滤器确实适用于叶子,使用叶子内的属性。所有树枝都保持不变,以便它们的叶子可以出现。

但是我想过滤掉不包含选定叶子的分支,我可以在b中看不到允许这样做的机制。

这有可能吗?

例如,给定下面的概念树(其中L是分支,b2是叶子)

b0
  b1
    L2
    L4
    L8
  b2
    L1
    L3
    L5

我想应用b0只选择包含偶数叶子的叶子和分支。结果树将是......

b0
  b1
    L2
    L4
    L8

..其中branch b1不显示,因为它不包含选定的子项,但分支<=>和<=>。

有帮助吗?

解决方案

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;
    }
  }
}

其他提示

还要看看org.eclipse.ui.dialogs.FilteredTree关于孩子的正确事情。

是的,如果你没有过滤掉分支节点,即使它们没有叶子也会显示它们。如果您希望过滤器永久打开,您可以考虑使用ITreeContentProvider作为过滤器。

由于内容提供者同时拥有getChildren()和hasChildren()方法,因此您可以获得更多控制权。

我不确定你选择的叶子是什么意思。如果您的意思是在视图中选择,您可以通过调用Viewer.getSelection()来找到它。您在过滤器中实现的select方法将传递给viewer,parent和leaf。您应该能够使用此信息来决定是否选择了叶子并将其过滤掉。如果您可以提供更多信息,我可以回答更详细的信息。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top