Это не ответ (*), он слишком длинный для комментария к обоим ответам: оба верны в том смысле, что блок else важен для обеспечения того, чтобы цвет по умолчанию использовался для ячейки, которая не должна быть подсвечен. Они немного ошибаются в том, как этого достичь, и оба имеют одинаковый общий эффект: они пропускают любую особую окраску, например, f.i. из-за выделения, фокусировки, редактируемые, dnd ...
Они достигают этого "промаха" разными способами с немного разными эффектами
setBackground(Color.WHITE);
установить фиксированный цвет, который может быть или не быть стандартным фоном таблицы по умолчанию
setBackground(null);
Устанавливает отсутствие цвета, что приводит к отображению "нормального" цвета фона - из-за внутренней хитрости реализации isOpaque DefaultTableCellRenderer: -)
Основной причиной проблемы (также известной как печально известная цветная память TM) является необычно плохая реализация рендерера по умолчанию, из-за которого он практически не расширяется:
/**
* Overrides <code>JComponent.setBackground</code> to assign
* the unselected-background color to the specified color.
*
* JW: The side-effect is documented and looks innocent enough :-)
*/
public void setBackground(Color c) {
super.setBackground(c);
unselectedBackground = c;
}
// using that side-effect when configuring the colors in getTableCellRendererComp
// is what leads to the horrendeous problems
// in the following lines of the else (not selected, that is normal background color)
Color background = unselectedBackground != null
? unselectedBackground : table.getBackground();
super.setBackground(background);
Видя это, выход (кроме использования SwingX и его гибкого, чистого, мощного, непротиворечивого .. :-) Поддержка рендерера - @ Hovercraft, но обратная: сначала сделайте пользовательскую раскраску (или ноль, если никто не намеревался), затем вызовите супер:
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (myHighlightCondition) {
setBackground(Color.RED);
} else {
setBackground(null);
}
super.getTableCellRendererComponent(table, value, isSelected, hasFocus,
row, column);
return this;
}
(*) В конце концов, этот комментарий привел к ответу, забыл, что это можно исправить на уровне пользовательского рендерера: -)
Кстати: перехват «первого» вызова для средства визуализации очень хрупок, нет гарантии, по какой ячейке это произойдет, вполне может быть последний ряд последнего столбца.