Пользовательский 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;
}