JTable でのデータの表示方法を決める セルレンダラー

前の記事「JTable でデータとビューをつなぐテーブルモデル」では、 独自のテーブルモデルクラスを実装することで、編集不可の状態で次の画面ができあがりました。

ここではまず、次のようにします。

3列目のデータの真偽値 (true/false) が "true" とか "false" という文字ではなく、チェックボックスの ON/OFF で表示されています。

パッとみて直ちに1箇所だけが true であることがわかるという点で、チェックボックス表示の方が優れていると言えます。

これを実装する方法を説明します。

既定のセルレンダラー

JTable では、セルの描画はセルレンダラーというオブジェクトが担当します。

セルは Cell でマス目のこと、レンダーは英語の render (描画する) ということで、セルをレンダー (描画) するものなので「セルレンダラー」です。

デフォルトのセルレンダラーが用意されていて、データ型毎に良い塩梅にデータを表示するようになってます。例えば・・・

  • Boolean → チェックボックスとして描画
  • 数値型 → 右寄せのラベルで描画
  • Date → ラベルで描画

といった具合です。

デフォルトではJTable はカラム毎にデータ型を調べ、そのデータ型に応じてデフォルトセルレンダラーがセルを描画します。 このため JTable はテーブルモデルにカラム毎のデータ型を問い合わせます

このときのメソッドが getColumnClass メソッドです。

JTable でデータとビューをつなぐテーブルモデル」で作成した MyTableModel1getColumnClass メソッドを追加します。

package com.keicode.java.testapp;

import javax.swing.table.AbstractTableModel;

@SuppressWarnings("serial")
class MyTableModel2 extends AbstractTableModel {

  Object[][] data = {
      {"X", "100", true},
      {"X", "200", false},
      {"X", "300", false},
      {"Y", "400", false},
      {"Y", "500", false},
      {"Z", "600", false},
      {"Z", "700", false}};
  
  String[] columns = {"Column 0", "Column 1", "Column 2"};
  
  @Override
  public Class<?> getColumnClass(int columnIndex) {
    return data[0][columnIndex].getClass();
  }

  @Override
  public String getColumnName(int column) {
    return columns[column];
  }

  @Override
  public int getRowCount() {
    return data.length;
  }

  @Override
  public int getColumnCount() {
    return columns.length;
  }

  @Override
  public Object getValueAt(int rowIndex, int columnIndex) {
    return data[rowIndex][columnIndex];
  }
    
}

戻り値は Class ですが、実際の型はデータによって変わるので型はワイルドカードの ? をつけた Class を返しています。

このように getColumnClass メソッドを実装することで、JTable はそれぞれのデータ型を知ることができるので、 Boolean 型のデフォルトセルレンダラーがチェックボックスを用いて true / false 値を描画することができます。

次のページではデフォルトのセルレンダラーを少しいじって、文字の中央揃えをしてみます。

デフォルトセルレンダラーを使って中央揃えにする方法

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Java 入門