【问题标题】:How to remove all nodes from a JTree如何从 JTree 中删除所有节点
【发布时间】:2011-12-18 17:03:34
【问题描述】:

我想从 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;
    }
}

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

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

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

【问题讨论】:

    标签: java swing jtree


    【解决方案1】:

    据我了解,您要做的是删除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
        }
      }
    } 
    

    【讨论】:

    • 是和否:我希望能够通过其 ID 擦除某个节点,但我也想擦除整个 JTree,这就是我不知道该怎么做。根目录下的 removeAllChildren() 会成功吗?
    • -1,没有treeModel.nodeStructuredChanged()这样的东西,你不能传入一个空参数。
    • The method exists。我的错误是没有将 nodeToRemove 作为方法的参数传递。当您直接在浏览器中编写 Java 代码时会发生这种情况:P。顺便说一句,它现在已经修复了。
    • nodeStructuredChanged 已更改为nodeChanged
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2012-11-29
    • 1970-01-01
    • 2013-12-20
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多