Java SwingのJTableでゼブラストライプを実現する方法


  1. デフォルトのテーブルレンダラーを使用する方法: 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;
    }
});
  1. カスタムレンダラーを使用する方法: 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());
  1. テーブルモデルをカスタマイズする方法: 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でゼブラストライプを実現できます。