リソースインジェクションについて、SAFとNetBeansとS2Swingのそれぞれの役割
Swing Application Frameworkのリソースインジェクションにおける、
のそれぞれの役割について書きます。内容は後で整理して、S2Swingのドキュメントに追加しようと思います。
Swing Application Frameworkがやること
Swing Application Frameworkでは、ウィンドウに追加されている全ての子孫UIコンポーネントを走査します。その中で、名前がセットされているコンポーネントを対象として、リソースファイルからプロパティを注入します。
この処理を行うのは、SingleFrameApplication#show()メソッドです。したがってSAFを使う場合、SingleFrameApplication#show()でウィンドウを表示するのが通例になります。JFrame#setVisible()とかJDialog#setVisible()は基本的に使いません。
コンポーネントに名前がセットされているというのは、Component#setName()が呼ばれていることを指します。例えば、以下のようなリソースファイルから"Hello World"をラベルのテキストとして設定したいのであれば、
fooLabel.text = Hello World
フレーム(またはダイアログ)の初期化処理でラベルを作成した上で、以下のようにsetName("fooLabel")を呼んでおき、初期化が終わった段階でshow()します。
private void initComponents() { JLabel fooLabel = new JLabel(); fooLabel.setName("fooLabel"); getContentPane().add(fooLabel); }
NetBeansがやること
NetBeansにはSAF用の開発モード(正式名称が分からない)があります。このモードを有効にするには、「新規プロジェクト」ウィザードで、「Java」カテゴリから「Java デスクトップアプリケーション」を選択します。
SAF開発モードでは、新規にフレームやダイアログ、ビューを作成すると、それに対応するリソースファイルも自動的に生成されます。このリソースファイルはフォームデザイナと連動していて、デザイナ上でコンポーネントのプロパティを書き換えると、リソースファイルが追随して更新されます。
さらに、コンポーネントを初期化するinitComponents()メソッド内で、コンポーネント名をsetName()するコードも自動生成されるので、プログラマの側では特に意識しなくても、リソース注入の準備が勝手に整っていることになります。
S2Swingがやること
S2Swingは、コンポーネントのsetName()の部分を自動化して、リソース注入時のコード記述量を削減します。どのように自動化するかというと、以下の通りです。
この自動設定の対象となるのは、S2ViewObjectインタフェースを実装したクラスです。S2FrameとS2DialogはS2ViewObjectを実装済みなので、S2Swingのリソースインジェクションを使う場合は、通常、フレームやダイアログの基底をS2FrameまたはS2Dialogとします。
3つをどのように組み合わせるか
SAFを裸で使う場合は、コンポーネントにいちいちsetName()しなければリソースを注入できないので、コードの記述が煩雑です。そこで、S2Swingの自動設定を組み合わせると便利になります。
NetBeansでSwingアプリを開発するのであれば、リソースに関してはNetBeansのIDEがうまく取りはからってくれます。現状のNetBeansでも、この部分の完成度は十分高いです。なので、リソースの部分は全部NetBeansに任せて、それ以外のS2Swingの機能を使うのが良いと思います。ちなみに、NetBeansとS2Swingを組み合わせても、リソース注入時に競合や副作用は一切起きません。