删除 JTree 中节点之间的叶子
Removing leaves that are between nodes in a JTree
假设我有一个与我提供的图片相似的JTree
,每次我运行代码时叶子和节点的数量都会有所不同。现在我怎么能删除空的节点(又名没有 children),因为我无法检查所以当我将它们添加到树时它是否会是空的?
我尝试使用枚举来遍历树并检查每个节点以检查它有多少 children 但这没有帮助,因为即使我可以告诉我我所在的节点是需要删除的节点 我必须告诉他的 parent 删除他 我不能告诉他将自己从他的 parent 节点中删除。
我需要使用什么来实现我正在寻找的东西?
Now how could I remove the nodes that are empty...so i want a node to either have only other nodes or only leaves but not both at the same time
遍历树并检查具有以下条件的节点
- 是一片叶子
- 有不是叶子的兄弟姐妹。
even if I could tell that the node I am at is a node that needs to be removed I have to tell his parent to remove him I cant tell him to remove himself from his parent node.
这就是 DefaultTreeModel.removeNodeFromParent() 方法的作用。因此,您可以递归地遍历树并根据给定的条件删除节点。
DefaultMutableTreeNode root = new DefaultMutableTreeNode ("Root");
//other code
DefaultTreeModel treeModel = new DefaultTreeModel(root);
JTree tree = new JTree(treeModel);
//populate tree
recurseTree(root, treeModel);
//method to recursively remove leaf nodes that have non-leaf siblings
private void recurseTree(MutableTreeNode node, DefaultTreeModel treeModel){
if ( node.isLeaf() ){
TreeNode parent = node.getParent();
for ( int i = 0; i < parent.getChildCount(); i++ ){
if ( !parent.getChildAt(i).isLeaf() ){
treeModel.removeNodeFromParent(node);
break;
}
}
}else{
for ( int i = 0; i < node.getChildCount(); i++ ){
recurseTree((MutableTreeNode)node.getChildAt(i), treeModel);
}
}
}
综上所述,最初添加这些节点似乎需要很长的路要走。在不知道填充树的底层数据结构的情况下,人们只能猜测如何着手防止这些节点被添加到第一位。
假设我有一个与我提供的图片相似的JTree
,每次我运行代码时叶子和节点的数量都会有所不同。现在我怎么能删除空的节点(又名没有 children),因为我无法检查所以当我将它们添加到树时它是否会是空的?
我尝试使用枚举来遍历树并检查每个节点以检查它有多少 children 但这没有帮助,因为即使我可以告诉我我所在的节点是需要删除的节点 我必须告诉他的 parent 删除他 我不能告诉他将自己从他的 parent 节点中删除。
我需要使用什么来实现我正在寻找的东西?
Now how could I remove the nodes that are empty...so i want a node to either have only other nodes or only leaves but not both at the same time
遍历树并检查具有以下条件的节点
- 是一片叶子
- 有不是叶子的兄弟姐妹。
even if I could tell that the node I am at is a node that needs to be removed I have to tell his parent to remove him I cant tell him to remove himself from his parent node.
这就是 DefaultTreeModel.removeNodeFromParent() 方法的作用。因此,您可以递归地遍历树并根据给定的条件删除节点。
DefaultMutableTreeNode root = new DefaultMutableTreeNode ("Root");
//other code
DefaultTreeModel treeModel = new DefaultTreeModel(root);
JTree tree = new JTree(treeModel);
//populate tree
recurseTree(root, treeModel);
//method to recursively remove leaf nodes that have non-leaf siblings
private void recurseTree(MutableTreeNode node, DefaultTreeModel treeModel){
if ( node.isLeaf() ){
TreeNode parent = node.getParent();
for ( int i = 0; i < parent.getChildCount(); i++ ){
if ( !parent.getChildAt(i).isLeaf() ){
treeModel.removeNodeFromParent(node);
break;
}
}
}else{
for ( int i = 0; i < node.getChildCount(); i++ ){
recurseTree((MutableTreeNode)node.getChildAt(i), treeModel);
}
}
}
综上所述,最初添加这些节点似乎需要很长的路要走。在不知道填充树的底层数据结构的情况下,人们只能猜测如何着手防止这些节点被添加到第一位。