为了账号安全,请及时绑定邮箱和手机立即绑定

突出显示 JTree 节点在幕后工作,但不是视觉上的

突出显示 JTree 节点在幕后工作,但不是视觉上的

拉莫斯之舞 2022-01-19 17:16:31
在我的应用程序中,我在左侧显示了一个 JTree,如果用户双击叶子,则在右侧加载相应的数据。在加载此数据时,我 (i) 保存现有文档(此处不相关),(ii) 更新树以说明可能发生的任何更改,(iii) 确保在更新后的树(即用户双击的节点)和(iv)加载选定的节点。应用程序逻辑工作正常,即加载了正确的文件,因此我们知道在树中选择了正确的节点,但在上述步骤之后,视觉上根本没有选择任何节点。我知道这个问题,但问题似乎是树不在焦点上。我已经尝试了该帖子中建议的不同补救措施,但未能解决我的问题。(还有这个相关的论坛帖子,虽然该网站现在似乎已经关闭。此外,这个问题表面上看起来很相似,但那里的问题源于 OP 构建专有渲染器。)请看下面我的代码;我试图将其减少到 SSCCE,但我仍然卡住了。我目前最好的猜测是,问题与每次updateTree调用时都会创建一个全新的 TreeModel 并将其加载到树中的事实有关,并且这在某种程度上使得无法直观地选择正确的节点。如果情况确实如此,那么一个潜在的解决方案是更改 TreeModel 而不是从头开始重新创建它,但是 (i) 这对我来说不太方便,并且 (ii) 我相信这本身就是一个有趣的问题对。
查看完整描述

1 回答

?
一只名叫tom的猫

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 更复杂,但它不会在整个代码中产生重复树节点的潜在问题。


查看完整回答
反对 回复 2022-01-19
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信