TreeCellRenderer: применение другого стиля текста узла, который зависит от типа объекта пользователя - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть дерево только с 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));
    }

Результат можно увидеть на прикрепленном рисунке The resulting tree.

Что меня раздражает, так это то, что каталог-пиктограмма работает нормально, а стиль текста - нет: только второй узел (значение Hashmap false) AANodeUserObject должен быть красным и больше ничего. Что я делаю неправильно? Может кто-нибудь помочь? Спасибо! Mathias

Ответы [ 3 ]

1 голос
/ 02 ноября 2011
Boolean isCurrent = false;
if (!isCurrent)

Что вы хотите сделать с помощью этого кода?

Также вам нужно реализовать "else" для этого "if":

if (userObject instanceof TestTree.AANodeUserObject)
{
    //...
}

В противном случае все компоненты рендерера будут напечатаны красным шрифтом.

0 голосов
/ 01 марта 2012

Почему вы возвращаете "this"?

Вам следует создать переменную, в которой вы временно сохраните возвращенное значение метода из суперкласса, который вы вызываете в начале. И тогда вы должны изменить эту ссылку и вернуть ее в конце. Тогда бы у вас не было проблем!

0 голосов
/ 09 ноября 2011

Я решил проблему, дважды позвонив по номеру super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus):

  • Первый раз как первая строка getTreeCellRendererComponent(). Без вызова getFont(setFont()) для установки стиля шрифта жирным шрифтом вернется NullPointerException.

  • Второй раз в последней строке метода для правильной визуализации узлов.

Возможно, существует другое решение, но после многих попыток это сработало для меня.

...