TITLE:CellEditorのBorderを変更

Posted by aterai at 2005-08-22

CellEditorのBorderを変更

JTableのCellEditorにBorderを設定します。

  • &jnlp;
  • &jar;
  • &zip;
CellEditorBorder.png

サンプルコード

JTextField tf1 = new JTextField();
tf1.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
table.setDefaultEditor(Object.class, new DefaultCellEditor(tf1));

JTextField tf2 = new JTextField();
tf2.setHorizontalAlignment(JTextField.RIGHT);
tf2.setBorder(BorderFactory.createLineBorder(Color.GREEN, 2));
table.setDefaultEditor(Integer.class, new DefaultCellEditor(tf2) {
  public boolean stopCellEditing() {
    Object o = getCellEditorValue();
    return (o==null)?false:super.stopCellEditing();
  }
  public Object getCellEditorValue() {
    Object o = super.getCellEditorValue();
    Integer iv;
    try{
      iv = Integer.valueOf(o.toString());
    }catch(NumberFormatException nfe) {
      iv = null;
    }
    return iv;
  }
});

解説

サンプルでは、DefaultTableModel#getColumnClassメソッドをオーバーライドして0列目はInteger.classを返すようにしています。Integer.classの場合はBorderが緑、それ以外の場合(Object.class)は赤で描画するようなデフォルトエディタをそれぞれ指定しています。

以下のように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);

コメント

  • DefaultTableModel#getColumnClassとJTable#getColumnClassで動作が異なると勘違い*1して解説していたのを修正しました。 -- aterai
  • 0列目を実際に編集してソートするとClassCastExceptionが発生するバグがあります。 -- aterai
    • 修正するのを綺麗サッパリ忘れていました…。修正しました。 -- aterai