2014-01-15 82 views
4

我有一个使用DefaultTreeModel的JTree。我需要去它的每个节点。遍历多级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()) {} 

但我可以”提出一个工作功能。我需要把---节点名称---当启动一个节点和结束节点+++节点名称+++我不能这样做。如果只有一个父节点不是另一个父节点的最后一个元素,我将它工作到了一个点。但是当最后一个节点也是父节点时它会中断。任何帮助,将不胜感激。

编辑:

现在我注意到它甚至没有工作,以及我的想法。这里是我的电流输出:

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

} 
+0

到目前为止,您有什么和它输出什么? –

+0

@JavaDevil我更新了这个问题,但正如你所看到的,它根本不起作用,所有的团体结局都是一样的。我无法理解这一点。 – cbt

回答

2

使用递归,你可以做这样的事伪码

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

编辑我的递归方法的版本

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

这会给你>的水平也如我的输出是:

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

这就像我一直在做的事情,但我应该如何保存外部节点的名称,因为我深入?我需要以“---”开头的组名,以“+++”结尾。看看我的输出,它关闭了每个组中最内层的一个(3) – cbt

+0

如果您使用的是递归方法,那么您不需要存储任何内容。你可以编辑包含你的代码,你有 –

+0

我更新了代码。我不知道我明白你的意思。我如何知道何时离开组,以便添加'System.out.println(“+++”+ nodeName +“+++”);' – cbt

-2

网页搜索 “深度优先遍历树” 和/或 “广度优先遍历树”。前者更常见,但后者有应用。

如果树节点是双向链接的(如果节点可以到达其父母以及子节点),则存在深度优先解决方案,其唯一状态是当前节点。否则,你需要维护一个堆栈(作为一个数据结构,或者递归地行走),以便在分支给定级别用完兄弟之后再回来。

2

我解决它通过开沟列举并构建我自己的功能:

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

} 
+0

不错的工作,我只是要编辑我的文章,包括一个类似的功能,它做同样的事情! –

+0

谢谢!现在我正在寻找使它更漂亮。如果它们是叶子,我想将char'>'添加到节点名称的开头。应该有2'>',如果它的父母也有父母,等等。我直到现在都失败了,但我想我首先需要一杯咖啡。 :)如果我以后再失败可以在这里再次发布您的建议? – cbt

+1

看我原来的帖子 - 我补充说,哟我的方法 –