2014-01-15 83 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

看我原來的帖子 - 我補充說,喲我的方法 –