Удаление дочерних узлов структуры Java JTree

#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.