リストボックスを作成する場合、実際に画面上に表示される
文字列とは別に内部的な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のフレームワークはシンプルで軽い実装の方がいいですね。