我有一棵只有DefaultMutableTreeNodes的树。我想编写一个TreeCellRenderer,它依赖于包含的user对象的类型。我试着写一个简单的例子(这不起作用。这就是我最终来到这里的原因)。在根节点之外的第一级上,用户对象的类型是AANodeUserObject或LocalAANodeUserObject。这两个都应该用目录图标呈现,即使可能没有子目录。此渲染器的另一个功能是,当节点不是“当前”时(在我的示例中,它始终是true),它应该以红色和粗体呈现用户对象类型为AANodeUserObject的节点。下面是我的代码:
public Component getTreeCellRendererComponent(final JTree tree, final Object value, final boolean sel, final boolean expanded, final boolean leaf, final int row, final boolean hasFocus)
{
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
// Precondition für Default TreeNode
Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
if (userObject instanceof TestTree.AANodeUserObject || userObject instanceof TestTree.LocalAANodeUserObject)
{
if (expanded)
{
setIcon(openIcon);
}
else
{
setIcon(closedIcon);
}
}
if (userObject instanceof TestTree.AANodeUserObject)
{
TestTree.AANodeUserObject aAnode = (TestTree.AANodeUserObject) userObject;
if (!mVersionInfo.get(aAnode))
{
renderOutdatedAaNode();
} else {
renderDefault();
}
} else {
renderDefault();
}
return this;
}
private void renderDefault()
{
setTextNonSelectionColor(cColorBlack);
setTextSelectionColor(cColorBlack);
setFont(getFont().deriveFont(Font.PLAIN));
}
private void renderOutdatedAaNode()
{
setTextNonSelectionColor(cColorRed);
setTextSelectionColor(cColorRed);
setFont(getFont().deriveFont(Font.BOLD));
}你可以在附件的图片上看到结果。

。
令我恼火的是,目录图标可以正常工作,而文本样式却不行:只有第二个节点(Hashmap值为false) AANodeUserObject应该是红色的,其他都不应该。我做错了什么?有人能帮帮忙吗?谢谢!马蒂亚斯
发布于 2011-11-09 20:55:33
我通过调用super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus)两次解决了这个问题:
getTreeCellRendererComponent()的第一行。如果不调用,将字体样式设置为粗体的getFont(setFont())将在方法的最后一行第二次返回NullPointerException.可能还有另一种解决方案,但经过多次不同的尝试,这对我来说是有效的。
发布于 2011-11-03 01:08:05
Boolean isCurrent = false;
if (!isCurrent)你想用这段代码做什么?
另外,您还需要为这个“if”实现"else“:
if (userObject instanceof TestTree.AANodeUserObject)
{
//...
}否则,所有的渲染器组件都将以红色字体打印。
发布于 2012-03-01 18:37:52
为什么返回"this"?
您应该创建一个变量,在其中临时存储您在开始时调用的超类的方法返回值。然后你必须修改这个引用,并在最后返回它。那你就不会有任何问题了!
https://stackoverflow.com/questions/7984293
复制相似问题