別にSwing Application Frameworkに限った話じゃないと思うけど、JTableを使ってみようと思う。昔は、TableModelをがりがりと実装して使った記憶がある。最近もそうなんだろうか?と思ってみてみると、NetBeansを使う限りだと、めっちゃ簡単にとりあえず使えるようになってるくさい。
ということで早速実験。プロジェクトを新規作成して、JTableEduという名前をつける。もちろんJavaデスクトップアプリケーションで作る。アプリケーションクラスはcom.wankuma.kazuki.jtable.JTableEduAppという名前にしておいた。
後は、ビーンバインディングも使うのでライブラリに追加しておく。
画面を作る前に、画面に表示するためのデータの入れ物!JavaBeansを1つ作っておこうと思う。
クラス名はPersonにして、下のようにいくつかプロパティを定義しておく。後で、コーディングしやすいようにコンストラクタもいくつか定義しておく。
package com.wankuma.kazuki.jtable;
import java.util.Date;
public class Person {
private int id;
private String name;
private Date birthday;
private int salary;
public Person() {
}
public Person(int id, String name, Date birthday, int salary) {
this.id = id;
this.name = name;
this.birthday = birthday;
this.salary = salary;
}
// Getter/Setterは省略
}
そして、JTableEduViewにList<Person>型のプロパティを追加する。プロパティにはArrayListやLinkedListではなくて、バインド専門のリストのインスタンスを指定する。
ただし、素直にnewして作るんじゃなくてObservableCollections.observableList(List<E> list)というメソッドを使ってインスタンスを作る。とりあえず、空のリストでいいのでnew ArrayList()を入れておいた。
多分、素直にnewして作るんじゃなくて、こんなファクトリメソッドになってるのは、DBからとってきたリストを渡す前提なんだと思われる。
private List<Person> people = ObservableCollections.observableList(new ArrayList<Person>());
public List<Person> getPeople() {
return people;
}
public void setPeople(List<Person> people) {
this.people = people;
}
次は、デザイナ上からJTableを置いて、さっき作ったpeopleプロパティとバインドする。
バインドは、デザイナのJTableの右クリックメニューから「表の定義」を選択すると開くカスタマイザダイアログからやる。
カスタマイザダイアログの表のモデルタブから、バウンドを選んでFormのpeopleを選択する。ちょうど上の画像のような感じになる。
ついでに、Fileメニューの下にMenuを1つ追加してアクションを追加する。
アクションの名前は、addPersonにした。
addPersonメソッドは、単純にpeopleに対してPersonを1つ追加するだけのシンプルなものです。
@Action
public void addPerson() {
people.add(new Person(jTable1.getRowCount(), "田中 変太郎", new Date(), 1000000));
}
次に、カスタマイザダイアログの列タブで、挿入ボタンを押し捲ってPersonクラスのプロパティの数だけ列を追加する。
これで実行すると、メニューのAdd Personを押すたびに表にデータが追加されていくプログラムが出来上がる。
これを、DBからとってくるようにすれば、お手軽DB編集プログラムが出来そうだ。というかJavaデスクトップアプリケーションのDBアプリの雛形がまさにそうだったりする。
このコードを見てるだけでも勉強になる。暇なときに眺めてみよう。