#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