Java 遍历多级JTree的所有节点

Java 遍历多级JTree的所有节点,java,swing,jtree,Java,Swing,Jtree,我有一个带有DefaultTreeModel的JTree。我需要找到它的每个节点 想象我有一棵树: [A] |-[B] |-[C] |-[D] | |-[E] | |-[F] | |-[G] | |-[H] |-[I] |-[J] |-[K] 我需要遍历它并打印出: ---[A]--- >[B] >[C] >---[D]--- >>---[E]--- >>>[F]

我有一个带有DefaultTreeModel的JTree。我需要找到它的每个节点

想象我有一棵树:

[A]
 |-[B]
 |-[C]
 |-[D]
 |  |-[E]
 |     |-[F]
 |     |-[G]
 |     |-[H]
 |-[I]
 |-[J]
 |-[K]
我需要遍历它并打印出:

   ---[A]---
   >[B]
   >[C]
   >---[D]---
   >>---[E]---
   >>>[F]
   >>>[G]
   >>>[H]
   >>+++[E]+++
   >+++[D]+++
   >[I]
   >[J]
   >[K]
   ---[A]---
所以,我正在使用

  java.util.Enumeration en = root.preorderEnumeration();

  while (en.hasMoreElements()) {}
但是我不能想出一个有效的函数。在启动一个节点时,我需要输入---NODE NAME---,然后用+++NODE NAME+++结束该节点,但我无法这样做。如果只有一个父节点不是另一个父节点的最后一个元素,那么它就可以工作到一定程度。但当最后一个节点也是父节点时,它会中断。任何帮助都将不胜感激

编辑:

while (en.hasMoreElements()) {

    nodeTemp = node;
    node = (DefaultMutableTreeNode) en.nextElement();

    String nodeName = node.toString();

    if (node.getChildCount() > 0) {

        System.out.println("---" + nodeName + "---");

    } else {

        if (nodeTemp.getChildCount() == 0 && nodeTemp.getParent() != node.getParent()) {
            System.out.println("+++" + nodeName + "+++");
            loopCount++;

        }

        System.out.println(nodeName);

    }

    loopCount++;

}
现在我发现它甚至没有我想象的那么好。这是我当前的输出:

----root (81)----
name
time
displaySize
----New Group1----
BaseX
BaseY
----New Group2----
BaseRadius
----New Group3----
Angle
DistanceFromCenter
++++New Group3++++
PlayerSpeed
MouseX
MouseY
++++New Group3++++
PlayerX
PlayerY
BonusSpawned
actorTags
++++New Group3++++
BonusTime
BonusWhich
+++root+++
Edit2:

while (en.hasMoreElements()) {

    nodeTemp = node;
    node = (DefaultMutableTreeNode) en.nextElement();

    String nodeName = node.toString();

    if (node.getChildCount() > 0) {

        System.out.println("---" + nodeName + "---");

    } else {

        if (nodeTemp.getChildCount() == 0 && nodeTemp.getParent() != node.getParent()) {
            System.out.println("+++" + nodeName + "+++");
            loopCount++;

        }

        System.out.println(nodeName);

    }

    loopCount++;

}
网络搜索“深度优先树行”和/或“宽度优先树行”。前者更常见,但后者也有应用


如果树节点是双链接的(如果节点可以到达其父节点和子节点),则存在深度优先解决方案,其唯一状态是当前节点。否则,您将需要维护一个堆栈(作为数据结构,或通过递归方式),以便在分支的给定级别上的兄弟节点用完后可以返回。

使用递归,您可以执行类似于此伪代码的操作

  • 从根开始
  • 如果是一片叶子 -打印节点名称并返回
  • 打印---节点名称----
  • 如果节点有子节点 -与每个子级递归(从2开始)
  • 打印++++节点名称++++

  • 编辑递归方法的我的版本

    public static void print(DefaultMutableTreeNode aNode)
    {
        String name = aNode.toString();
        int level= aNode.getLevel();
        String placement = "";
        while (level > 0)
        {
            placement += ">";
            level--;
        }
        if(aNode.isLeaf())
        {
            System.out.println(placement + name);
            return;
        }
    
        System.out.println(placement + "--- " + name + " ---");
        for(int i = 0 ; i < aNode.getChildCount() ; i++)
        {
            print((DefaultMutableTreeNode)aNode.getChildAt(i));
        }
        System.out.println(placement + "+++ " + name + " +++");
    }
    

    我通过放弃枚举并构建自己的函数解决了这个问题:

        DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    
        printNode(root);
    

    public void打印节点(DefaultMutableTreeNode节点){
    int childCount=node.getChildCount();
    System.out.println(“--”+节点.toString()+“--”);
    for(int i=0;i0){
    printNode(childNode);
    }否则{
    System.out.println(childNode.toString());
    }
    }
    System.out.println(“+++”+节点.toString()+“+++”);
    }
    
    到目前为止,您有什么以及它输出了什么?@JavaDevil我更新了这个问题,但您看到它根本不起作用,所有组的结尾都是相同的。我就是想不起来。这有点像我一直在做的事情,但是我应该如何在深入时存储外部节点的名称呢?我需要以“--”开头的组名,以“+++”结尾。看看我的输出,它用最内部的一个(3)关闭每个组。如果使用递归方法,则不需要存储任何内容。你能编辑包含你的代码吗?我更新了代码。我不知道我是否明白你的意思。我如何知道何时离开一个组,以便添加
    System.out.println(“+++”+nodeName+“+++”)这比我想象的要简单得多,谢谢你给我指点递归函数。干得好,我正要编辑我的帖子,加入一个做同样事情的类似函数!谢谢现在我想让它更漂亮。我想在节点名的开头添加字符'>',如果它们是叶。如果其父级也有父级,则应该有2'>',依此类推。我直到现在都失败了,但我想我需要先喝杯咖啡。:)如果我以后再次失败,你可以在这里再次发布你的建议吗?请参阅我原来的帖子-我补充了我的方法