TableModelインターフェースとは
JTableのデータ部分を管理するのがTableModelです。今までのサンプルのように初期値としてデータを与えた状態でテーブルを作成することはできますが、後からテーブルのデータを書き換えたりする場合には、TableModelを取り出し、そのオブジェクトに対して操作を行う必要があります。
TableModelはインターフェースです。実装クラスとしては抽象クラスであるAbstractTableModelクラスと、さらにそのサブクラスであるDefaultTableModelクラスが用意されています。DefaultTableModelクラスを使ってみましょう。
まずはクラス図から見てください。
- java.lang.Object
 - javax.swing.table.AbstractTableModel
 - javax.swing.table.DefaultTableModel
 - public class DefaultTableModel extends AbstractTableModel implements Serializable
 
コンストラクタは6つ用意されています。
| コンストラクタ | 
|---|
| DefaultTableModel() 列が 0、行が 0 のテーブルであるデフォルトの DefaultTableModel を構築します。  | 
| DefaultTableModel(int rowCount, int columnCount) rowCount および columnCount の null オブジェクト値で DefaultTableModel を構築します。  | 
| DefaultTableModel(Object[][] data, Object[] columnNames) DefaultTableModel を構築し、data と columnNames を setDataVector メソッドに渡すことにより、そのテーブルを初期化します。  | 
| DefaultTableModel(Object[] columnNames, int rowCount) columnNames にある要素と同じ数の列、および rowCount の null オブジェクト値で DefaultTableModel を構築します。  | 
| DefaultTableModel(Vector columnNames, int rowCount) columnNames にある要素と同じ数の列、および rowCount の null オブジェクト値で DefaultTableModel を構築します。  | 
| DefaultTableModel(Vector data, Vector columnNames) DefaultTableModel を構築し、data と columnNames を setDataVector メソッドに渡すことにより、テーブルを初期化します。  | 
コンストラクタは色々ありますが、行と列の数や初期データの指定の有無などの方法が色々あるだけです。また新規にDefaultTableModelクラスのオブジェクトを作成しても構いませんし、既に作成したJTableのオブジェクトからテーブルモデルを抜き出すこともできます。
DefaultTableModelを使ってJTableを作成する
ではまずはテーブルに表示される初期データを全て指定してDefaultTableModelクラスのオブジェクトを作成し、そのオブジェクトを元にJTableを作成してみます。
コンストラクタとしては3番目又は6番目のコンストラクタを使います。3番目のコンストラクタを見てみましょう。
DefaultTableModel public DefaultTableModel(Object[][] data, Object[] columnNames)
DefaultTableModel を構築し、data と columnNames を setDataVector メソッ ドに渡すことにより、そのテーブルを初期化します。Object[][] 配列の最初の インデックスは行のインデックス、2 番目は列のインデックスです。 パラメータ: data - テーブルのデータ columnNames - 列の名前
テーブルに表示されるデータ、及び列毎の名前を引数として渡してDefaultTableModelクラスのオブジェクトを作成します。
private String[][] tabledata = {
   {"日本", "3勝", "0敗", "1分"},
   {"クロアチア", "3勝", "1敗", "0分"},
   {"ブラジル", "1勝", "2敗", "1分"},
   {"オーストラリア", "2勝", "2敗", "0分"}};
private String[] columnNames = {"COUNTRY", "WIN", "LOST", "EVEN"};
DefaultTableModel tableModel = new DefaultTableModel(tabledata, columnNames);
			作成したDefaultTableModelクラスのオブジェクトを引数としてJTableを作成します。その際に使用するJTableクラスのコンストラクタは下記となります。
JTable public JTable(TableModel dm)
データモデル dm、デフォルト列モデル、およびデフォルト選択モデルで初期 化される JTable を構築します。 パラメータ: dm - テーブルのデータモデル
では一度試してみます。
import javax.swing.*;
import java.awt.event.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.table.DefaultTableModel;
public class SwingTest extends JFrame{
  private String[][] tabledata = {
    {"日本", "3勝", "0敗", "1分"},
    {"クロアチア", "3勝", "1敗", "0分"},
    {"ブラジル", "1勝", "2敗", "1分"},
    {"オーストラリア", "2勝", "2敗", "0分"}};
  private String[] columnNames = {"COUNTRY", "WIN", "LOST", "EVEN"};
  public static void main(String[] args){
    SwingTest test = new SwingTest("SwingTest");
    test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    test.setVisible(true);
  }
  SwingTest(String title){
    setTitle(title);
    setBounds( 10, 10, 300, 200);
    DefaultTableModel tableModel
     = new DefaultTableModel(tabledata, columnNames);
    JTable table = new JTable(tableModel);
    JScrollPane sp = new JScrollPane(table);
    sp.setPreferredSize(new Dimension(250, 70));
    JPanel p = new JPanel();
    p.add(sp);
    getContentPane().add(p, BorderLayout.CENTER);
  }
}
			実行結果は下記の通りです。
			
			
見て頂くと分かりますが、一番最初のページで見たサンプルと同じです。一番最初のページのサンプルはテーブルデータと列名から直接JTableクラスのオブジェクトを作成していました。今度は同じデータから一度DefaultTableModelクラスのオブジェクトを作成し、それを元にJTableクラスのオブジェクトを作成いたしました。
なぜこのような面倒なことをするかと言いますと、テーブルのデータから直接JTableクラスのオブジェクトを作成してしまうと、テーブルのデータを後から追加したり削除したりすることが出来ません。DefaultTableModelクラスのオブジェクトを使うことでは後から行や列を追加することが可能です。
( Written by Tatsuo Ikura )
				
JavaDrive