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

TableCellRendererでセルの背景色を変更

編集者:Terai Atsuhiro
作成日:2004-01-19
更新日:2024-10-21 (月) 00:28:46

概要

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メソッドが呼び出されます。レンダラーは、引数などから得られる情報(選択されているか、何行何列目かなど)を使って、コンポーネントを修飾してからreturnします。

サンプルのTestRendererでは、JLabelを継承するDefaultTableCellRendererを継承しているので、自分自身(this)をsetForeground、setHorizontalAlignmentなどのメソッドで修飾し戻り値としています。このようにコンポーネントを使い回しているため、セルの数が膨大になっても、オブジェクトを大量に生成しなくて済むようになっています。

また、返されたコンポーネントは、セルの描画のみに利用されて、コンポーネントとしては機能しません。

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

JTable table = new JTable(model) {
  public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
    Component c = super.prepareRenderer(tcr, row, column);
    if(isRowSelected(row)) {
      c.setForeground(getSelectionForeground());
      c.setBackground(getSelectionBackground());
    }else{
      c.setForeground(getForeground());
      c.setBackground((row%2==0)?evenColor:getBackground());
    }
    return c;
  }
};

参考リンク

コメント

  • JTable#prepareRendererメソッドを使用する場合のサンプルを修正。 -- terai