Как удалить все узлы из 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;
    }
}

Итак, в моем дереве есть несколько узлов, называемых «кривая» + некоторый идентификатор, и я хочу стереть один из них и все его дочерние элементы с помощью этого метода, но если я вызову метод с идентификатором = 0, я хочу, чтобы он удалил каждый узел из JTree.

Это не работает. Он стирает узлы, но когда я добавляю узел, стертые также появляются вместе с новым. Если это тот же узел, который был стерт, теперь он появляется дважды. Что случилось?

ПРИМЕЧАНИЕ. Каждый раз, когда я добавляю или удаляю узел, я вызываю метод обновления для JTree, чтобы обновить его вручную. Именно там я вызываю показанные методы, чтобы стереть каждый узел, поэтому я могу добавить те, которые должны остаться.


person Roman Rdgz    schedule 31.10.2011    source источник


Ответы (1)


Насколько я понимаю, вы хотите удалить узел, идентификатор которого равен заданному идентификатору, верно? Затем я бы порекомендовал вам создать метод, который с учетом идентификатора находит узел, а затем еще один метод для удаления найденного узла. Что-то вроде этого (я предполагаю, что вы используете 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
    }
  }
} 
person Luismahou    schedule 31.10.2011
comment
И да, и нет: я хочу иметь возможность стереть определенный узел по его идентификатору, но я также хочу стереть весь JTree, и я не знаю, как это сделать. removeAllChildren() в корне сделает это? - person Roman Rdgz; 31.10.2011
comment
-1, нет такой вещи, как treeModel.nodeStructuredChanged(), и вы не можете передать нулевой аргумент. - person Gili; 09.01.2012
comment
Метод существует. Моя ошибка заключалась в том, что я не передал nodeToRemove в качестве аргумента метода. Вот что происходит, когда вы кодируете Java прямо в браузере: P. Кстати, теперь это исправлено. - person Luismahou; 14.01.2012
comment
nodeStructuredChanged изменено на nodeChanged - person FonzTech; 08.06.2018