隐藏/过滤JTree中的节点?

Ama*_*a S 10 java swing jtree

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

Ama*_*a S 8

我的最终实施:

  • 有两个TreeModel,底层的和过滤的.
  • 当底层发生更改时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);
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)


Tom*_*ine 0

只要您显示的仍然是一棵树,那么TreeModel您现有的过滤器TreeModel应该足够简单。