1 回答
TA贡献1906条经验 获得超3个赞
问题与TreeModel在每次调用updateTree. 问题是treeNode变量引用了旧树中的一个节点。因此,从新树的根到老树中的节点是没有路径的(即getParent()多次调用fromtreeNode会导致到老树的根而不是新树的根)。我看到两个潜在的选择来解决您的问题。
选项 1:搜索新的树节点
您可以编写一个类似下面的函数来搜索从新根开始的具有旧路径的树节点treeNode。
private static DefaultMutableTreeNode searchTree(DefaultMutableTreeNode root, Object[] path) {
if (!root.getUserObject().equals(path[0])) {
// completely different root
// potentially problematic
return null;
}
DefaultMutableTreeNode node = root;
for (int i = 1; i < path.length; ++i) {
Object searchItem = path[i];
Enumeration<TreeNode> children = node.children();
boolean found = false;
while (children.hasMoreElements()) {
DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
if (searchItem.equals(child.getUserObject())) {
found = true;
node = child;
break;
}
}
if (!found) {
// path does not exist any more
// potentially problematic
return null;
}
}
return node;
}
然后,您将updateTree在设置树选择路径之前将以下内容添加到方法中。
treeNode = searchTree((DefaultMutableTreeNode) tree.getModel().getRoot(), treeNode.getUserObjectPath());
选项 2:修改现有树
而不是每次修改现有的树模型时都创建一个新的树模型。对于每个目录,首先在目录中创建一组文件,并在树中为目录创建一组树节点。删除不在目录中的文件的所有树节点。然后,为目录中尚未在树中的所有文件创建节点。此选项可能比选项 1 更复杂,但它不会在整个代码中产生重复树节点的潜在问题。
添加回答
举报