SWTとJFace 第1回: やさしい紹介

単純なSWTアプリケーションを作る方法

SWTとJFace シリーズの第1回である今回は、単純なSWT(Standard Widget Toolkit)アプリケーションを、Java ™ やEclipse、そしてSWTライブラリーやJFaceライブラリーを使って作る方法を学びます。また、基本的なコントロールやレイアウトを使って、単純なSWT GUIを作る方法についても学びます。

Barry Feigenbaum, Ph.D., Programming Advisor, IBM

Barry Feigenbaum博士は、IBMアクセシビリティ・センターのメンバーです。そこで彼は、IBM製品を障害者にとってアクセシブルなものにするための作業を行うチームに属しています。Feigenbaum博士は、本や記事をいくつか出版しており、いくつかの特許を取り、JavaOneなどの業界で開催される会議で講演したことがあります。彼は、オースティンのテキサス大学で情報科学の非常勤助教授を務めています。



2005年 5月 03日

SWT(Standard Widget Toolkit)とJFaceライブラリーは、Eclipse環境用のGUI(graphical user interface)を開発するため、また、スタンドアローンのGUIネイティブ・アプリケーションを開発するために使われます。この記事では、基本的なタイプのSWT(基本GUIオブジェクトに対する名前)の幾つかを紹介し、それらを組み合わせて、実際に動作するアプリケーションを作る方法を説明します。

EclipseとSWT、そしてJFaceについて

EclipseのWebサイトにも書かれている通り、Eclipseは一種のツール・プラットフォームです。Eclipseは、特に限定されず何にでも使える、オープンな、拡張性を持ったIDEであり、ツール開発者はこれを利用することによって、彼らのソフトウェア技術を柔軟に制御できるようになります。

Eclipseは、表現力豊かなGUI駆動ツールやアプリケーションを開発するためのベースとなります。この機能の基礎となっているのが、EclipseのGUIライブラリー、SWTとJFaceです。

SWTは、ホストOS(オペレーティング・システム)のネイティブGUIコントロールの、Javaビューを作成するライブラリーです。SWTはホストの実装に依存します。つまりSWTベースのアプリケーションは、下記のように幾つかの重要な特徴を持っています。

  1. 「ネイティブ」アプリケーションのように見え、動作し、実行する。
  2. 提供されるウィジェットは、ホストOSに提供されるウィジェット(コンポーネントとコントロール)を反映する。
  3. ホストGUIライブラリーの特別な振る舞いは、すべてSWTのGUIに反映される。

こうした目標のために、SWTは、OSの違いを隠すように設計されているJava技術のSwingとは異なるのです。

SWTライブラリーは、ホストOSの基本ウィジェットを反映します。多くの場合、この手法では、あまりにも下位レベルです。JFaceライブラリーは、SWTアプリケーションに多くのサービスを追加することによって、これを補います。JFaceはSWTを隠さず、単に継承するのです。このシリーズの後の方で分かるように、この継承のうち最も重要なものは、アプリケーションのデータ・モデルを、そのデータ・モデルを表示、変更するGUIから分離する、という点です。

このシリーズについて

このシリーズ、SWTとJFace では、ベースとなるEclipseのSDK(software development kit)に付属するSWTとJFaceライブラリーを使ったアプリケーションの開発を解説します。このシリーズでは、スタンドアローンのアプリケーションに対してSWTとJFaceを使う場合に限定しますが、ここで学ぶものの大部分は、Eclipseワークベンチで使う場合にも応用することができます。

最初は、限定機能のGUIから始め、次第に、使い道の広いアプリケーションに進みます。標準的、あるいはカスタムのSWTウィジェットと共に、JFace機能の多くについても紹介します。議論の中では、これらの技術の使用例を、少なくとも1つは含むようにします。

このシリーズは、Java言語やJavaベースの開発に慣れており、またJava AWTやSwing GUIツールキットを、ある程度理解している人を対象にしています。

