如何从JTree中删除所有节点

时间:2011-10-31 12:19:40

标签: java swing 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;
    }
}

所以,我的Tree有一些名为“curve”的节点+一些ID,我想用这个方法擦除其中一个及其所有子节点,但如果我用ID = 0调用该方法,我希望它删除每个来自JTree的节点。

它不起作用。它确实擦除了节点,但是当我添加节点时,擦除的节点也会出现新节点。如果它是被擦除的同一节点,它现在出现两次。怎么了?

注意:每次添加或删除节点时,我都会调用JTree的更新方法,手动刷新它。我在那里调用显示的方法来擦除每个节点,所以我可以添加那些应该保留的节点。

1 个答案:

答案 0 :(得分:3)

根据我的理解,您要做的是删除ID等于给定ID的节点,是吗?然后,我建议您创建一个方法,给定一个ID,找到该节点,然后另一个方法来删除找到的节点。这样的事情(我假设您使用的是DefaultTreeModelDefaultMutableTreeNodes):

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
    }
  }
}