遍历多级JTree的所有节点

时间:2014-01-15 03:13:00

标签: java swing jtree

我有一个带有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 +++ 结束节点,我无法做到这一点。如果只有一个父节点不是另一个父节点的最后一个元素,我的工作到了一定程度。但是当最后一个节点也是父节点时它会中断。任何帮助将不胜感激。

修改

现在我注意到它甚至没有像我想的那样工作。这是我目前的输出:

----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++;

}

3 个答案:

答案 0 :(得分:3)

我通过抛弃枚举并构建我自己的函数来解决它:

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

    printNode(root);

public void printNode(DefaultMutableTreeNode node) {

    int childCount = node.getChildCount();

    System.out.println("---" + node.toString() + "---");

    for (int i = 0; i < childCount; i++) {

        DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) node.getChildAt(i);
        if (childNode.getChildCount() > 0) {
            printNode(childNode);
        } else {
            System.out.println(childNode.toString());
        }

    }

    System.out.println("+++" + node.toString() + "+++");

}

答案 1 :(得分:2)

使用递归你可以做类似这样的psuedocode

  1. 从根
  2. 开始
  3. 如果是叶子      - 打印节点名称并返回
  4. 打印---节点名称----
  5. 如果节点有孩子      - 每个孩子的递归(从2开始)
  6. 打印+++节点名称++++

  7. 修改我的递归方法版本

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

    这会给你&gt;对于水平也例如我的输出是:

    --- A ---
    >--- B ---
    >>C
    >>--- D ---
    >>>E
    >>+++ D +++
    >+++ B +++
    >F
    >G
    >H
    +++ A +++
    

答案 2 :(得分:-2)

Websearch“深度第一树步行”和/或“广度第一树步行”。前者更常见,但后者有应用。

如果树节点是双向链接的(如果节点可以到达父节点和子节点),则存在深度优先解决方案,其唯一状态是当前节点。否则,你需要维护一个堆栈(作为一个数据结构,或者通过递归步行),这样你就可以在一个分支的给定级别用尽兄弟姐妹后重新开始。

相关问题