• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:TableCellRendererでセルの背景色を変更
#navi(../)
*TableCellRendererでセルの背景色を変更 [#r8e14fa9]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2004-01-19~
更新日:&lastmod;

#contents

**概要 [#tcf81150]
TableCellRendererを継承するレンダラーを作ってテーブルのセルを修飾します。

#screenshot

**サンプルコード [#p4a666c9]
 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;

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

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

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

セルレンダラーを作成する代わりに、以下のように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(SystemColor.inactiveCaptionText);
       c.setBackground(evenColor);
     }
     return c;
   }
 };

**参考リンク [#sdd74788]
-[[Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting]]
-[[SwingのJTableコンポーネントでセルを描く>http://www-06.ibm.com/jp/developerworks/java/010518/j_j-jtable.shtml]]

**コメント [#sfc984fe]
#comment