table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
Component comp = super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
if(!isSelected) { //Important check, see comment below!
boolean levelBreak = row == 0;
if (!levelBreak) {
Object prior = table.getValueAt(row - 1, 0);
Object current = table.getValueAt(row, 0);
levelBreak = !prior.equals(current);
}
comp.setBackground(levelBreak ? Color.BLUE : Color.WHITE);
}
return comp;
}
});
As the renderer / renderer component is reused for all table cells, the background must be set for all cases.
In general the JTable’s TabelModel is better for getting a value instead of JTable’s getValueAt, but evidently you neither sort the rows nor rearrange the columns.
For a possible older installed renderer
class MyCellRenderer extends DefaultTableCellRenderer {
private final TableCellRenderer old;
MyCellRenderer(TableCellRenderer old) {
this.old = old;
}
@Override
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column) {
boolean levelBreak = row == 0;
if (!levelBreak) {
Object prior = table.getValueAt(row - 1, 0);
Object current = table.getValueAt(row, 0);
levelBreak = !prior.equals(current);
}
Component comp;
if (old != null) {
comp = old.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
} else {
comp = super.getTableCellRendererComponent(table,
value, isSelected, hasFocus, row, column);
}
comp.setBackground(levelBreak ? Color.BLUE : Color.WHITE);
return comp;
}
}
table.setDefaultRenderer(Object.class, new MyCellRenderer(table.getDefaultRenderer(Object.class));
10
solved Set color of JTable row at runtime