#java #swing #jtree #jtreetable
#java #swing #jtree #jtreetable
Вопрос:
У меня есть 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();
// i were aded chosen.removeAllChildren(); without success
ftp.GoTo(path);
ArrayList listDir = null;
listDir = ftp.ListDir();
ArrayList listFiles = null;
listFiles = ftp.ListFiles();
DefaultMutableTreeNode child = null , dir = null , X = null;
//this will add files to tree
for (int i = 0; i < listFiles.size(); i ) {
child = new DefaultMutableTreeNode(listFiles.get(i));
if(listFiles.size() > 0)
model.insertNodeInto(child, chosen, 0);
}
//this will add dirs to list
for (int i = 0; i < listDir.size(); i ) {
X = new DirBranch("در حال دریافت اطلاعات ...").node();
dir = new DirBranch( (String) listDir.get(i)).node();
dir.add(X);
if(listDir.size() > 0)
model.insertNodeInto(dir, chosen, 0);
}
FilesTree.setModel(model); //this is my Swing JTree
}
проблема в том, что каждый раз, когда я разворачиваю JTree, он дублирует список файлов и папок. поэтому я попытался использовать chosen.removeAllChildren(); @ в верхней части кода, но это ничего не удалило. что мне делать?
Ответ №1:
Ваша модель верна, но JTree работает со старой информацией.
removeAllChildren()
Метод удаляет дочерние узлы, но он не запускает никаких событий, а model.insertNodeInto()
запускает события вставки. Итак, JTree видит добавляемые узлы, но никогда не видит удаляемые узлы.
После добавления новых дочерних элементов попробуйте вызвать, model.reload(chosen)
чтобы сделать недействительным дерево ниже chosen
.
Поскольку вы будете перезагружать ветку, вы также можете изменить model.insertNodeInto(dir, chosen,0)
на chosen.insert(dir,0)
. Это уменьшает количество публикуемых событий.
Ответ №2:
Вызов removeAllChildren()
приведет к удалению дочерних элементов из узла. Здесь должно происходить что-то еще, что создает дубликаты. Убедитесь, что вы ничего не вызываете дважды и что вы обновляете отображение дерева.
Комментарии:
1. мой код будет добавлять прослушивание каталога каждый раз. итак, сначала я должен очистить узел, а затем снова добавить папки.
Ответ №3:
В моем приложении я также сталкиваюсь с той же проблемой. Для этого я просто использовал следующий код.
JTree.removeAll();
JTree.setModel(null);
Это удаляет все дочерние узлы из моего Jtree.