始める前にまず、SWTの用語を少し紹介する必要があるでしょう。

  • ウィジェット -- 基本的なSWT GUIコンポーネント(Java AWTでのComponentや、SwingでのJComponentと同じ)です。ウィジェットは抽象クラスです。
  • コントロール -- OSの中に、対等機能を持つウィジェット(言い換えると、OSの中でID(identity)を持つもの)です。コントロールは抽象クラスです。
  • コンポジット -- 他のコントロールを含むことができるコントロール(Java AWTでのContainerや、SwingでのJPanelと同じ)です。
  • アイテム -- リストやテーブルなど、他のコントロール(コンポジットではない場合もあります)に含まれるウィジェットです。アイテムを含むコントロールがコントロールも同時に含むことは稀であり、逆も同じです。アイテムは抽象クラスです。

こうしたウィジェットは、継承の階層の中に配置されます。図1、図2、図3を見ると、これが分かるでしょう。図2の、Basic1クラスは、この記事用のクラスですが、他のクラスは全て、標準のSWTウィジェットです。

図1. SWTウィジェット・ツリー
図1. SWTウィジェット・ツリー
図2. SWTコンポジット・ツリー
図2. SWTコンポジット・ツリー
図3. SWTアイテム・リスト
図3. SWTアイテム・リスト

SWTとJFaceをインストールする

EclipseのWebサイトについては、 参考文献 を見てください。Eclipseをインストールし、プログラムの中でSWTライブラリーを使えるようにするためには、次のようにします。

  1. EclipseのホームページからDownloadsを選択し、次に自分のプラットフォームに合ったバージョンのEclipseを選択します。関連したZIPファイルをダウンロードします。
  2. ZIPファイルを、最上位レベルのディレクトリーの中で解凍します。(ディレクトリー名には「EclipseX.Y.Z」のようなものをお勧めします。ここでX.Y.Zは、選択したEclipseのバージョンです。)
  3. DIR コマンド、あるいは検索を利用してswt.jarファイルを見つけ、それを CLASSPATH に置きます(あるいは、 java -cp コマンドに使います)。
  4. 同様に、全てのSWT-*.DLLファイルも見つけ、それらにアクセスできるようにします(これらのファイルが入っているディレクトリーを PATH に置くか、あるいは既に PATH にあるディレクトリーにDLLファイルをコピーします)。

他のプラットフォームでも同じようなステップが必要です。

Eclipseはクロス・プラットフォームです(多くのOS上で実行します)が、この記事の内容は、Microsoft ® Windows ® 版のEclipseに基づいていることに注意してください。ただし、この記事で挙げている例はどれも、変更しなくても他のプラットフォームで動作するはずです。また、この記事はEclipse V3.0に基づいていることにも注意してください。Eclipse V3.1では、幾つかのGUIウィジェット・タイプや機能が追加されています。

基本的なコントロール

SWT GUIはほとんどすべて、幾つかの基本部分から作られます。SWTウィジェットはすべて、 org.eclipse.swt.widgets パッケージ、あるいは org.eclipse.swt.custom パッケージの中にあります。(幾つかのEclipseプラグインでは、別パッケージとしてカスタム・ウィジェットも提供しています。)ウィジェット・パッケージには、OSのコントロールに基づくコントロールが含まれていますが、カスタム・パッケージには、OSのコントロール・セット以上に拡張したコントロールが含まれています。一部のカスタム・パッケージのコントロールは、ウィジェット・パッケージの中にあるコントロールと似ています。名前の衝突を避けるために、カスタム・コントロールの名前は、「C」で始まるようになっています(例えばLabelに対してCLableなど)。

SWTでは、すべてのコントロールは(後で議論する、シェルのような最上位レベルのコントロールを除いて)、作る際に、親コントロール(コンポジット・インスタンス)を持つ必要があります。コントロールは(明示的に追加する必要のあるAWT/Swingとは異なり)、作られると自動的に、親に「追加」されます。つまり、GUIの構成は、「トップダウン」で行われるのです。従って、すべてのコントロールはコンストラクターへの引数として、コンポジットの親(またはサブクラス)をとります。

