首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeCellRenderer:根据用户对象的类型应用不同样式的节点文本

TreeCellRenderer:根据用户对象的类型应用不同样式的节点文本
EN

Stack Overflow用户
提问于 2011-11-03 00:58:53
回答 3查看 3.3K关注 0票数 0

我有一棵只有DefaultMutableTreeNodes的树。我想编写一个TreeCellRenderer,它依赖于包含的user对象的类型。我试着写一个简单的例子(这不起作用。这就是我最终来到这里的原因)。在根节点之外的第一级上,用户对象的类型是AANodeUserObjectLocalAANodeUserObject。这两个都应该用目录图标呈现,即使可能没有子目录。此渲染器的另一个功能是,当节点不是“当前”时(在我的示例中,它始终是true),它应该以红色和粗体呈现用户对象类型为AANodeUserObject的节点。下面是我的代码:

代码语言:javascript
复制
    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应该是红色的,其他都不应该。我做错了什么?有人能帮帮忙吗?谢谢!马蒂亚斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-09 20:55:33

我通过调用super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus)两次解决了这个问题:

  • 第一次作为getTreeCellRendererComponent()的第一行。如果不调用,将字体样式设置为粗体的getFont(setFont())将在方法的最后一行第二次返回NullPointerException.
  • The,以正确呈现节点。

可能还有另一种解决方案,但经过多次不同的尝试,这对我来说是有效的。

票数 0
EN

Stack Overflow用户

发布于 2011-11-03 01:08:05

代码语言:javascript
复制
Boolean isCurrent = false;
if (!isCurrent)

你想用这段代码做什么?

另外,您还需要为这个“if”实现"else“:

代码语言:javascript
复制
if (userObject instanceof TestTree.AANodeUserObject)
{
    //...
}

否则,所有的渲染器组件都将以红色字体打印。

票数 1
EN

Stack Overflow用户

发布于 2012-03-01 18:37:52

为什么返回"this"?

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7984293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档