2011-10-31 1 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라는 일부 노드를 가지고 있으며, 나는 그들 중 하나를이 방법으로 모든 아이를 지우려하지만 경우 I : 나는 재귀 방법으로 시도하고있다 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. BTW, 이제 해결되었습니다. – Luismahou