У меня есть дерево только с 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));
}
Результат можно увидеть на прикрепленном рисунке .
Что меня раздражает, так это то, что каталог-пиктограмма работает нормально, а стиль текста - нет: только второй узел (значение Hashmap false
) AANodeUserObject должен быть красным и больше ничего.
Что я делаю неправильно? Может кто-нибудь помочь?
Спасибо!
Mathias