Java 是什么导致任意JTree节点错误地显示其名称?如何阻止这种情况发生?
我已经从XML数据构建了一个相当大的JTree,实际上有数千个节点,其中大多数节点显示正确。但是,由于某些原因,某些节点的Java 是什么导致任意JTree节点错误地显示其名称?如何阻止这种情况发生?,java,jtree,Java,Jtree,我已经从XML数据构建了一个相当大的JTree,实际上有数千个节点,其中大多数节点显示正确。但是,由于某些原因,某些节点的用户数据字符串未完全显示,而是在名称末尾附加…后被截断或完全截断 受影响的节点看起来是随机的,并且每次从XML刷新或重新创建树时都是不同的 我已经排除的事情: 空间不足,无法显示全名 JTree在一个有大量水平空间的JScrollPane中,JScrollPane甚至没有显示水平滚动条来表示空间不足 即使是最短的名字也会受到影响 并非所有缩短的节点名称的截止点都一致 从XM
用户数据
字符串未完全显示,而是在名称末尾附加…
后被截断或完全截断
受影响的节点看起来是随机的,并且每次从XML刷新或重新创建树时都是不同的
我已经排除的事情:
空间不足,无法显示全名
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我发现了问题。在每种情况下,受影响的节点都是树中第一个显示特定图标的节点。当图标正确显示(不确定如何显示)时,我的代码在呈现带有特定图标的第二个节点之前没有设置图标,这在某种程度上打乱了名称的呈现,同时仍然显示图标(未加载…),我对此进行了一点升级投票,以防您最终决定删除该问题。如果你决定删除它,@-请评论我,我可以收回我的投票。就个人而言,我认为投票是解决你自己问题的当之无愧的。谢谢,在你说了这些之后,我决定放弃投票,因为上面描述的行为很奇怪,其他人可能也很难调试。