Override prepareRenderer()
Phương thức prepareRenderer(TableCellRenderer, int row, int column) của JTable được gọi trước khi render mỗi cell. Override để set background tùy theo row index.
Ví dụ
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
public class AlternateRowColorTableDemo extends JFrame {
public AlternateRowColorTableDemo() {
setTitle("Alternate Row Color JTable");
JTable table = new JTable(
new Object[][] {
{"115", "Ramesh"},
{"120", "Adithya"},
{"125", "Jai"},
{"130", "Chaitanya"},
{"135", "Raja"}
},
new String[] {"Employee Id", "Employee Name"}
) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component comp = super.prepareRenderer(renderer, row, column);
// Không đổi màu nếu cell đang được chọn
if (!comp.getBackground().equals(getSelectionBackground())) {
Color alternateColor = new Color(200, 201, 210); // xám nhạt
Color whiteColor = Color.WHITE;
comp.setBackground(row % 2 == 0 ? alternateColor : whiteColor);
}
return comp;
}
};
add(new JScrollPane(table));
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(AlternateRowColorTableDemo::new);
}
}
Kết quả

Mẹo: Từ Java 6, có thể dùng table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { ... }) nhưng override prepareRenderer trên JTable subclass đơn giản hơn.