Удаление дочерних узлов узла структуры Java JTree
У меня есть программа ftp, которая извлекает данные папки каждый раз, когда расширяется. Это делается с помощью такой модели:
private void FilesTreeTreeExpanded(javax.swing.event.TreeExpansionEvent evt) {
String path = new String("");
DefaultMutableTreeNode chosen = (DefaultMutableTreeNode) evt.getPath().getLastPathComponent();
String[] pathArray = evt.getPath().toString().replaceAll("]", "").split(",");
for (int i = 1 ; i < pathArray.length ; i++) path += "/"+ pathArray[i].trim();
// я был добавлен selected.removeAllChildren(); без успеха ftp.GoTo(путь);
ArrayList listDir = null; listDir = ftp.ListDir (); ArrayList listFiles = null; listFiles = ftp.ListFiles (); DefaultMutableTreeNode child = null, dir = null, X = null; // это добавит файлы в дерево для (int i = 0; i 0)
model.insertNodeInto(child, selected, 0);
}
// это добавит dir в список для (int i = 0; i 0)
model.insertNodeInto(dir, selected, 0);
}
FilesTree.setModel(model); // это мой Swing JTree
}проблема в том, что каждый раз, когда я расширяю JTree, он дублирует список файлов и папок. поэтому я попытался использовать selected.removeAllChildren(); @ верхняя часть кода, но она ничего не удаляла. что я должен делать?
3 ответа
Ваша модель верна, но JTree работает со старой информацией.
removeAllChildren()
метод удаляет дочерние элементы, но он не запускает никаких событий и model.insertNodeInto()
делает события вставки огня. Таким образом, JTree видит добавляемые узлы, но никогда не видит удаляемых узлов.
После добавления новых детей попробуйте позвонить model.reload(chosen)
сделать недействительным дерево ниже chosen
,
Поскольку вы будете перезагружать ветку, вы также можете изменить model.insertNodeInto(dir, chosen,0)
в chosen.insert(dir,0)
, Это уменьшает количество опубликованных событий.
Призвание removeAllChildren()
удалит детей из узла. Здесь должно быть что-то еще, что создает дубликаты. Убедитесь, что вы ничего не вызываете дважды и обновляете отображение дерева.
В моем приложении также я просто на самом деле та же проблема. Для этого я просто использовал следующий код.
JTree.removeAll();
JTree.setModel(null);
Это удаляет все дочерние узлы из моего Jtree.