JTree 在更改节点名称时更改 lineStyle

JTree changes lineStyle when changing node's name

TLDR:

更新 JTree 的节点会更改 lineStyle(如下图),我不知道为什么会发生这种情况以及如何防止它发生,因为我的代码不会在该点更新 CellRenderer 的任何属性这些变化发生了。


我在 Java 中有一个 client-server 应用程序,我在其中向服务器发送数据请求,并根据使用服务器的客户端请求从数据库中请求一些数据,并将结果发送回客户端。然后将结果显示在 JTree 中,它已经可以正常工作了。

因此 JTree 有一些静态节点(如 header)和一些动态节点,其中静态节点仅使用值更新(这意味着始终显示整体轮廓)而动态节点可能作为一个请求的结果附加并为下一个请求的结果删除。

目前,当我意识到这个问题时,我只实现了静态节点:当我更改我的节点显示的值时,它也会将 lineStyle 属性 更改为有些奇怪,甚至无法选择来自.

这是 JTree 在更新节点之前和之后的外观图片:

这就是我更新节点时发生的情况:

正如您所看到的那样,从 "Inspection Lot Number" 节点开始的垂直线应该一直向下消失,而其他线则保持在应有的位置。

我使用此代码更新节点:

public void renameNode(DefaultMutableTreeNode node, String renamedNode) {
    node.setUserObject(renamedNode);
    model.nodeChanged(node);
}

这里的参数 "node" 是我重命名的节点,字符串是我设置的新值(至少这是我对这里发生的事情的理解),模型是使用我的 class 的构造函数:model = (DefaultTreeModel) tree.getModel();.

我不知道这对解决方案是否重要,但目前我还没有真正定义的 TreeModel,因为我使用根节点启动我的 JTree,然后动态附加所有节点。然而,在我看来,它似乎与 TreeCellRenderer 有一定关系。对于我目前使用的渲染器配置:

renderer.setSize(tree.getParent().getMaximumSize());

renderer.setLeafIcon(null);
renderer.setOpenIcon(null);
renderer.setClosedIcon(null);
renderer.setDisabledIcon(null);

我还尝试根据 Oracle tutorial on JTree.

使用 tree.putClientProperty() 强制 JTree 使用斜线(默认情况下它总是应该这样做)

在这一点上,我完全不知道可能是什么问题。对我来说唯一有意义的事情可能是 TreeCellRenderer,但我在这里也可能完全错了。非常感谢任何帮助。

经过一些故障排除后,我终于意识到,每次我填充 JTree 时,与可以看到的相反,模型没有重置为根节点的 0 个子节点,而是将更改的节点堆叠为新节点作为子节点根节点(所以我得到 7、14、21,... 子节点,每次填充我的 JTree 时都是 +7)。

原因是我不知道我必须在调用 ((DefaultMutableTreeNode) tree.getModel().getRoot()).removeAllChildren(); 之后调用 model.reload()(我需要这样做才能完全移除树,这样我只有我的数据在 JTree 中列出一次)。

现在 JTree 在重新设置之前已被完全清除,使用我的原始 post.

中提供的方法 renameNode() 添加节点非常有效

希望这对以后可能遇到类似问题的其他人有所帮助。