WisdomSoft - for your serial experiences.

11.1 表形式データの表示

行と列からなる表形式のデータを JTable クラスを用いて表示します。

11.1.1 テーブル

Microsoft Excel のような表データは、コンピュータの世界では関係モデルと呼ばれます。正確には、関係モデルは表よりも抽象化された概念ですが、この場では関係モデルの定義は重要ではありません。現代のビジネスデータの多くが、関係モデルに基づいてデータを管理する関係データベースによって運用されており、このデータの表示には Excel のような表形式の UI が直感的です。

表は行と列からなる 2 次元のデータで、ファイルやデータベースから関係モデルのデータを取得したり、ユーザーに表データを作成したりしてもらうアプリケーションを開発するには、テーブルコンポーネントを使ってデータを表示する必要があります。

行と列からなるデータを表示するテーブルコンポーネントは javax.swing.JTable クラスで実装されています。 このクラスは、関係データを行と列に対応したセルに表示てくれる強力なコンポーネントです。セルとは、データを表示するマス目のことです。

javax.swing.JTable クラス
java.lang.Object
  |
  +--java.awt.Component
        |
        +--java.awt.Container
              |
              +--javax.swing.JComponent
                    |
                    +--javax.swing.JTable
public class JTable extends JComponent implements TableModelListener, Scrollable,
	TableColumnModelListener, ListSelectionListener, CellEditorListener, Accessible

JTable クラスが表示するデータは、行と列に関連付けられます。行と列の関係は 2 次元配列のようなデータ構造だと考えてください。

表1 JTable クラスのコンストラクタとメソッド(抜粋)
コンストラクタ 解説
public JTable() デフォルトの JTable を構築する。
public JTable(TableModel dm) データモデル dm で初期化される JTable を構築する。
public JTable(TableModel dm, TableColumnModel cm) データモデル dm、列モデル cm で初期化される JTable を構築する。
public JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm) データモデル dm、列モデル cm、および選択モデル sm で初期化される JTable を構築する。
public JTable(int numRows, int numColumns) 行数 numRows と、列数 numColumns で JTable を構築する。
public JTable(Vector rowData, Vector columnNames) データ rowData を列名 columnNames で表示する JTable 構築する。
public JTable(Object[][] rowData, Object[] columnNames) 2 次元配列 rowData の値を表示する JTable を、列名 columnNames で構築する。
メソッド
public int getRowCount() このテーブルのモデル内の行数を返す。
public int getColumnCount() 列モデル内の列数を返す。
public String getColumnName(int column) 列位置 column のビューに表示される列の名前を返す。
public void setValueAt(Object aValue, int row, int column) row、column に位置するセルの値を設定する。
public Object getValueAt(int row, int column) row、column に位置するセル値を返す。
public void setRowHeight(int rowHeight) すべてのセルの高さをピクセルで rowHeight に設定する。
public int getRowHeight() テーブル行の高さをピクセルで返す。
public void setRowHeight(int row, int rowHeight) 行番号 row の高さを rowHeight に設定する。
public int getRowHeight(int row) 行番号 row のセルの高さをピクセル単位で返す。
public void setRowMargin(int rowMargin) 隣接する行のセルの間隔を設定する。
public int getRowMargin() セルの間隔をピクセル単位で返す。

表1に示した JTable クラスのコンストラクタから想像できるように、JTable クラスが表示するデータはインタフェースが提供するモデルによって決定します。TableModel クラスなどについては後述しますが、これは JTable クラスがあらゆるデータ型を扱うことができる柔軟性と拡張性を保持していることを意味しています。もちろん、データを表示するビューも拡張可能です。

デフォルトの設定では、セルにテキストを表示する単純なテーブルを作成することができます。数値を引数として受け取る JTalbe() コンストラクタの numRows に行数を、numColumns に列数を指定すると、これに従った行数及び列数で表が作成されます。表には、setValueAt() メソッドからデータを挿入することができ、getValueAt() メソッドからデータを得ることができます。

コード1
import javax.swing.*;

public class Test {
	public static void main(String args[]) {
		JTable table = new JTable(10 , 5);
		for(int c = 0 ; c < table.getColumnCount() ; c++) {
			for(int r = 0 ; r < table.getRowCount() ; r++) {
				table.setValueAt("行" + r + ":列" + c , r , c);
			}
		}

		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(table);
		win.show();
	}
}
実行結果
コード1 実行結果

コード1は、指定した列数と行数でテーブルを初期化しています。行数が 10、列数が 5 の表のセルは (0 , 0) から (9 , 4) までの 2 次元配列であると考えることができ、行数と列数から、それぞれのセルを for 文で初期化しています。それぞれのセルは行番号と列番号を表示しているため、実行結果を見ると、それぞれのセルの位置関係がわかります。

Vector オブジェクトを用いて表を初期化する場合は、rowData が表の各行のデータを表す Vector の配列を保存している Vector オブジェクトでなければなりません。つまり、Vector オブジェクトを入れ子にして 2 次元配列を表現します。columnNames には、それぞれの列の名前を指定します。デフォルトのテーブルでは列名は表示されません。列名を表示するのは列ヘッダと呼ばれるコンポーネントの役割とされているためです。

JTable クラスは Scrollable インタフェースを実装しているため、JScrollPane コンテナに必要な情報を送信することができます。JTable を JScrollPane コンテナに配置して表示すると、スクロールに対応できるのはもちろんですが、列ヘッダも同時に表示され、列がユーザーによって移動可能になります。

コード2
import javax.swing.*;
import java.util.*;

public class Test {
	public static void main(String args[]) {
		Vector row = new Vector();
		Vector column = new Vector();

		for(int i = 0 ; i < 5 ; i++) column.add("列名" + i);
		for(int r = 0 ; r < 10 ; r++) {
			Vector temp = new Vector();
			for(int c = 0 ; c < column.size() ; c++) {
				temp.add("行" + r + ":列" + c);
			}
			row.add(temp);
		}

		JTable table = new JTable(row , column);
		JScrollPane scrollPane = new JScrollPane(table);

		JFrame win = new JFrame();
		win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		win.setBounds(10 , 10 , 400 , 300);
		win.getContentPane().add(scrollPane);
		win.show();
	}
}
実行結果
コード2 実行結果

コード2では、Vector オブジェクトを受け取る JTable() コンストラクタを使って表を初期化し、表の関係データと列名を指定してます。列名を指定する column オブジェクトは 5 つの要素を提供しているため、この表の列数は 5 となります。これに合わせて、列数が 5 つで任意の行数を提供する row オブジェクトを初期化しています。

実行結果を見て確認できるように、このプログラムではテーブルをスクロールペインに追加しているため、列ヘッダがデフォルトでサポートされます。列ヘッダコンポーネントをマウスでドラッグすると、列全体を移動することができます。