Java JTree在更改节点时更改线型';姓名

Java JTree在更改节点时更改线型';姓名,java,swing,jtree,look-and-feel,defaultmutabletreenode,Java,Swing,Jtree,Look And Feel,Defaultmutabletreenode,TLDR: 更新JTree的节点会更改线型(下图),我不知道为什么会发生这种情况,也不知道如何防止这种情况发生,因为我的代码不会在发生这些更改时更新CellRenderer的任何属性 我有一个Java的客户机-服务器应用程序,我向服务器发送一个数据请求,并使用服务器根据客户机请求从数据库请求一些数据,然后将结果发送回客户机。结果将显示在一个JTree中,这个JTree已经可以正常工作了 因此,JTree有一些静态节点(如标头)和一些动态节点,其中静态节点仅使用值更新(这意味着始终显示整体轮廓)

TLDR:

更新JTree的节点会更改线型(下图),我不知道为什么会发生这种情况,也不知道如何防止这种情况发生,因为我的代码不会在发生这些更改时更新CellRenderer的任何属性


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

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

目前,当我意识到这个问题时,我只实现了静态节点:当我更改节点显示的值时,它也会将lineStyle属性更改为一些奇怪的属性,甚至不可能从中进行选择

以下是JTree在更新节点前后的外观图片:

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

正如您可以看到的,从“检验批号”节点一直向下的垂直线消失了,而其他线停留在应该的位置

我使用以下代码更新节点:

public void renameNode(DefaultMutableTreeNode node, String renamedNode) {
    node.setUserObject(renamedNode);
    model.nodeChanged(node);
}
这里,参数“node”是我重命名的节点,字符串是我将其设置为的新值(至少这是我对这里发生的事情的理解),并且使用类的构造函数中的以下行访问模型:
model=(DefaultTreeModel)tree.getModel()

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

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

renderer.setLeafIcon(null);
renderer.setOpenIcon(null);
renderer.setClosedIcon(null);
renderer.setDisabledIcon(null);
我还尝试通过使用
tree.putClientProperty()
来强制JTree使用有角度的线(默认情况下总是这样)


在这一点上,我完全不知道会是什么问题。对我来说,唯一有意义的事情是发生这种情况的原因可能是TreeCellRenderer,但我也可能完全错了。非常感谢您的帮助。

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

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

现在,JTree在再次设置之前已被完全清除,使用我的原始帖子中提供的方法
renameNode()
添加节点非常有效

希望这将有助于将来可能面临类似问题的其他人