我的树只有DefaultMutableTreeNodes。我想写一个TreeCellRenderer,它取决于包含的用户对象的类型。我试着写一个简单的例子(这不起作用。这就是我在这里结束的原因)。在根节点之外的第一级,用户对象的类型为AANodeUserObject
或LocalAANodeUserObject
。即使可能没有子项,也应使用目录图标呈现两者。此渲染器的另一个特性是,它应该呈现红色的用户对象类型为AANodeUserObject
的节点,而当它们不是“当前”时呈现粗体(在我的示例中,这始终是true
)。这是我的代码:
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));
}
您可以在附加图片上看到结果。
令我恼火的是,directory-icon-thing工作正常,文本样式没有:只有第二个节点(Hashmap值为false
)AANodeUserObject应该是红色的,没有别的。
我究竟做错了什么?有人可以帮忙吗?
谢谢!
的Mathias
答案 0 :(得分:1)
Boolean isCurrent = false;
if (!isCurrent)
这段代码你想做什么?
此外,您还需要为此“if”实现“else”:
if (userObject instanceof TestTree.AANodeUserObject)
{
//...
}
否则,所有渲染器组件都将以红色字体打印。
答案 1 :(得分:0)
我通过两次调用super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus)
来解决问题:
第一次作为getTreeCellRendererComponent()
的第一行。如果没有通话,getFont(setFont())
将字体样式设置为粗体将返回NullPointerException
。
第二次在方法的最后一行正确呈现节点。
可能有另一种解决方案,但经过多次不同尝试后,这对我有用。
答案 2 :(得分:0)
为什么要返回“this
”?
您应该创建一个变量,在该变量中,您可以从一开始调用的超类中临时存储方法的返回值。然后你必须修改这个引用并在最后返回它。那你就不会有任何问题!