Пользовательский TableCellRenderer/TreeTableCellRenderer не отображает ячейки таблицы

Я сделал это CustomCellRenderer класс предназначен для использования в JXTreeTable а также JXTable объекты, так как у меня их много в моем проекте. Так что этот класс реализует TreeCellRenderer а также TableCellRenderer интерфейсы:

public class CustomCellRenderer extends JLabel 
                                implements TreeCellRenderer, TableCellRenderer {

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        setBackground(selected ? new Color(83,142,213) : Color.white);
        setForeground(selected ? Color.white : Color.black);
        //here is the icon setting code but it's irrelevant to my problem
        setText(value != null ? value.toString() : "<null>");
        return this;
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setBackground(isSelected ? new Color(83,142,213) : Color.white);
        setForeground(isSelected ? Color.white : Color.black);
        setText(value != null ? value.toString() : "<null>");
        return this;
    }
}

И вот код, где я установил рендерер:

jXTreeTableConsumos.setDefaultRenderer(Object.class, new CustomCellRenderer());
jXTreeTableConsumos.setTreeCellRenderer(new CustomCellRenderer());

Я ожидаю, что фон и передний план станут синими и белыми соответственно, когда выбрана строка. Однако это происходит только в ячейке таблицы дерева (первый столбец), когда изменяется только передний план, а фон остается белым в других ячейках в той же выбранной строке:

Может ли кто-нибудь сказать мне, почему клетки (которые не являются клетками дерева) не меняют свой цвет фона?

1 ответ

Решение

Спасибо всем за ваши комментарии и предложения. Я нашел решение в JComponent#setBackground(Color bg) документация:

Устанавливает цвет фона этого компонента. Цвет фона используется только в том случае, если компонент непрозрачен, и только для подклассов реализаций JComponent или ComponentUI. Прямые подклассы JComponent должны переопределить paintComponent, чтобы соблюдать это свойство.

Так как мой CustomCellRenderer простирается от JLabel единственное, что мне нужно сделать, это убедиться, что он непрозрачный и его фоновый цвет будет закрашен:

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    setOpaque(true);//adding this line I solved my problem
    setBackground(isSelected ? new Color(83,142,213) : Color.white);
    setForeground(isSelected ? Color.white : Color.black);
    setText(value != null ? value.toString() : "<null>");
    return this;
}

введите описание изображения здесь

Другие вопросы по тегам