SWT には高性能な機能が多く含まれていますが、 システムのコアの基本知識は、有益で堅固なアプリケーションをインプリメントするために必要な、 ウィジェット、レイアウト、およびイベントの 3 つです。
プラットフォーム・ワークベンチ拡張を使用して、UI エレメントを使用している場合、 SWT を開始させる操作は、ワークベンチにより処理されます。
SWT アプリケーションを最初から (ワークベンチ外で) 作成している場合は、 SWT のアプリケーション構造をさらに詳しく理解する必要があります。
典型的なスタンドアロン SWT アプリケーションは、以下のような構造になっています。
SWT セッションを表す ディスプレイ を 作成します。
アプリケーションのメインウィンドウとなる 1 つまたは複数の シェル を作成します。
シェル内で必要となる他のウィジェットを作成します。
ウィジェットのサイズおよびその他の必要な状態を初期化します。 処理する必要のあるウィジェット・イベントにリスナーを登録します。
シェル・ウィンドウを開きます。
終了条件 (通常、ユーザーがメインのシェル・ウィンドウを閉じるとき) が生じるまで、 イベント・ディスパッチング・ループを実行します。
ディスプレイを削除します。
以下のコードの部分的引用は、 org.eclipse.swt.examples.helloworld.HelloWorld2 アプリケーションを基に 作成したものです。このアプリケーションは、ストリング "Hello World," を表示するだけなので、 どのウィジェット・イベントにも登録する必要はありません。
public static void main (String [] args) {
Display display = new Display ();
Shell shell = new Shell (display);
Label label = new Label (shell, SWT.CENTER);
label.setText ("Hello_world");
label.setBounds (shell.getClientArea ());
shell.open ();
while (!shell.isDisposed ()) {
if (!display.readAndDispatch ()) display.sleep ();
}
display.dispose ();
}
ディスプレイ は、 SWT と基礎となるプラットフォームの GUI システムとの間の接続を表します。ディスプレイは、 主に、UI スレッドとその他のスレッド間のプラットフォーム・イベント・ループおよびコントロール通信の管理のために使用されます。 (UI スレッド化問題についての完全な説明は、 『クライアントに関するスレッド化の問題』を参照してください。)
ほとんどのアプリケーションでは、上記で使用したパターンに従うことができます。ウィンドウを作成する前にディスプレイを作成し、 シェルを閉じたときにディスプレイを削除しなければなりません。マルチスレッド・アプリケーションを設計していない限り、 ディスプレイについてこれ以上のことを考える必要はありません。
シェル は、 OS プラットフォーム・ウィンドウ・マネージャーにより管理される "ウィンドウ"です。 トップレベルのシェルは、ディスプレイの子として作成されるシェルです。これらのウィンドウは、 アプリケーションの使用中に、ユーザーが移動、サイズ変更、最小化、および最大化をするウィンドウです。 2 次シェルは、他のシェルの子として作成されるシェルです。これらのウィンドウは、 通常、ダイアログ・ウィンドウ、または別のウィンドウとの関連のみで存在する他の一過性ウィンドウとして使用されます。
トップレベル以外のすべてのウィジェットには親があります。トップレベルのシェルは親を持ちませんが、 それらはすべて特定のディスプレイ に 関連付けられて作成されます。このディスプレイには、getDisplay() を使用してアクセスすることができます。 他のすべてのウィジェットは、トップレベル・シェルの子孫 (直接的または間接的な) として作成されます。
コンポジット・ウィジェットは、子を持つことのできるウィジェットです。
アプリケーション・ウィンドウは、ルートがシェルであるウィジェット・ツリー、つまり、階層として考えることができます。 アプリケーションの複雑さによっては、シェルの子には 1 つ、またはいくつかの子があったり、 子のあるネストされたレイヤーのコンポジットがある可能性もあります。
アプリケーションがウィジェットを作成する場合、SWT は即時にその基礎となるプラットフォーム・ウィジェットを作成します。 これにより、基礎の OS ウィジェットが存在するかどうかによって異なる動作をするコードの必要がなくなります。 また、ウィジェットのデータの大部分を、ツールキットで複製するのではなく、 プラットフォーム・レイヤー内に保持することができます。したがって、ウィジェット・ライフ・サイクルのツールキットの概念は、 基礎の GUI システムの規則に準拠しなければなりません。
ほとんどの GUI プラットフォームでは、ウィジェット作成時に、親を指定する必要があります。SWT は、 ユーザーがツールキット・ウィジェットを作成するとすぐにプラットフォーム・ウィジェットを作成するため、 ウィジェットのコンストラクターに親ウィジェットが指定されていなければなりません。
ウィジェット・プロパティーには、ウィジェット作成時に OS によって設定され、後で変更できないものもあります。 たとえば、リストが単一または複数の選択であるか、スクロール・バーがあるかないかなどがあります。
これらのプロパティーはスタイルと呼ばれ、コンストラクターで設定しなければなりません。 すべてのウィジェットのコンストラクターは、 すべての希望スタイルのビット単位 OR を指定する int 引き数を取ります。 場合によっては、特定のスタイルはヒントと考えられます。 つまり、すべてのプラットフォームで使用可能ではないかもしれませんが、 そのスタイルをサポートしないプラットフォーム上では無視されます。
スタイルの定数は、共用静的フィールドとして SWT クラスに位置します。 ウィジェット・クラスごとに適用できる定数のリストは、 SWT の API 解説書に含まれています。
SWT の下に位置する OS プラットフォームには、OS リソースの明示的な割り振りと開放が必要です。SWT は、 ウィジェット・ツールキット内のプラットフォーム・アプリケーション構造を反映する SWT 設計哲学を保ちながら、 ユーザーが割り振った OS リソースを明示的に開放するよう要求します。SWT では、 特定のツールキット・オブジェクトと関連するリソースを開放するために dispose() メソッドが使用されます。
経験法則から、オブジェクトを作成すると、それを削除しなければなりません。 以下に、この哲学を詳しく説明する特定の基本規則を示します。
コンストラクターを使用してウィジェットまたはグラフィック・オブジェクトを作成した場合、 使用し終わったときに、それを手動で削除しなければなりません。
コンストラクターを使用せずにウィジェットまたはグラフィック・オブジェクトを作成した場合は、 それを割り振らなかったため、手動で削除してはいけません。
ウィジェットやグラフィック・オブジェクトへの参照を他のオブジェクトへ渡す場合は、 まだ使用されているときに削除しないよう注意しなければなりません。 (この実地規則は、 既に『イメージを使用するためのプラグイン・パターン』 の項目で 学習したものです。)
ユーザーが シェル を閉じると、 シェルおよびそのすべての子ウィジェットが再帰的に削除されます。この場合、ウィジェット自体を削除する必要はありません。 ただし、それらのウィジェットと関連付けて割り振ったグラフィックス・リソースを開放しなければなりません。
ウィジェットのライフ・タイム中に使用するためにグラフィック・オブジェクトを作成した場合は、 そのウィジェットが削除されるときに、そのグラフィック・オブジェクトを削除しなければなりません。 これを行うには、ウィジェットに削除リスナーを登録し、dispose イベントを受け取ったときに グラフィック・オブジェクトを開放します。
これらの規則には例外が 1 つあります。 Rectangle および Point などの 単純なデータ・オブジェクトは、オペレーティング・システムのリソースを使用しません。 これらは、 dispose() メソッドを持たないため、開放しなくても構いません。 不明確な場合は、特定クラスの javadoc を参照してください。