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 は行が追加されたことをイベントで通知されたら、必要に応じてテーブルを更新します。 通知がないとデータが追加されたことを知らないので、新しい行を描画しませんので注意してください。

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

© 2024 Java 入門