ゆーたんのつぶやき

株式会社ノークリサーチにてIT関連のシニアアナリストとして活動しています。

リストボックスにおけるSwingとSWTの比較



リストボックスを作成する場合、実際に画面上に表示される
文字列とは別に内部的なIDを保持する必要がありますね。
WEBアプリケーションであれば、こんな感じになるはずです。

<FORM method="post" action="...">
 <SELECT name="...">
   <OPTION value="001">メロン
   <OPTION value="002">すいか
   <OPTION value="003">リンゴ
 </SELECT>
</FORM>

これと同じことSwingやSWTでやろうとした場合、両者には
ちょっとした違いがあります。


Swingの場合、例えばJListを例に取ると、対応するモデルである
ListModelのaddElement()の引数に任意のオブジェクトを指定する
ことができます。したがって内部的なIDのみならず、対象となる
オブジェクトを丸ごとモデルに放り込んでしまうことができます。
表示はListCellRendererインターフェースを実装したレンダラを
別途作成して、その中で定義をします。Swingの場合は個々のUI
コンポーネントそのものがMVCモデルを形成しているわけですね。
(というか、それがSwingの基本コンセプトです)


一方SWTのListウイジットを見てみると、ListModelらしきものは
見当たりません。要素を追加するadd()メソッドのパラメータ型は
Stringで、これだけを見るとawtのListと同じように見えます。


SwingのMVC構造に慣れていると、「SWTのListは文字列しか設定
できないので、内部的なIDを保持したい場合はどうしよう?」と
迷ってしまいがちですが、ちゃんと代替手段が用意されています。
SWTの各ウイジットはsetData(String key, Object value)と
getData(String key)というメソッドを持っています。この二つ
はあたかもHashMapのような感じでキーと値のペアを保持します。
ですので、表示している文字列データをキーにして、それに関連
する内部的なIDなり、オブジェクトなりを値に設定して保持して
おけば良いことになります。

  List list = new List(shell, SWT.SINGLE);
  list.add("メロン");
  list.setData("メロン", new Integer(001));
  list.add("すいか");
  list.setData("すいか", new Integer(002));
  list.add("リンゴ");
  list.setData("リンゴ", new Integer(003));

setData()/getData()という名前からするとリスト内に表示する
個々のデータを操作するメソッドのように思ってしまいますが、
「アプリケーションで個々に使うデータを操作するメソッド」と
いう意味なんですね。(リファレンスにもそう書いてあります)


個人的にはこのSWTの軽い実装が好きです。WEBアプリケーション
に慣れ親しんだ方にもSWTの方が入りやすいのでは?という印象
を受けます。SwingのMVCモデルはとても柔軟ですが、ちょっと
した入力フォームに使うには少々大げさな感じもします。
(とか言いながら、以前はSwing派でしたが..)
さらにSWTの枠組みでSwingと同様のことをやりたければ、JFace
のViewer系実装があります。Listであれば、ListViewerがあり
ますので、ContentProvider()とLabelProvider()を実装すれば
SwingでいうところのModelとRendererと同様のことが可能です。


やはり、GUIフレームワークはシンプルで軽い実装の方がいいですね。