大部分のコントロールにはフラグ・オプションがあり、コントロールを作った時に設定する必要があります。従って、大部分のコントロールには、(よく、スタイルと呼ばれる)2番目のコンストラクター引数があり、こうしたオプションを設定するためのフラグを提供します。全てのフラグ値は static final int であり、 org.eclipse.swt パッケージの SWT クラスの中で定義されます。オプションが必要無い場合には、値として SWT.NONE を使います。


ラベル

ラベルは恐らく最も単純なコントロールですが、プレーンな(つまり色や特別なフォント、またはスタイルを持たない)テキストや、アイコンと呼ばれる小さな画像を表示するために使われます。ラベルはフォーカスを受けることがありません(つまりユーザーは、タブ・キーやマウスでラベルに行くことができません)。従って、入力イベントを生成しません。

リスト1は、単純なテキスト・ラベルの作り方を示しています。

リスト1.  テキスト・ラベルを作る
import org.eclipse.swt.widgets.*; : Composite parent =
...; : // create a center aligned label Label label =
new Label(parent, SWT.CENTER); label.setText("This
is the label text");

テキストは、コンストラクターとは別のメソッドの中で設定されていることに注意してください。これは、SWTのコントロールでは典型的なことです。コンストラクターでは、親とスタイルのみが設定され、他のプロパティーはすべて、作られたオブジェクト上で設定されます。

プラットフォームの制限から、標準のラベル・コントロールはテキストとアイコンの両方を持つことはできません。両方を一緒にサポートするためには、リスト2に示すようなCLabelコントロールを使います。

リスト2. テキストと画像を持つラベルを作る
import com.eclipse.swt.graphics.*; import
org.eclipse.swt.widgets.*; import
org.eclipse.swt.custom.*; : Composite parent = ...;
Image image = ...; : // create a left aligned label with
an icon CLabel Clabel = new CLabel(parent, SWT.LEFT);
label.setText("This is the imaged label
text""); label.setImage(image);

テキスト

ラベルはテキストを示すものですが、ユーザーがテキストを入力できるようにしたい場合がよくあります。テキスト・コントロールは、このために使います。テキストは1行(テキスト・フィールド)でも、複数(テキスト領域)でも可能です。テキストは読み取り専用にすることもできます。テキスト・フィールドには記述が無いため、多くの場合、その目的を識別するためのラベル・コントロールが前に付きます。テキスト・コントロールは、その使い方についての情報を提供する「ツール・ヒント」を持つこともできます(全てのコントロールが、この機能をサポートしています)。

リスト3は、許される文字数に対する制限を持った、単純なテキスト・フィールドの作り方を示しています。簡単に削除できるように、デフォルトのテキストが選択されています。

リスト3. デフォルトのテキストが選択され、制限を持ったテキストを作る
import org.eclipse.swt.widgets.*;
:
Composite parent = ...;
:
// create a text field
Text name = new Text(parent, SWT.SINGLE);  
name.setText("<none>");
name.setTextLimit(50);
name.setToolTipText("Enter your name -- Last, First"); 
name.selectAll();  // enable fast erase

ボタン

アクションがいつ起きるべきかを、ユーザーが示すようにしたいことがよくあります。このために最も一般的な方法としては、ボタン・コントロールを使う方法です。ボタンには、下記のような幾つかのスタイルがあります。

  • ARROW -- 上向き、下向き、左向き、あるいは右向きの矢印として表示します
  • CHECK -- ラベルの付いたチェック記号
  • FLAT -- 立体的に見えない、平面的な押しボタン
  • PUSH -- (離すと状態を保持しない)瞬時動作の押しボタン(最も一般的なイベント・ソース)
  • RADIO -- 同じグループ内の他のラジオボタンと排他的な、(離しても状態を保持する)記号
  • TOGGLE -- 離しても状態を保持する押しボタン

リスト4は、「Clear」という押しボタン(push button)を作ります。

リスト4. ボタンを作る
import org.eclipse.swt.widgets.*;
:
Composite parent = ...;
:
// create a push button
Button clear = new Button(parent, SWT.PUSH);  
clear.setText("Clea&r");

名前の中にある & によって、Ctrl+<文字>のシーケンスでCtrlの次に押すべき文字を使って、アクセラレーターが作られます(このコントロール・シーケンスはOS依存です)。

イベント・リスナー

ボタンが選択された時(特にpushタイプの場合)には、何かの動作をしたいことがよくあります。そのためには、ボタンに、( org.eclipse.swt.events パッケージにある) SelectionListener を追加します。ボタンの状態が変化すると(通常はボタンが押された場合)、イベントが生成されます。リスト5は、Clearボタンがクリックされた時にメッセージを出力します。

リスト5. ボタン・イベント・ハンドラー
import org.eclipse.swt.events.*;
:
// Clear button pressed event handler
clear.addSelectionListener(new SelectionListener() { public void widgetSelected(selectionEvent e) {
System.out.println("Clear pressed!");   }
public void widgetDefaultSelected(selectionEvent e) {
widgetSelected(e);
}
});

このコードは匿名内部クラスを使っていますが、名前付きの内部クラスや、独立のクラスをリスナーとして使うこともできます。2つ、またはそれ以上のメソッドを含む大部分の ...Listener クラスは、メソッドの空実装を提供する、並列の ...Adapter クラスも持っているため、書くべきコードの量を減らすことができます。例えば、 SelectionAdapter を実装する SelectionListener クラスもあるのです。

こうしたメソッドで取られるアクションは、即座に(通常は1秒以下で)起きないと、GUIの応答が遅くなることに注意してください。ファイル・アクセスを行うような長いアクションには別スレッドが必要ですが、これは今後の記事で取り上げるべき話題です。


コンポジット

ここまでは、個々のコントロールに関して説明しました。GUIでは普通、ユーザーに対する見栄えを良くするために、複数のコントロールを一緒にまとめています。このグループ化をSWTで行うには、コンポジット・クラスを使います。

コンポジットは、任意のレベルにまでネストでき、コントロールやコンポジットを、子として取り混ぜることができます。これによってGUI開発の複雑さが大幅に緩和され、(内部GUIをカプセル化することによって)GUIコードが再利用しやすくなります。コンポジットは、視覚的に区別しやすいように境界を持つこともでき、あるいは、より大きなグループに継ぎ目なく統合するために、境界無しにすることもできます。

リスト6は、境界付きのコンポジットを作ります。

リスト6.  境界付きのコンポジットを作る
import org.eclipse.swt.widgets.*;
:
Composite parent = ...;
:
Composite border = new Composite(parent, SWT.BORDER);

境界の他に、グループというコンポジット・サブクラスは、タイトルをサポートします。グループは多くの場合、(相互排他的なボタン・セットを定義する)ラジオタイプのボタンを含めるために使います。

リスト7は境界付きのグループを作ります。

リスト7. 境界付きのグループを作る
import org.eclipse.swt.widgets.*;
:
Composite parent = ...;
:
Group border = new Group(parent, SWT.SHADOW_OUT);
border.setText("Group Description");

シェル

シェルは最上位レベルのコンポジット(フレームまたはウィンドウ)であり、普通は親コンポジットを持ちませんが、代わりに、通常はデフォルトで設定される、ディスプレイを親として持ちます。シェルには数多くのタイプがありますが、一番一般的なのは、 SWT.SHELL_TRIM 、あるいは SWT.DIALOG_TRIM です。シェルは、モーダル(modal)であったり、モデルレス(modeless)であったりする場合があります。モーダル・シェルはダイアログ用に最も一般的に使われますが、(もし親GUIがある場合には)親GUIが、子シェルが閉じられるまで先に進まないようにします。

リスト8は、最上位レベルの非モーダル・シェルをフレーム・スタイルで作ります。

リスト8. 最上位レベルのシェルを作る
import org.eclipse.swt.widgets.*;
:
Shell frame = new Shell(SWT.SHELL_TRIM);
:

シェルは、子シェルを持つことができます。これらは、親シェルに関連付けられた、独立のデスクトップ・ウィンドウです(つまり、親が閉じられると、全ての子も閉じられます)。

リスト9は子シェルを、ダイアログ・スタイルで作ります。

リスト9. ダイアログ・シェルを作る
:
Shell dialog = new Shell(frame, SWT.DIALOG_TRIM);
:

図4の、SWT.SHELL_TRIMを持つシェルと、図5のSWT.DIALOG_TRIMを持つシェルを見ると、これらの値がシェルの整形にどう影響するかが分かるでしょう。

図4.  SWT.SHELL_TRIMを持つシェル
図4.  SWT.SHELL_TRIMを持つシェル
図5.  SWT.DIALOG_TRIMを持つシェル
図5.  SWT.DIALOG_TRIMを持つシェル

レイアウト・マネージャー

コンポジットには、1つ以上のコントロールを含む場合がよくあります。これらのコントロールは、次のような2つの方法で配置することができます。

  1. 絶対配置(absolute positioning) -- 各コントロールは、皆さんのコードで、明示的なXY位置と幅、高さに設定されます。
  2. 管理配置(managed positioning) -- 各コントロールのXY、幅、高さは、LayoutManagerが設定します。

ほとんどの場合は、可変サイズのGUIに合わせ込むことが容易なことから、皆さんはLayoutManagersを使う方を選ぶでしょう。SWTには、幾つかのレイアウト・マネージャーが用意されています。今回の記事では、より基本的な2つ、FillLayoutとGridLayoutについて説明しましょう。どちらの場合も、包含するコンポジットがサイズ変更される時には、必ず配置が行われます。

レイアウト・マネージャーは、コンポジットに対して固有に割り当てられます。一部のレイアウト・マネージャーは、レイアウト・マネージャー自身にあるパラメーターだけでコントロールされますが、レイアウト・マネージャーが管理するコンポジットの各コントロールで規定される、LayoutDataという追加パラメーターを必要とするレイアウト・マネージャーもあります。

FillLayout

FillLayoutは、行あるいはカラムにコントロールを配置します。各コントロールは、コンポジットを満たすに必要なだけ広く、あるいは高くサイズ変更され、空白はコントロール間で均等に分割されます。特別な場合として、子コントロールが1つしかない場合には、コントロールは親コンポジット全体を満たすようにサイズ変更されます。

リスト10は、カラムにFillLayoutを使ってコンポジットを作ります。

リスト10. FillLayoutを使ってコントロールのカラムを作る
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layouts.*;
:
Composite composite = ...;
FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
composite.setLayout(fillLayout);

GridLayout

GridLayoutはHTMLのテーブルに似た、より強力なレイアウト機能があり、2次元のセル格子を作ります。コントロールは、1つまたはそれ以上のセル(セル・スパン(cell spanning)と呼ばれます)に置くことができます。セルのサイズは均一にすることもできれば、格子の幅と高さを元に適当な割合に設定したサイズにすることもできます。コントロールは、行の中で、次に利用できるカラムに追加されます。最後のカラムにまで行くと、コントロールは次の行の最初のカラムに移ります。

リスト11は、2つのラベル付きテキスト・フィールドを含んだ2つのカラムと、2つの行を持つコンポジットを作ります。各カラムは、別々の幅を持つことができます。

リスト11.コントロールのテーブルを作る
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layouts.*;
:
Composite composite = ...;
GridLayout gridLayout = new GridLayout(2, false);
composite.setLayout(gridLayout);
Label l1 = new Label(composite, SWT.LEFT);
l1.settext("First Name: ");
Text first = new Text(composite, SWT.SINGLE);
Label l1 = new Label(composite, SWT.LEFT);
l2.setText("Last Name: ");
Text last = new Text(composite, SWT.SINGLE);

GridData

各コントロールに対して、セル内の余分な空白の使い方を規定する必要がある、と考えてみてください。各セルに対してこうした細かなコントロールをするために、GridLayoutが管理するコンポジットに追加されたコントロールは、GridData(LayoutDataサブクラス)のインスタンスを持つことができます。

リスト12は、(先のリストに基づいて、)テキスト・フィールドが、余っている空白すべてに拡張されるように設定しています。

リスト12.  余っている空白すべてに拡張されるようにレイアウトを構成する
first.setLayoutData(new GridData(SWT.FILL, SWT.FILL,
true, true)); last.setLayoutData(new GridData(SWT.FILL,
SWT.FILL, true, true));

実際に動作するプログラムを構築する

さて、これまで議論したSWTコントロールすべてを使った、単純な実行可能プログラム例、Basic1を見てみましょう。このアプリケーションの完全なソースについては、 参考文献 を見てください。

SWTのGUIには、コンフィギュレーションされた実行環境が必要です。この環境は、ホストOSの表示デバイスにアクセスするための表示インスタンスによって提供されます。この表示によって、GUIを駆動する各ユーザー入力(マウスまたはキーボード)を処理できるようになります。

リスト13は、環境を作り、GUIを作り、そしてそれを表示します。

リスト13. GUIアプリケーションを作って起動する
import org.eclipse.swt.widgets.*;
:
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Shell Title");
// *** construct Shell children here ***
shell.open();       // open shell for user access
// process all user input events
while(!shell.isDisposed()) {
// process the next event, wait when none available
if(!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();  // must always clean up

このコードによって、図6のようなウィンドウができます。

図6. アプケーションの例
図6. アプケーションの例

まとめ

SWTとJFace シリーズ第1回の今回は、ラベルやテキスト、ボタン、コンポジット、シェルなど、最も基本的なSWTウィジェット・コントロールを紹介しました。こうしたコントロールを表示クラスと組み合わせることによって、完全機能のGUIを作ることができます。

このシリーズ第2回では、メニューの作り方、追加入力コントロールの使い方や、リストやツリー、テーブルなどの情報表示コントロールの使い方を説明します。


ダウンロード

内容ファイル名サイズ
Basic1 Java sourceos-jface1Basic1.java6.4KB

参考文献

  • スタンドアロン・モードでJFaceおよびSWTを使用する 」(developerWorks, 2003年1月)は、幾つかの主なJFaceクラス(そしてSWTウィジェットの幾つか)と共に、ヒントやトリック、設計上の問題点などを紹介しています。
  • Java開発に関する情報を探すための手始めとして、 Sun Microsystems Web site が好適です。ニュースやフォーラム、技術記事やダウンロードへのリンクがあります。
  • Sunによる Java Foundation Classes (JFC/Swing) には、ダウンロードや技術情報、ハウツー記事、JFC/Swingに関するニュース等へのリンクがあります。
  • Sunによる Swing Connection は、Swingに関心を持つ人達のために、ニュースや更新情報を提供しています。
  • Sunは、 Javaユーザー のためのWebサイトを提供しています。ここにはゲームやプレビューの他、Java技術の紹介、ダウンロードなどがあります。
  • Eclipse In Action: A Guide for Java Developers (2003年Independent Publishers Group刊)はEclipseを使うJava開発者にとって、必読の書です。
  • developerWorksの Eclipse columns を覗いてみてください。
  • アプリケーション開発用のオープンソースIDEである、 Eclipse の最新版を入手してください。
  • Eclipse discussion forum で、この記事に関する疑問や意見を他の読者と交換してください。
  • Eclipseについてさらに学ぶために、 eclipse.org を見てください。技術資料やハウツー記事、教育資料、ダウンロード、製品情報、その他豊富な資料があります。
  • developerWorksの Open source zone を見てください。幅広いハウツー情報、ツール、プロジェクトの更新情報などが用意されており、オープンソース技術を利用しての開発や、IBM製品でオープンソース技術を利用するために活用できます。
  • 皆さんの次期オープンソース開発プロジェクトを、 IBM trial software を使って革新してください。ダウンロード、あるいはDVDで入手可能です。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source, Java technology
ArticleID=237198
ArticleTitle=SWTとJFace 第1回: やさしい紹介
publish-date=05032005