- デフォルトのテーブルレンダラーを使用する方法:
JTableはデフォルトで
DefaultTableCellRenderer
を使用してセルを描画します。デフォルトのレンダラーは、奇数行と偶数行のセルの背景色を切り替える機能を持っています。
JTable table = new JTable(data, columnNames);
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!isSelected) {
if (row % 2 == 0) {
component.setBackground(Color.WHITE);
} else {
component.setBackground(Color.LIGHT_GRAY);
}
}
return component;
}
});
- カスタムレンダラーを使用する方法:
DefaultTableCellRenderer
をサブクラス化して、ゼブラストライプを実現するカスタムレンダラーを作成することもできます。
class ZebraStripeRenderer extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component component = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (!isSelected) {
if (row % 2 == 0) {
component.setBackground(Color.WHITE);
} else {
component.setBackground(Color.LIGHT_GRAY);
}
}
return component;
}
}
JTable table = new JTable(data, columnNames);
table.setDefaultRenderer(Object.class, new ZebraStripeRenderer());
- テーブルモデルをカスタマイズする方法:
AbstractTableModel
をサブクラス化して、getColumnClass
メソッドをオーバーライドし、奇数行と偶数行のセルの背景色を指定することもできます。
class MyTableModel extends AbstractTableModel {
private Object[][] data;
private String[] columnNames;
public MyTableModel(Object[][] data, String[] columnNames) {
this.data = data;
this.columnNames = columnNames;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int row, int column) {
return data[row][column];
}
@Override
public Class<?> getColumnClass(int column) {
return Object.class;
}
@Override
public void setValueAt(Object value, int row, int column) {
data[row][column] = value;
fireTableCellUpdated(row, column);
}
@Override
public boolean isCellEditable(int row, int column) {
return true;
}
@Override
public void addTableModelListener(TableModelListener l) {
super.addTableModelListener(l);
}
}
JTable table = new JTable(new MyTableModel(data, columnNames)) {
@Override
public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
Component component = super.prepareRenderer(renderer, row, column);
if (!isRowSelected(row)) {
if (row % 2 == 0) {
component.setBackground(Color.WHITE);
} else {
component.setBackground(Color.LIGHT_GRAY);
}
}
return component;
}
};
これらの方法を使用すると、Java SwingのJTableでゼブラストライプを実現できます。