我有一个以TreeModel
表示的数据对象,我想在我的JTree
中只显示其中的一部分 - 为了争论,比如叶子和他们的父母。如何隐藏/过滤不必要的节点?
答案 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上设置根节点。