さて、前回は、デザイナ上で指定した文字列とかが自動的にプロパティファイルに格納されるのを見た。
そのほかにも、便利?な機能がSwing Application Frameworkにあるので簡単に見てみようと思う。
とりあえず、前回のResourceStudyというプロジェクトのresourcestudyパッケージにPersonクラスを新規作成する。Personクラスには、nameプロパティとageプロパティを追加する。そして、フィールドに@Resourceアノテーションを追加する。これをつけておくことで、プロパティファイルから値を設定することができるようになる。
package resourcestudy;
import org.jdesktop.application.Resource;
public class Person {
@Resource
private String name;
@Resource
private int age;
// Getter/Setterは省略
}
そして、ResourceStudyViewのプロパティとしてPersonクラスを追加する。
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
まだ、インスタンスを作る処理を書いてないけど、この年齢と名前を表示するように画面をデザインしておく。「名前:」「年齢:」と項目を表示するラベル2個と、実際に名前と年齢を表示するラベル2個の合計4個を置く。名前と年齢を表示するラベルは、バインドでFormのpersonプロパティのnameとageをバインドする。
ラベルを右クリックして、バインド → textを選択する。
出てきたウィンドウで、Formを選択してpersonのname(年齢のほうはageにする)を選択する。
Swing Application Frameworkは、クラスのプロパティをプロパティファイルから読み込む機能がデフォでついてる。
具体的には、ApplicationContextクラスのgetResourceMapメソッドの引数にクラスを指定して呼び出すと、そのクラスの所属するパッケージ+resource + クラス名.propertiesから自動的にResourceMapを作ってくれる。
ApplicationContextクラスはApplication.getApplication().getContext()で取得できる。FrameViewを継承しているクラスでは、ApplicationクラスはgetApplication()で取得できるので、下のようなコードでResourceMapが取得できることになる。
ResourceMap personResourceMap = getApplication().getContext().getResourceMap(Person.class);
そして、ResourceMapのinjectFieldsメソッドを呼ぶと、プロパティファイルの値を引数で渡したオブジェクトのフィールドに代入してくれる。もちろん最初につけたResourceアノテーションのあるものに限ってだけど。ということで、コードは以下のようになる。
public ResourceStudyView(SingleFrameApplication app) {
super(app);
ResourceMap personResourceMap = getApplication().getContext().getResourceMap(Person.class);
person = new Person();
personResourceMap.injectFields(person);
initComponents();
// 以下略
}
肝心のプロパティファイルの中身だけど、クラス名.フィールド名 = 値といった感じで設定していく値を列挙する。
Person.name = 田中 一郎
Person.age = 18
これで準備完了。実行してみると、personオブジェクトにデータが設定されて、その値がラベルに表示される。
いい感じだ。