2011-10-31 103 views
2

我想從JTree中刪除每個節點,除了我想保留的根節點。我想用遞歸方法:如何從JTree中刪除所有節點

public void removeMeasurement (Long ID){ 
    removeMeasurement(root, ID); 
    collapseAll(); 
    expandAll(); 
} 

public void removeMeasurement (MutableTreeNode nodo, Long ID){  
    if (nodo.getChildCount() >= 0) { 
     for (Enumeration e=nodo.children(); e.hasMoreElements();) { 
      MutableTreeNode n = (MutableTreeNode)e.nextElement(); 
      removeMeasurement(n, ID); 
     } 
    } 
    if(ID==0){ 
     nodo.removeFromParent(); 
     Register.debug("Eliminando ["+nodo.toString()+"]"); 
     return; 
    } 
    else if(nodo.toString().toLowerCase().equals("curve "+ID)){ 
     nodo.removeFromParent(); 
     return; 
    } 
} 

所以,我的樹有一些節點稱爲「曲線」 +一些ID,我要刪除其中之一,其所有的孩子使用這種方法,但如果我調用ID = 0的方法我希望它從JTree中刪除每個節點。

它不工作。它會清除節點,但是當我添加一個節點時,刪除的節點也會與新節點一起出現。如果它是同一個節點,它將被刪除,現在它會出現兩次。怎麼了?

注意:每次添加或擦除節點時,我都會調用JTree的更新方法來手動刷新它。在那裏我打電話給所示的方法來擦除每個節點,所以我可以添加應該保留的那些。

回答

3

從我的理解你想要做的是刪除ID等於給定ID的節點,是嗎?然後,我會建議您創建一個方法,給定一個ID,找到該節點,然後再用另一種方法刪除找到的節點。像這樣的東西(我假設你使用的是DefaultTreeModel,並DefaultMutableTreeNodes):

DefaultMutableTreeNode findById(TreeModel treeModel, Long id) { 
    if (id == 0) { 
    return (DefaultMutableTreeNode) treeModel.getRoot(); 
    } 
    String curveId = "curve " + id; 
    // The enumeration returns all the nodes, so it's not necessary to do a recursive search 
    Enumeration en = ((DefaultMutableTreeNode) treeModel.getRoot()).breadthFirstEnumeration(); 
    while (en.hasMoreElements()) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement(); 
    if (curveId.equalsIgnoreCase(node.toString()) { 
     return node; 
    } 
    } 
} 
void removeById(DefaultTreeModel treeModel, Long id) { 
    DefaultMutableTreeNode nodeToRemove = findById(treeModel, id); 
    if (nodeToRemove != null) { 
    if (nodeToRemove.isRoot()) { 
     nodeToRemove.removeAllChildren(); 
     treeModel.nodeStructuredChanged(nodeToRemove); // To notify the JTree to update from the root 
    } 
    else { 
     treeModel.removeNodeFromParent(nodeToRemove); // Automatically notify the JTree 
    } 
    } 
} 
+1

是的,沒有:我希望能夠通過它的ID刪除某個節點,但我也想抹去整個JTree,這是我不知道該怎麼做。在根的removeAllChildren()會使它成爲? –

+0

-1,沒有這樣的事情treeModel.nodeStructuredChanged(),你不能傳入一個空參數。 – Gili

+0

[該方法存在](http://docs.oracle.com/javase/1.4.2/docs/api/javax/swing/tree/DefaultTreeModel.html#nodeStructureChanged(javax.swing.tree.TreeNode))。我的錯誤是不通過** nodeToRemove **作爲方法的參數。當您在瀏覽器中直接編碼Java時,會發生這種情況:P。順便說一下,它現在已經修復了。 – Luismahou