Обычно я решал эту проблему, реализуя реализацию TableCellRenderer в стиле декоратора, которая оборачивает другой TableCellRenderer. Таким образом, вы можете сохранить специфичные для типа средства визуализации для каждого столбца, но обернуть каждый из них в средство визуализации декоратора, отвечающее за выделение строк.
Вот пример, который я написал, который использует этот подход, чтобы установить фон каждой альтернативной строки светло-серым.
public class AlternateRowRenderer implements TableCellRenderer {
private final TableCellRenderer wrappedRenderer;
public AlternateRowRenderer(TableCellRenderer wrappedRenderer, Color highlightColour) {
this.wrappedRenderer = wrappedRenderer;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component ret = wrappedRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
ret.setBackground(getTableBackgroundColour(table, value, isSelected, hasFocus, row, column));
return ret;
}
@SuppressWarnings({"UnusedDeclaration"})
public static Color getTableBackgroundColour(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Color ret;
if (row % 2 != 0) {
ret = isSelected ? ColourUtil.mergeColours(LIGHT_GREY, table.getSelectionBackground(), 0.75) : LIGHT_GREY;
} else {
ret = isSelected ? table.getSelectionBackground() : table.getBackground();
}
return ret;
}
}