その1では、NetBeansが作ってくれるプロジェクトの雛形を眺めてみた。
その2では、Hello worldにチャレンジしてみようと思う。
とりあえず、前回作ったHelloViewにラベルとボタンを置いて適当な配置にする。
各コンポーネントには、適当な名前をつけておいた。
後は、ボタンを押したらテキストフィールドに入力した文字列とHello world!!の文字列と連結してラベルに出力させる。
ここで注意しなきゃならないのが、ボタンを押したときのアクションの指定方法が普通のSwingのときと違う。
普通のSwingでは、ActionListenerを実装したクラスを登録するか、Actionインターフェース(実質的にはAbstractActionを継承する)を実装したクラスを登録する。
Swing Application Frameworkでは、メソッドに@Actionアノテーションをつけてアクションを指定するらしい。
NetBeansからは、ボタンの右クリックメニューの「アクションを設定」から色々設定ができるようになってる。
アクションを設定ダイアログが出てくるので、下のように新規アクションを作成を選ぶ。
そして、メソッド名等の情報をぱちぱちと打ち込んでいく。
了解ボタンを押すと、ボタンが押されたときの処理を書くメソッドが自動的に作られるので、Hello worldのコードを書いていく。
@Action
public void sayHello() {
labelOutput.setText("Hello world!! " + textFieldName.getText());
}
実行して、テキストフィールドに適当な値を入れてボタンを押すとちゃんと動いた!!
ボタンとsayHelloメソッドの関連付けがコード上でどのように行われているか見てみた。
コードとしては、下の二行がそれっぽい。
javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(com.wankuma.kazuki.desktop.HelloApplication.class).getContext().getActionMap(HelloView.class, this);
buttonHello.setAction(actionMap.get("sayHello")); // NOI18N
HelloApplicationをApplication.getInstanceで取得してgetContextでコンテキストを取得して、HelloViewのActionMapを取得している。
そして、取得したactionMapからsayHelloという文字列をキーにしてActionを取得してボタンに設定してある。
おそらくフレームワークが、@Actionアノテーションを拾ってきて、それを呼び出すActionを自動的に作ってActionMapに登録してくれてるんだと思われる。
おまけだけど、ボタンに設定したSayHelloというテキストは自動的にプロパティファイルから取得されるようになってる。
いい感じだ。