JTree: TreeCellRenderer не работает должным образом

Короче говоря, я хочу, чтобы дерево отображалось так, чтобы первый уровень был жирным.

public class TreeRenderer1 extends DefaultTreeCellRenderer {

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);

    DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;

    if (node.getLevel()==1) {
        setFont(getFont().deriveFont(Font.BOLD));
    }

    return this;
}
}

Это, однако, делает все узлы в моем дереве жирным шрифтом. Что случилось?

2 ответа

Решение

Сбросить состояние шрифта рендера, если уровень НЕ 1...

if (node.getLevel()==1) {
    setFont(getFont().deriveFont(Font.BOLD));
} else {
    setFont(getFont().deriveFont(Font.PLAIN));
}

Рендеринг является общим ресурсом, любые изменения, которые вы вносите в него, переносятся на следующий отображаемый элемент, поэтому вы всегда должны быть уверены, что в какой-то момент вы установили его в состояние "по умолчанию".

В вашем коде вы устанавливаете шрифт жирным шрифтом для уровня 1, но как насчет других уровней. Где еще условие? Можете ли вы попробовать это?

@Override
public Component getTreeCellRendererComponent(JTree tree, Object value,
        boolean sel, boolean exp, boolean leaf, int row, boolean hasFocus) {
    super.getTreeCellRendererComponent(tree, value, sel, exp, leaf, row, hasFocus);

    DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;

    if (node.getLevel()==1) {
        setFont(getFont().deriveFont(Font.BOLD));
    } else {
        setFont(getFont().deriveFont(Font.PLAIN));
    }

    return this;
}
}
Другие вопросы по тегам