[brownies] TableUtils

えへ。コメント頂いちゃったので調子に乗って書いちゃいます。

TableUtilsはSwingのJTableを拡張するためのクラスです。
何が出来るのかというとこんな感じ。

  • テーブルの変更不可
  • 列の非表示
  • ソート機能

詳しく言うと、これはテーブル自身ではなくテーブルのモデルに機能を追加するクラスです。これは何で作っちゃったかっていうと、Joeyで検索結果を表示するのに必要だったし、ソートはやっぱ自由に並び替えたいなーと思ったからです。


使い方の前に大雑把なJTableの説明を・・・・面倒なので他のサイトを見てください。


要点はJTableはビューに徹していて、モデルはインタフェースTableModelで実現されているってことです。browniesでは、モデルがインタフェースとして実現されているのを利用してDecoratorパターンを使って、上記の機能を追加できるようにしています。


まず簡単なテーブルの変更不可をやってみましょう。

final DefaultTableModel originalModel = new DefaultTableModel();
final TableModel uneditableModel = TableUtils.toUneditableModel(originalModel);

uneditableModelをコンストラクタの引数としてJTableを生成すると、そのJTableはユーザの変更を受け付けられなくなります。もちろんoriginalModelを操作することによってModelの内容を変更することはできます。


次はソートに行ってみましょう

final SortableTableModel sortableModel = TableUtils.toSortableModel(originalModel);

toSortableModelメソッドはtoUneditableModelメソッドと違ってSortableTableModel インタフェースを返します。このインタフェースはこんな感じです。

package org.asyrinx.brownie.swing.table;

import javax.swing.table.TableModel;

public interface SortableTableModel extends TableModel {

	public void sort(int columnIndex, boolean reverse);

	public int getOriginalRowIndex(int sortedRowIndex);
}

ソートのキーとなる列と昇順or降順を指定してソートを実行するsortメソッドと、ソートされた行が元々のモデルではどの行に該当するのかを表すgetOriginalRowIndexメソッドが宣言されていますので、例えば2列目を昇順でソートしたい場合はこんな風に書きます。

sortableModel.sort(2, false);

こんだけ。


最後は列の非表示です。これはSELECT文の検索結果は表示したいけど、各結果のIDは表示したくないという場合のために用意しました。こんな感じで使います。

final InvisibleColumnTableModel invisibleColumnTableModel = TableUtils.toInvisibleColumnModel(originalModel, 0, 2);

第2引数は何列目から、第3引数は何列非表示にするのかを指定します。上の例では0列目から2列を非表示として扱います。で、このメソッドはInvisibleColumnTableModelというインタフェースを返します。

package org.asyrinx.brownie.swing.table;

public interface InvisibleColumnTableModel extends TableModel {

	public int getOriginalColumnIndex(int columnIndex);

}

getOriginalColumnIndexメソッドは列非表示のモデルでのある列がその元のモデルでどの列に該当するのかを返します。



これがTableUtilsの機能はこれで全部です。んが、強調したいがあります。
TableUtilsのメソッドは、引数に必ずTableModelインタフェースを必要として、必ずTableModelインタフェースか、その派生インタフェースを返します。
つまりこれらは重ねて使うことができるのです。

final DefaultTableModel originalModel = new DefaultTableModel();
final TableModel uneditableModel = TableUtils.toUneditableModel(originalModel);
final SortableTableModel sortableModel = TableUtils.toSortableModel(uneditableModel);

とすると、このモデルは変更不可でソート可能という風になります。
ああ便利!Decoratorパターン最高!っていうわけで今回は終了です。


次回はDecoratorパターンつながりでResultSetFilterです。