テーブルモデル


セル値の管理

テーブルが保有する各セルの値はテーブルモデルによって管理されます
テーブルモデルは javax.swing.table.TableModel インターフェイスで表されます

public interface TableModel

このクラスは、テーブルのセルを制御するための基本的な操作を公開しています
セルの値を設定するには TableModel.setValueAt() メソッドを
取得するには TableModel.getValueAt() メソッドを使います

public void setValueAt(Object aValue , int rowIndex , int columnIndex)
public Object getValueAt(int rowIndex , int columnIndex)

aValue には設定する値、rowIndex には行、columnIndex には列を指定します
モデルの行数は TableModel.getRowCount() メソッドで
列数は TableModel.getColumnCount() で取得することができます

public int getRowCount()
public int getColumnCount()

それぞれ、行数、列数を表す値を返します
テーブルは、与えられたテーブルモデルのこうしたメソッドから値を受け取ります

テーブルモデルの実装は javax.swing.table.DefaultTableModel クラスです
このクラスは TableModel を実装する抽象クラスを特化しています
java.lang.Object
  |
  +--javax.swing.table.AbstractTableModel
        |
        +--javax.swing.table.DefaultTableModel
このクラスは次のようなコンストラクタを公開しています

public DefaultTableModel()
public DefaultTableModel(int rowCount , int columnCount)
public DefaultTableModel(Vector columnNames , int rowCount)
public DefaultTableModel(Object[] columnNames , int rowCount)
public DefaultTableModel(Vector data , Vector columnNames)
public DefaultTableModel(Object[][] data , Object[] columnNames)

デフォルトコンストラクタの場合は、列行ともに 0 のモデルとなります
rowCount には行数を、columnCount には列数をそれぞれ指定します

columnNames には列の名前を保持する Vector または配列を指定します
この場合は、与えられた要素数だけの列が生成されます
data には、各セルのデータとなる配列、または Vector を指定します
import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

/*	<applet code="Test.class" width="300"height="300">
 	</applet>
*/

public class Test extends JApplet  {
	public void init() {
		String[][] data = {
			{ "涼宮 遙" , "鏡 純夏" , } ,
			{ "速瀬 水月" , "御剣 冥夜" } ,
			{ "大空寺あゆ" , "綾峰 慧" }
		};
		String name[] = { "Tha forever that you wish" , "MUV_LUV" };

		DefaultTableModel model = new DefaultTableModel(data , name);
		JTable table = new JTable(model);
		getContentPane().add(new JScrollPane(table));
	}
}
これは、テーブルにモデルを与えて初期化した例です
DefaultTableModel クラスを用いてテーブルの情報をモデル化しています

列の追加は DefaultTableModel.addColumn() メソッドで
行の追加は DefaultTableModel.addRow() メソッドで一括して行えます

public void addColumn(Object columnName)
public void addColumn(Object columnName , Vector columnData)
public void addColumn(Object columnName , Object[] columnData)
public void addRow(Object[] rowData)
public void addRow(Vector rowData)

columnName には追加する列の名前を、columnData には値を指定します
rowData には追加する行の配列、または Vector を指定します

データモデルが変更されると、テーブルモデルリスナが呼び出されます
これは javax.swing.event.TableModelListener で表されます

public interface TableModelListener extends EventListener

このインターフェイスには、データモデルの変更時に呼び出される
TabelModelListener.tableChanged() メソッドが宣言されています

public void tableChanged(TableModelEvent e)

e にはイベントの情報を格納した TableModelEvent オブジェクトが渡されます
これは javax.swing.event.TableModelEvent クラスです
java.lang.Object
  |
  +--java.util.EventObject
        |
        +--javax.swing.event.TableModelEvent

public class TableModelEvent extends EventObject
このクラスのコンストラクタは次のように定義されています
public TableModelEvent(TableModel source)
public TableModelEvent(TableModel source , int row)

public TableModelEvent(
	TableModel source , int firstRow , int lastRow
)

public TableModelEvent(
	TableModel source ,
	int firstRow, int lastRow, int column
)
public TableModelEvent(
	TableModel source ,
	int firstRow , int lastRow ,
	int column, int type
)
source にはイベント発生もとのテーブルモデルを
firstRow は変更された最初の行、lastRow には最後の行を指定します
column には変更された列インデックスを指定します
選択行範囲のすべての列が変更されている場合は ALL_COLUMNS を指定してください

type は変更イベントの種類を指定します
更新は TableModelEvent.UPDATE、削除は TableModelEvent.DELETE
挿入は tableModelEvent.INSERT を用い、これらのいずれかを指定することで識別します
コンストラクタで設定した値は次のメソッドで取得できます

public int getFirstRow()
public int getLastRow()
public int getColumn()
public int getType()

TableEventModel.getFirstRow() メソッドは変更された最初の行を
TableEventModel.getLastRow() メソッドは最後の行を返します

TableEventModel.getColumn() メソッドは変更された行を
TableEventModel.getType() メソッドはイベントの種類を返します
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

/*	<applet code="Test.class" width="300"height="300">
 	</applet>
*/

public class Test extends JApplet implements TableModelListener {
	DefaultTableModel model = new DefaultTableModel(5 , 5);
	JLabel label = new JLabel("Label");
	public void init() {
		model.addTableModelListener(this);
		JTable table = new JTable(model);
		getContentPane().add(label , BorderLayout.NORTH);
		getContentPane().add(new JScrollPane(table));
	}
	public void tableChanged(TableModelEvent e) {
		String text = "Column = " + e.getColumn();
		text += " : FirstRow = " + e.getFirstRow();
		text += " : LastRow = " + e.getLastRow();
		label.setText(text);
	}
}


このプログラムは、アプレット上部にイベントの内容を伝えるラベルを配置し
テーブルモデルにリスナを追加してイベント発生のメカニズムを確認することができます



前のページへ戻る次のページへ