2014-02-18 89 views
1

所以我有一個用戶定義的二叉樹類,我想用圖形表示。 JTree似乎是這裏最好的選擇。我的類有一個對其當前位置的引用,以允許用戶更輕鬆地遍歷和抽象內部節點類。當下一個被調用時,它遍歷並返回節點的值。二叉樹圖形表示麻煩

大部分情況下,我已經能夠讓這些樹一起工作,但當用戶添加節點時遇到了問題。我已經設置好了,所以他們可以添加左邊的選擇或者正確的選擇 - 這與我保留的數據有關,所以它需要這樣 - 我完全停留在如何做到這一點上。我實施它的方式目前不可撤銷地解決了樹木問題,直到需要退出並重新初始化以重新獲得同步。

這裏是我有問題的方法:

一些信息:

,尤其是圓形,DTREE是我的樹類的一個對象,並gTree是一個JTree對象(數據樹,樹的圖形)

- 方法getShortName(String)返回用於表示JTree中當前節點的標準化名稱,該標準名稱是從dTree對象中外推的。

//Adds a new right node to the currently selected node. 
public void addNextR() 
{ 
    if(!dTree.hasNextR()) 
    { 
     dTree.addNextChoiceR("Empty Node"); 
     DefaultMutableTreeNode node = 
     ((DefaultMutableTreeNode)gTree.getSelectionPath().getLastPathComponent()); 
     node.add(new DefaultMutableTreeNode(getShortName(dTree.getCurrent()))); 
     expandTree(); 
    } 
} 

//Adds a new left node to the currently selected node. 
public void addNextL() 
{ 
    if(!dTree.hasNextL()) 
    { 
     dTree.addNextChoiceL("Empty Node"); 
     DefaultMutableTreeNode node = 
     ((DefaultMutableTreeNode)gTree.getSelectionPath().getLastPathComponent()); 
     node.add(new DefaultMutableTreeNode(getShortName(dTree.getCurrent()))); 
     expandTree(); 
    } 
} 

這將不勝感激,如果有人可以幫助我解決這個問題,我希望我已經按照正確的程序並給予足夠的信息。對不起,關於文本的牆,我只是想確保我解決了我的問題。儘管感謝至少閱讀了這一點,但!

+0

我看到提供http://stackoverflow.com/help/mcve可能在這裏很複雜,但...:只有加入新的子節點的父節點將無法正常更新的TreeModel(和因此樹)本身 - 這就是你可能用「去同化」的意思。您必須致電http://docs.oracle.com/javase/7/docs/api/javax/swing/tree/DefaultTreeModel.html#insertNodeInto%28javax.swing.tree.MutableTreeNode,%20javax.swing.tree .MutableTreeNode,%20int%29。另請參閱http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html#dynamic – Marco13

+0

中是如何使用它的,這就是爲什麼我一直在等待這個問題,試圖它出來我自己,但目前還沒有運氣。我的意思是,數據樹的位置標記與圖形樹的位置標記不一致。重新驗證在別處被調用,並且不會改變結果。但是我從中得到的結果是,我正走在正確的道路上呢?我的意思是添加子節點。 – ZimGee

+1

不確定你的意思是「重新驗證」,** I **無法判斷哪個曲目適合你;-)但是從教程網站運行「DynamicTreeDemo」並將其與節點插入(特別是關於'DefaultMutableTreeModel#insertNodeInto'幾乎不可能是*錯誤*軌道,至少 – Marco13

回答

0

爲了便於理解和輕鬆進行更改,我使用了三個類。

import java.io.*; 
import java.util.*; 
class TreeNode 
{ 
TreeNode left,right; 
int data; 
TreeNode() 
{ 
    data=0; 
    left=right=null; 
} 
TreeNode(int n) 
{ 
    data=n; 
    left=right=null; 
} 
void disp() 
{ 
    System.out.println(data+" "); 
} 
void setLeft(TreeNode n) 
{ 
    left=n; 
} 
void setRight(TreeNode n) 
{ 
    right=n; 
} 
TreeNode getLeft() 
{ 
    return left; 
} 
TreeNode getRight() 
{ 
    return right; 
} 
void setData(int d) 
{ 
    data=d; 
} 
int getData() 
{ 
    return data; 
} 
} 


class BinaryTree 
{ 
TreeNode root; 
BinaryTree() 
{ 
    root=null; 
} 
void insert(int data) 
{ 
    root=insert(root, data); 
} 
TreeNode insert(TreeNode node, int data) 
{ 
    if(node==null) 
    { 
     node=new TreeNode(data); 
    } 
    else 
    { 
     if(data<=node.data) 
     { 
      node.left=insert(node.left, data); 
     } 
     else 
     { 
      node.right=insert(node.right, data); 
     } 
    } 
    return(node); 
} 
void inorder() 
{ 
    inorder(root); 
    System.out.println(); 
} 
void inorder(TreeNode r) 
{ 
    if(r!=null) 
    { 
     inorder(r.getLeft()); 
     System.out.print(r.getData()+" "); 
     inorder(r.getRight()); 
    } 
} 
void preorder() 
{ 
    preorder(root); 
    System.out.println(); 
} 
void preorder(TreeNode r) 
{ 
    if(r!=null) 
    { 
     System.out.print(r.getData()+" "); 
     preorder(r.getLeft()); 
     preorder(r.getRight()); 
    } 
} 
void postorder() 
{ 
    postorder(root); 
    System.out.println(); 
} 
void postorder(TreeNode r) 
{ 
    if(r!=null) 
    {    
     postorder(r.getLeft()); 
     postorder(r.getRight()); 
     System.out.print(r.getData()+" "); 
    } 
    } 
    } 


    import java.io.*; 
    import java.util.*; 
    class btTraversal 
{ 
BinaryTree bt; 
void main() throws IOException 
{ 
    bt=new BinaryTree(); 
    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    int val; 
    char ch=' '; 
    String clearbuffer; 
    do 
    { 
     System.out.print("Enter a number: "); 
     val=Integer.parseInt(br.readLine()); 
     bt.insert(val); 
     System.out.print("Do you wish to enter more values (Y/N)....."); 
     ch=(char)br.read(); 
     clearbuffer=br.readLine(); 
    }while(ch=='y'||ch=='Y'); 
    System.out.println("Postorder traversal of given tree is: "); 
    bt.postorder(); 
    System.out.println("Preorder traversal of given tree is: "); 
    bt.preorder(); 
    System.out.println("Inorder traversal of given tree is: "); 
    bt.inorder(); 
} 
} 
+0

我想你可能誤解了我的問題。我沒有問題與實際的二叉樹類,我的問題是與JTree表示和使用GUI同步地向數據和圖形樹添加和刪除節點 – ZimGee

+0

對不起,我的錯誤沒有正確閱讀 –

+0

不用擔心,謝謝,不管怎麼說,這是非常簡潔的回答,只是錯誤的問題!哈哈 – ZimGee