JTable に行を追加する
この記事では、行を追加 (Add row) というボタンを設置して、それを押下したときに、行を追加するようにします。
サンプルコードは「JTable でデータフィルターを実装する方法」で作ったプログラムをベースにしています。
行の追加は簡単です。これまでフィルターやソーターなどをサンプルプログラムに追加して来ましたが、 フィルター、ソーター、レンダラーなどは関係しません。
「JTable でデータとビューをつなぐテーブルモデル」で説明した通りで、 実際のデータとビュー (すなわち JTable) を関連付けるのはテーブルモデルの役割です。
何らかの方法でデータを追加した後、テーブルモデルから「データに行が追加されました」ということをイベントで通知すれば OK です。
ここでは、テーブルモデルに少し機能を追加して、行を追加するメソッドを加えてみましょう。
package com.keicode.java.testapp;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
@SuppressWarnings("serial")
class MyTableModel4 extends AbstractTableModel {
ArrayList<Object[]> data = new ArrayList<Object[]>();
String[] columns = {"Column 0", "Column 1", "Column 2"};
public MyTableModel4() {
data.add(new Object[]{"X", "100", true});
data.add(new Object[]{"X", "200", false});
data.add(new Object[]{"X", "300", false});
data.add(new Object[]{"Y", "400", false});
data.add(new Object[]{"Y", "500", false});
data.add(new Object[]{"Z", "600", false});
data.add(new Object[]{"Z", "700", false});
}
public void addRow() {
data.add(new Object[] {"X", "999", false});
fireTableRowsInserted(0, data.size()-1);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public void setValueAt(Object val, int rowIndex, int columnIndex) {
data.get(rowIndex)[columnIndex] = val;
fireTableCellUpdated(rowIndex, columnIndex);
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return data.get(0)[columnIndex].getClass();
}
@Override
public String getColumnName(int column) {
return columns[column];
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columns.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex)[columnIndex];
}
}
これまでテーブルモデルは固定長の配列にデータを格納していました。動的に追加できるように、ArrayList にデータを保持するように変更しました。
そして、上記のように addRow メソッドを追加しています。特に決められたインターフェイスではないので、メソッド名は何でも構いません。
実データにデータを追加した後に、fireTableRowsInserted メソッドを呼び、ビューに対して行が追加されたことを通知しています。 JTable は行が追加されたことをイベントで通知されたら、必要に応じてテーブルを更新します。 通知がないとデータが追加されたことを知らないので、新しい行を描画しませんので注意してください。