隐藏/过滤JTree中的节点?

时间:2009-05-06 21:18:23

标签: java swing jtree

我有一个以TreeModel表示的数据对象,我想在我的JTree中只显示其中的一部分 - 为了争论,比如叶子和他们的父母。如何隐藏/过滤不必要的节点?

7 个答案:

答案 0 :(得分:8)

我的最终实施:

  • 有两个TreeModel,底层的和过滤的。{/ li>
  • 当基础TreeModel发生更改时,从头开始重建已过滤的TreeModel。克隆应该可见的每个节点,并将其添加到已过滤的TreeModel中的第一个可见祖先(如果没有可见的话,则将其添加到根目录中)。如果你很好奇,请参阅下面的代码。
  • 这会导致折叠用户打开的每条路径的不幸副作用。为了解决这个问题,我向已过滤的TreeModelListener添加了TreeModel。模型更改后,我会在JTree中保存展开的路径(使用getExpandedDescendants()),然后稍后重新展开它们(使用SwingUtilities.invokeLater())。

    我必须覆盖我正在使用的equals()类中的TreeNode,以便新的克隆节点与旧的克隆节点相同。


  ...
  populateFilteredNode(unfilteredRoot, filteredRoot);
  ...

  void populateFilteredNode(TreeNode unfilteredNode, TreeNode filteredNode)
  {
    for (int i = 0; i < unfilteredNode.getChildCount(); i++)
    {
      TreeNode unfilteredChildNode = unfilteredNode.getChildAt(i);

      if (unfilteredChildNode.getType() == Type.INVISIBLE_FOLDER)
      {
        populateFilteredNode(unfilteredChildNode, filteredNode);
      }
      else
      {
        TreeNode filteredChildNode = unfilteredChildNode.clone();

        filteredNode.add(filteredChildNode);

        populateFilteredNode(unfilteredChildNode, filteredChildNode);
      }
    }
  }

答案 1 :(得分:3)

你应该知道GlazedLists。它是一个很棒的库,可以轻松地进行复杂的表转换。他们也扩展到了树木。它可能需要对您现有的代码进行一些重构,以使其进入GlazedLists的工作方式。但请查看演示和网络广播,看看它有多强大。 (在我看来,它是Swing库中必不可少的一个,它是开源的。)

答案 2 :(得分:2)

你试过JXTree吗? (不幸的是,网站现在已经关闭,但你可以谷歌镜像)

答案 3 :(得分:1)

如果您正在寻找商业解决方案,JideSoft有一个可过滤的树模型。除此之外,SwingX有一个Filter API,可以在JXTable,JXTreeTable,JXTree和JXList上运行。

答案 4 :(得分:1)

看看这个实现:http://www.java2s.com/Code/Java/Swing-Components/InvisibleNodeTreeExample.htm

它创建DefaultMutableNode的子类,添加“isVisible”属性,而不是实际从TreeModel中删除/添加节点。

答案 5 :(得分:0)

只要它仍然是您正在显示的树,那么过滤现有TreeModel的{​​{1}}应该足够简单。

答案 6 :(得分:0)

利用您用于构建TreeNode的代码并重建仅包含所需元素的TreeNode。使用筛选的根节点在TreeModel上设置根节点。