TITLE:TableCellRendererでセルの背景色を変更

TableCellRendererでセルの背景色を変更

編集者:Terai Atsuhiro
作成日:2004-01-19
更新日:2022-02-01 (火) 22:40:22

概要

TableCellRendererを継承するレンダラーを作ってテーブルのセルを修飾します。

#screenshot

サンプルコード

public class TestRenderer extends DefaultTableCellRenderer {
  private static final Color ec = new Color(240, 240, 255);
  public TestRenderer() {
    super();
    setOpaque(true);
    setBorder(BorderFactory.createEmptyBorder(0,5,0,5));
  }
  public Component getTableCellRendererComponent(
        JTable table, Object value,
        boolean isSelected, boolean hasFocus,
        int row, int column) {
    super.getTableCellRendererComponent(table, value, 
        isSelected, hasFocus, row, column);
    if(isSelected) {
      setForeground(table.getSelectionForeground());
      setBackground(table.getSelectionBackground());
    }else{
      setForeground(table.getForeground());
      setBackground((row%2==0)?ec:table.getBackground());
    }
    setHorizontalAlignment((value instanceof Number)?RIGHT:LEFT);
    return this;
  }
}
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、第0列のカラムのセルを右寄せにし、奇数偶数で行の背景色を変更してテーブルをストライプ模様にするレンダラーを作成し、これをObjectを継承するクラスのデフォルトレンダラーとして設定しています。

table.setDefaultRenderer(Object.class, new TestRenderer());

TableCellRendererがあるセルが描画するとき、getTableCellRendererComponentメソッドが呼び出されます。引数から得られる、選択されているか何行何列目かなどの情報を使って、コンポーネント(ここではJLabel)を修飾し、そのコンポーネントを戻します。これが上記のセルの描画に利用されます*1

セルレンダラーを作成する代わりに、以下のようにJTable#prepareRendererメソッドをオーバーライドする方法もあります。

JTable table = new JTable(sorter) {
  public Component prepareRenderer(TableCellRenderer renderer,
                                   int row, int column) {
    Component c = super.prepareRenderer(renderer, row, column);
    if(row%2==0 && !isRowSelected(row)) {
      c.setForeground(getForeground());
      c.setBackground(evenColor);
    }
    return c;
  }
};

参考リンク

コメント