TreeCellRenderer:应用节点文本的不同样式,这取决于用户对象的类型

时间:2011-11-02 16:58:53

标签: java swing render jtree

我的树只有DefaultMutableTreeNodes。我想写一个TreeCellRenderer,它取决于包含的用户对象的类型。我试着写一个简单的例子(这不起作用。这就是我在这里结束的原因)。在根节点之外的第一级,用户对象的类型为AANodeUserObjectLocalAANodeUserObject。即使可能没有子项,也应使用目录图标呈现两者。此渲染器的另一个特性是,它应该呈现红色的用户对象类型为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));
    }

您可以在附加图片The resulting tree上看到结果。

令我恼火的是,directory-icon-thing工作正常,文本样式没有:只有第二个节点(Hashmap值为false)AANodeUserObject应该是红色的,没有别的。 我究竟做错了什么?有人可以帮忙吗? 谢谢! 的Mathias

3 个答案:

答案 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”?

您应该创建一个变量,在该变量中,您可以从一开始调用的超类中临时存储方法的返回值。然后你必须修改这个引用并在最后返回它。那你就不会有任何问题!