モデルクラスの作成
こうしたデータ表示用のコンポーネントでは、各データを管理する「BeanItemContainer」というクラスを介してデータを取得する方法が用意されています。まず、データを管理するモデルクラスを用意します。ここでは「MyData」というクラスとして作成しておきます。
package com.example.myvaadin;
import java.io.Serializable;
public class MyData implements Serializable {
private String chimei = "";
private Integer zenki = null;
private Integer kouki = null;
private String tantou = "";
public String getChimei() { return chimei; }
public void setChimei(String chimei) { this.chimei = chimei; }
public Integer getZenki() { return zenki; }
public void setZenki(Integer zenki) { this.zenki = zenki; }
public Integer getKouki() { return kouki; }
public void setKouki(Integer kouki) { this.kouki = kouki; }
public String getTantou() { return tantou; }
public void setTantou(String tantou) { this.tantou = tantou; }
public MyData(String s1, int n1, int n2, String s2){
super();
this.chimei = s1;
this.zenki = n1;
this.kouki = n2;
this.tantou = s2;
}
}
見れば分かるように、非常にシンプルなBeanクラスです。Serializableをimplementsしておき、保管するデータはprivateフィールドとして用意しておきます。ここでは、4つのフィールドを用意しておくことにしました。
データコンテナの作成
続いて、作成したモデルクラス(MyData)を管理するための「BeanItemContainer」クラスを作成します。ここでは「MyDataContainer」というクラスとして定義しましょう。
package com.example.myvaadin;
import java.io.Serializable;
import com.vaadin.data.util.BeanItemContainer;
public class MyDataContainer extends BeanItemContainer<MyData>
implements Serializable {
public MyDataContainer()
throws InstantiationException, IllegalAccessException {
super(MyData.class);
}
public static MyDataContainer getContainer()
throws InstantiationException, IllegalAccessException {
MyDataContainer container = new MyDataContainer();
container.addBean(new MyData("東京",12300,45600,"tokyo@honsya"));
container.addBean(new MyData("大阪",9870,32100,"osaka@sisya"));
container.addBean(new MyData("名古屋",4560,23400,"nagoya@siten"));
container.addBean(new MyData("福岡",2980,12120,"fukuoka@siten"));
container.addBean(new MyData("札幌",1990,23230,"sapporo@siten"));
return container;
}
}
BeanItemContainerをextendsし、やはりSerializableをimplementsしておきます。BeanItemContainerには、モデルクラスのインスタンスを保管する「addBean」というメソッドが用意されています。ここでは「getContainer」というメソッドを用意しておき、ここにサンプルのデータを組み込む処理を用意しておきました。
MyvaadinApplicationを修正する
では、MyvaadinApplicationクラスを修正し、MyDataContainerを取得してデータをTableに表示するようにしてみましょう。initメソッドを次のように書き換えてください。
public void init() {
MyDataContainer datasource = null;
try {
datasource = MyDataContainer.getContainer();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
Window mainWindow = new Window("Myvaadin Application");
setMainWindow(mainWindow);
VerticalLayout layout = (VerticalLayout) mainWindow.getContent();
layout.setMargin(true);
layout.setSpacing(true);
Table table = new Table("※テーブル");
table.setContainerDataSource(datasource);
table.setVisibleColumns(new Object[]{"chimei","zenki","kouki"});
table.setColumnHeaders(new String[]{"地名","前期","後期"});
table.setWidth("300px");
table.setHeight("100px");
layout.addComponent(table);
}

ここでは、MyDataContainerのgetContainerを呼び出してインスタンスを取得しています。そして、Tableインスタンスを作成後、「setContainerDataSource」を使ってデータソースにMyDataContainerを設定します。これで、MyDataContainerのデータがTableに表示されるようになります。
さらに、「setVisibleColumns」で表示する列を設定し、「setColumnHeaders」で各列のヘッダーテキストを設定しています。MyDataでは4つのフィールドが用意されていましたが、実際に表示されているのは3列だけです。setVisibleColumnsを呼び出すことで、必要な列だけを表示させることが可能になっているのです。
これを更に拡張し、データベースにアクセスしてデータを取得し、それをMyDataのBeanとしてMyDataContainerに保管すれば、ダイナミックにデータを取得し表示できるようになります。BeanItemContainerを経由しデータをやり取りするように設計することで、Tableとデータを分離し、自由にデータを構築できるようになっていることがわかるでしょう。
