Java 是什么导致任意JTree节点错误地显示其名称?如何阻止这种情况发生?

Java 是什么导致任意JTree节点错误地显示其名称?如何阻止这种情况发生?,java,jtree,Java,Jtree,我已经从XML数据构建了一个相当大的JTree,实际上有数千个节点,其中大多数节点显示正确。但是,由于某些原因,某些节点的用户数据字符串未完全显示,而是在名称末尾附加…后被截断或完全截断 受影响的节点看起来是随机的,并且每次从XML刷新或重新创建树时都是不同的 我已经排除的事情: 空间不足,无法显示全名 JTree在一个有大量水平空间的JScrollPane中,JScrollPane甚至没有显示水平滚动条来表示空间不足 即使是最短的名字也会受到影响 并非所有缩短的节点名称的截止点都一致 从XM

我已经从XML数据构建了一个相当大的JTree,实际上有数千个节点,其中大多数节点显示正确。但是,由于某些原因,某些节点的
用户数据
字符串未完全显示,而是在名称末尾附加
后被截断或完全截断

受影响的节点看起来是随机的,并且每次从XML刷新或重新创建树时都是不同的

我已经排除的事情: 空间不足,无法显示全名

  • JTree在一个有大量水平空间的JScrollPane中,JScrollPane甚至没有显示水平滚动条来表示空间不足

  • 即使是最短的名字也会受到影响

  • 并非所有缩短的节点名称的截止点都一致

  • 从XML加载的名称不完整

  • 如果受影响的节点不是叶,然后展开或折叠,则在重新呈现时会正确显示全名,在此过程中根本不会参考XML
  • 编辑: 根据要求,对JTree背后的代码进行一些解释:

    树模型的创建和树的填充:

    public XMLDialogTree(Document doc)
        {
            DefaultTreeModel treeModel = new DefaultTreeModel(buildTreeNode(doc.getElementsByTagName("Dialogs").item(0)));
            setModel(treeModel);
        }
    
    // A recursive function to build the tree
    private DefaultMutableTreeNode buildTreeNode(Node xmlNode)
        {
            // Make sure the node's name is a description of what it is, as opposed to a generic XML tag
            XMLDialogTreeNode = new XMLDialogTreeNode(xmlNode.getAttributes().getNamedItem("name").getNodeValue());
            treeNode.controlName = xmlNode.getNodeName();
    
            // Add children to the treeNode based on the xmlNode's children
            NodeList nodeList = xmlNode.getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++)
                {
                    Node tempNode = nodeList.item(i);
                    if (tempNode.getNodeType() == Node.ELEMENT_NODE)
                        {
                            // loop again if has child nodes
                            treeNode.add(buildTreeNode(tempNode));
                        }
                }
            return treeNode;
        }
    

    所以答案很简单;此代码:

    // Try and get a pre-loaded icon
    Icon controlIcon = icons.get(controlName);
    // It wasn't there, try loading it
    if (controlIcon == null)
        loadIcon(controlName);
    
    // Try and get a pre-loaded icon
    Icon controlIcon = icons.get(controlName);
    // It wasn't there, try loading it
    if (controlIcon == null)
    {
        loadIcon(controlName);
        controlIcon = icons.get(controlName);
    }
    
    以下代码:

    // Try and get a pre-loaded icon
    Icon controlIcon = icons.get(controlName);
    // It wasn't there, try loading it
    if (controlIcon == null)
        loadIcon(controlName);
    
    // Try and get a pre-loaded icon
    Icon controlIcon = icons.get(controlName);
    // It wasn't there, try loading it
    if (controlIcon == null)
    {
        loadIcon(controlName);
        controlIcon = icons.get(controlName);
    }
    
    请注意,在检查Icon变量是否为null,然后确保已将图标加载到程序中后,我现在实际上确保Icon变量已更新,因此不再为null


    树中受影响的节点并不像我之前所想的那样随机或波动。它始终是使用每个图标绘制的第一个节点(根据我打开树的顺序而有所不同)。我加载每个图标一次,然后缓存它(树很大,多次重新加载同一图标对性能有很大影响)。从本质上讲,节点是用文本创建的,然后在显示后设置了一个图标,它将文本分流并导致端点被切断。如上所述,解决方案是在首次加载图标后不要忘记设置图标。更好的解决方案是对我的
    图标.get()
    进行包装,以确保返回图标并封装缓存优化。

    您需要编辑显示相关代码片段的问题,在其中实例化对象、填充模型、任何侦听器是否始终是受影响的相同节点?如果是这样,也许您可以在(stackoverflow.com/help/MCVE)中复制它。它可能是名称和嵌套级别的组合。可能是单元渲染器,可能是调用
    nodeChanged
    的方式,如果调用
    reload
    ,或者,如果看不到至少一些代码就很难分辨,或者最好是最小的程序来重现嵌套problem@S.L.Barth不所以问题一定是我自己的手机渲染器,我会调查的,我已经发布了code@S.L.Barth我发现了问题。在每种情况下,受影响的节点都是树中第一个显示特定图标的节点。当图标正确显示(不确定如何显示)时,我的代码在呈现带有特定图标的第二个节点之前没有设置图标,这在某种程度上打乱了名称的呈现,同时仍然显示图标(未加载…),我对此进行了一点升级投票,以防您最终决定删除该问题。如果你决定删除它,@-请评论我,我可以收回我的投票。就个人而言,我认为投票是解决你自己问题的当之无愧的。谢谢,在你说了这些之后,我决定放弃投票,因为上面描述的行为很奇怪,其他人可能也很难调试。