删除JTree中节点之间的叶子

时间:2016-08-04 15:02:28

标签: swing user-interface tree jtree

enter image description here

假设我有JTree类似于我提供的图片,其中每次运行代码时叶子和节点的数量都会有所不同。现在我怎么能删除空的节点(AKA没有子节点),因为我无法检查,所以当我将它们添加到树中时,看看它是否为空?

我尝试使用枚举来遍历树并检查每个节点以检查它有多少个孩子,但这没有帮助,因为即使我可以告诉我所在的节点是一个需要的节点删除我必须告诉他的父母删除他我不能告诉他从他的父节点删除自己。

我需要用什么来达到我想要的目标?

1 个答案:

答案 0 :(得分:2)

  

现在我怎么能删除空的节点...所以我希望节点要么只有其他节点,要么只有叶子但不能同时有两个节点

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

  1. 是叶子
  2. 兄弟姐妹不是叶子。
  3.   

    即使我可以告诉我所在的节点是一个需要删除的节点,我必须告诉他的父母删除他我不能告诉他从父节点中删除自己。

    这就是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);
            }
        }
    
    }
    

    所有这一切都说明了,这些节点的初始添加看起来很长。在不知道填充树的基础数据结构的情况下,人们只能猜测如何防止首先添加这些节点。