• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:CellEditorのBorderを変更
#navi(../)
*CellEditorのBorderを変更 [#ia1fb931]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-08-22~
更新日:&lastmod;
---
category: swing
folder: CellEditorBorder
title: CellEditorのBorderを変更
tags: [JTable, TableCellEditor, Border]
author: aterai
pubdate: 2005-08-22T08:08:31+09:00
description: Borderを変更したJTextFieldを、JTableのデフォルトセルエディタとして設定します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTIiyFXk2I/AAAAAAAAAS8/Dgu1EqDMma4/s800/CellEditorBorder.png
---
* 概要 [#summary]
`Border`を変更した`JTextField`を、`JTable`のデフォルトセルエディタとして設定します。

#contents
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTIiyFXk2I/AAAAAAAAAS8/Dgu1EqDMma4/s800/CellEditorBorder.png)

**概要 [#j484283d]
JTableのCellEditorにBorderを設定します。
* サンプルコード [#sourcecode]
#code(link){{
JTextField field = new JTextField();
field.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
table.setDefaultEditor(Object.class, new DefaultCellEditor(field));
}}

#screenshot
* 解説 [#explanation]
上記のサンプルでは、`LineBorder`を設定した`JTextField`を使用する`DefaultCellEditor`を作成し、`JTable#setDefaultEditor(...)`メソッドで`Object`クラスのデフォルトセルエディタとして設定しています。

**サンプルコード [#t48217b5]
 JTextField tf1 = new JTextField();
 tf1.setBorder(BorderFactory.createLineBorder(Color.red, 2));
 table.setDefaultEditor(Object.class, new DefaultCellEditor(tf1));
 
 JTextField tf2 = new JTextField();
 tf2.setBorder(BorderFactory.createLineBorder(Color.green, 2));
 tf2.setHorizontalAlignment(JTextField.RIGHT);
 table.setDefaultEditor(Integer.class, new DefaultCellEditor(tf2));
- `JTable#setDefaultEditor(...)`を使用せずに`JTable#prepareEditor(...)`をオーバーライドしてセルエディタとして使用するコンポーネントの背景色や`Border`を変更する方法もある

-&jnlp;
-&jar;
-&zip;
#code{{
JTable table = new JTable(model) {
  @Override public Component prepareEditor(
        TableCellEditor editor, int row, int column) {
    Component c = super.prepareEditor(editor, row, column);
    if (c instanceof JCheckBox) {
      JCheckBox b = (JCheckBox) c;
      b.setBorderPainted(true);
      b.setBackground(getSelectionBackground());
    } else if (c instanceof JComponent
            && convertColumnIndexToModel(column) == 1) {
      ((JComponent) c).setBorder(
        BorderFactory.createLineBorder(Color.GREEN, 2));
    }
    return c;
  }
};
}}

**解説 [#q9485122]
サンプルでは、DefaultTableModel#getColumnClassメソッドをオーバーライドして0列目はInteger.classを返すようにしています。Integer.classの場合はBorderが緑、それ以外の場合(Object.class)は赤で描画するようなデフォルトエディタをそれぞれ指定しています。
* 参考リンク [#reference]
- [[JTableが使用するBooleanCellEditorの背景色を変更>Swing/BooleanCellEditor]]

以下のようにJTable#getColumnClassをオーバーライドしても同様です。
 table = new JTable(sorter) {
   public Class getColumnClass(int column) {
     if(column==0) {
       return Integer.class;
     }
     return Object.class;
   }
 };

デフォルトレンダラーの設定にも、getColumnClassが返すクラスが影響するので、それぞれレンダラーを設定する必要があります。
 TestRenderer tr = new TestRenderer();
 table.setDefaultRenderer(Object.class,  tr);
 table.setDefaultRenderer(Integer.class, tr);

//**参考リンク
**コメント [#q0b2f0c8]
- DefaultTableModel#getColumnClassとJTable#getColumnClassで動作が異なると勘違い((コンパイルし忘れていたみたいです))して解説していたのを修正しました。 -- [[terai]] &new{2005-08-22 (月) 16:53:30};
- 0列目を実際に編集してソートするとClassCastExceptionが発生するバグがあります。 -- [[terai]] &new{2005-08-22 (月) 17:07:47};

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