删除 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

遍历树并检查具有以下条件的节点

  1. 是一片叶子
  2. 有不是叶子的兄弟姐妹。

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

}

综上所述,最初添加这些节点似乎需要很长的路要走。在不知道填充树的底层数据结构的情况下,人们只能猜测如何着手防止这些节点被添加到第一位。