0

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

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

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

4

2 回答 2

3

您可以创建一个新的 TreePath 并使用新路径调用 setSelectedPath。但是,更好的是,与其删除节点,不如使其可变并更新节点。这样树模型不会改变,选择路径也不会改变。

您还需要触发适当的事件(节点更改,而不是删除/添加节点等)。

于 2012-06-05T20:11:00.430 回答
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;
                }
            }
        }
    }
}
于 2012-06-05T20:35:37.577 回答