模型更新时更新JTree中的selectionPaths

时间:2012-06-05 20:07:40

标签: java swing jtree

我有一个包含自定义对象和自定义模型的JTree。 在某些时候,我选择一个节点,当发生这种情况时,我用新检索的数据更新树。 当发生这种情况时,我会通过树找到所选节点并用新的节点替换它(最新)。 当我找到它时,我从其父节点中删除旧节点,在其位置添加新节点并调用nodeChanged(newNode)。树更新正常,新节点出现在那里,内容更新。

问题是当从这个树更新回来时,选择路径还没有更新,所以当我使用方法getSelectionPaths()时,返回路径(如果只选择了一个节点)对应于我删除的旧节点从树上。

如何更新新更新模型的选择路径?

2 个答案:

答案 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;
                }
            }
        }
    }
}