我有一个包含自定义对象和自定义模型的JTree。 在某些时候,我选择一个节点,当发生这种情况时,我用新检索的数据更新树。 当发生这种情况时,我会通过树找到所选节点并用新的节点替换它(最新)。 当我找到它时,我从其父节点中删除旧节点,在其位置添加新节点并调用nodeChanged(newNode)。树更新正常,新节点出现在那里,内容更新。
问题是当从这个树更新回来时,选择路径还没有更新,所以当我使用方法getSelectionPaths()时,返回路径(如果只选择了一个节点)对应于我删除的旧节点从树上。
如何更新新更新模型的选择路径?
答案 0 :(得分:3)
您可以创建一个新的TreePath并使用新路径调用setSelectedPath。但是,更好的是,不是删除节点,而是使其变为可变并更新节点。这样树模型就不会改变,选择路径也不会改变。
您还需要触发相应的事件(节点已更改,而不是删除/添加节点等)。
答案 1 :(得分:0)
如果您能够找到树叶的新路径,则可以创建TreePath。
我做了一个例子,在JTree中选择一个具有一级节点的叶子:
public JTree fileTree;
public void setJTreePath(String leafName, String nodeName) {
TreeNode root = (TreeNode) fileTree.getModel().getRoot();
TreePath path = new TreePath(root);
int rootChildCount = root.getChildCount();
mainLoop:
for (int i = 0; i < rootChildCount; i++) {
TreeNode child = root.getChildAt(i);
if (child.toString().equals(nodeName)) {
path = path.pathByAddingChild(child);
int ChildCount = child.getChildCount();
for (int j = 0; j < ChildCount; j++) {
TreeNode child2 = child.getChildAt(j);
if (child2.toString().equals(leafName)) {
path = path.pathByAddingChild(child2);
fileTree.setSelectionPath(path);
//I've used a SwingUtilities here, maybe it's not mandatory
SwingUtilities.invokeLater(
new Runnable() {
@Override
public void run() {
fileTree.scrollPathToVisible(fileTree.getSelectionPath());
}
});
break mainLoop;
}
}
}
}
}