Как удалить все узлы из JTree

#java #swing #jtree

#java #качать #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 = 0, я хочу, чтобы он удалял все узлы из JTree.

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

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

Ответ №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
    }
  }
} 
 

Комментарии:

1. Да и нет: я хочу иметь возможность удалять определенный узел по его идентификатору, но я также хочу стереть все JTree, и это то, что я не знаю, как сделать. removeAllChildren() в корне сделает это?

2. -1, не существует такой вещи, как TreeModel.nodeStructuredChanged(), и вы не можете передать нулевой аргумент.

3. Метод существует . Моя ошибка заключалась в том, что я не передал nodeToRemove в качестве аргумента метода. Это то, что происходит, когда вы кодируете Java непосредственно в браузере: P. Кстати, теперь это исправлено.

4. nodeStructuredChanged был изменен на nodeChanged