【问题标题】:JTree changes lineStyle when changing node's name更改节点名称时 JTree 更改 lineStyle
【发布时间】:2019-12-03 09:08:40
【问题描述】:

TLDR:

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


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

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

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

这是 JTree 在更新节点之前和之后的样子:

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

正如你所看到的,从“检验批号”节点开始的垂直线应该一直向下,而其他线则保持在应该的位置。

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

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

这里的参数“node”是我重命名的节点,字符串是我设置的新值(至少这是我对这里发生的事情的理解),并且在我的类的构造函数中使用这一行访问模型: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 但我在这里也可能完全错了。任何帮助将不胜感激。

【问题讨论】:

    标签: java swing jtree look-and-feel defaultmutabletreenode


    【解决方案1】:

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

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

    现在 JTree 在重新设置之前已被完全清除,使用我原始帖子中提供的方法 renameNode() 添加节点可以完美地工作。

    希望这将帮助其他可能在未来面临类似问题的人。

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 2014-07-31
      • 2013-04-07
      • 2011-01-13
      • 2012-06-20
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多