我有一个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时都会重复文件和文件夹列表。所以我试图使用 selected.removeAllChildren(); @代码的顶部,但它没有删除任何东西。我该怎么办?
答案 0 :(得分:5)
您的模型是正确的,但JTree正在使用旧信息。
removeAllChildren()
方法会删除子项,但它不会触发任何事件,而model.insertNodeInto()
会触发插入事件。因此,JTree看到添加的节点,但从未看到删除的节点。
添加新子项后,请尝试拨打model.reload(chosen)
以使chosen
下面的树无效。
由于您将重新加载分支,因此您还可以将model.insertNodeInto(dir, chosen,0)
更改为chosen.insert(dir,0)
。这减少了发布的事件数量。
答案 1 :(得分:1)
调用removeAllChildren()
将从节点中删除子节点。这里必然会发生其他事情,即创建重复项。确保你没有两次调用任何东西,并且你正在刷新树的显示。
答案 2 :(得分:0)
在我的应用中,我也是同样的问题。为此我只使用了以下代码。
JTree.removeAll();
JTree.setModel(null);
它从我的Jtree中删除所有子节点。