2011-01-29 27 views
0

我有被構造爲具有以下方法用JTree
(該BKMNode類擴展DefaultMutableTreeNode,將DataNode簡單地保存數據)麻煩與插入筆記入一個JTree

void populateTree(BKMNode parent) { 
    for (DataNode node : nodes) { 
     BKMNode treeNode = new BKMNode(node.name,node.fullName,null); 
     // check if this node was already added before 
     if (! existingNodes.contains(ip + "." + node.fullName)) { 
      existingNodes.add(ip + "." + node.fullName); 
      DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
      model.insertNodeInto(treeNode, parent, parent.getChildCount()); 
      System.out.println("adding " + ip + "." + node.fullName); 
     } 
     node.populateTree(treeNode); 
    } 

// some more non-relevant code...

在應用程序啓動時創建樹時,一切都很好。
但有一次,我的應用程序使用相同的方法將節點添加到樹中。
當應用程序嘗試向樹中添加新節點時,將打印文本,但GUI上沒有任何更改。
我打過電話JTree.invalidate()validate()repaint()reload()但似乎沒有任何幫助。

populateTree方法總是從EDT調用。

有誰知道這裏有什麼問題嗎?

非常感謝!

+2

爲了更快地獲得更好的幫助,請發佈SSCCE(http://pscode.org/sscce.html)。 – 2011-01-29 12:44:05

+0

另外,你在哪裏修改JTree?看起來您每次插入節點時都會創建一個新的DefaultTreeModel?你不應該清除現有的DefaultTreeModel並添加節點嗎? – Pace 2011-01-29 12:54:23

回答

3

相信我,我嘗試使用每無效,驗證,重新繪製,重載方法

對不起,我不信任你,人們做出愚蠢的錯誤所有的時間。這就是爲什麼我們需要一個SSCCE來確切地看你在做什麼。話雖如此,沒有理由調用任何這些方法。當您從容器中添加/刪除組件時,使用invalidate(),validate(),您還沒有這樣做。更新模型時,模型負責通知視圖,以便視圖可以重新繪製自身。

,但沒有改變的GUI

你期望改變?

插入節點會將節點插入到模型中。如果父節點已擴展,那麼您應該看到插入的節點。但是,如果父節點已摺疊,則不會看到更改。

如果你想看到你插入後,那麼你可以使用tree.expandPath(...)方法的節點。

當我插入包含字符串值的默認節點時,您發佈的基本代碼適合我。也許問題是你的自定義節點?所以你需要做的第一件事就是創建一個與默認節點一起工作的SSCCE。一旦這個工作,你用你的自定義節點替換默認節點。如果它有效,那很好。如果不是,你知道問題是你的自定義節點。

根據提供的代碼它應該可以工作,所以你需要給我們更多的工作。

0

解決!我在DefaultTreeModel的源代碼中的「nodesWereInserted」方法中添加了一些斷點,並使用調試器運行該應用程序。它表明新節點添加了一個空的父節點!進一步的調查顯示問題 - 節點.populateTree(treeNode);行添加了新節點,但沒有連接其註定的父節點。 這是新的(工作)代碼。非常感謝您的幫助。

void populateTree(BKMNode parent) { 
    for (DataNode node : nodes) { 
     BKMNode treeNode = new BKMNode(node.name,node.fullName,null); 
     // check if this node was already added before 
     if (! existingNodes.contains(ip + "." + node.fullName)) { 
      existingNodes.add(ip + "." + node.fullName); 
      DefaultTreeModel model = (DefaultTreeModel)tree.getModel(); 
      model.insertNodeInto(treeNode, parent, parent.getChildCount()); 
      node.bkmNode = treeNode; 
      node.populateTree(treeNode); 
     } else { 
      node.populateTree(node.bkmNode); 
     } 
    } // for