リソースインジェクションについて、SAFとNetBeansとS2Swingのそれぞれの役割

Swing Application Frameworkのリソースインジェクションにおける、

  • Swing Application Framework自身
  • NetBeansのフォームデザイナ&コード自動生成
  • S2Swing

のそれぞれの役割について書きます。内容は後で整理して、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アプリを開発するのであれば、リソースに関してはNetBeansIDEがうまく取りはからってくれます。現状のNetBeansでも、この部分の完成度は十分高いです。なので、リソースの部分は全部NetBeansに任せて、それ以外のS2Swingの機能を使うのが良いと思います。ちなみに、NetBeansS2Swingを組み合わせても、リソース注入時に競合や副作用は一切起きません。