Standard Widget Toolkit (SWT) は、移植可能な API および、 基礎となるネイティブ OS GUI プラットフォームとの緊密な統合を提供する Java 開発者向けのウィジェット・ツールキットです。
多数の低レベル UI プログラミング・タスクが、Eclipse プラットフォームの高位層で処理されます。 メニューおよびツールバーの内容は UI 組み込み用の plugin.xml マークアップで指定され、 SWT プログラミングは不要です。 JFace ビューアーおよびアクションは、アプリケーションとウィジェットの間の共通の操作に関するインプリメンテーションを提供します。 ただし、基本的な SWT アーキテクチャーおよび設計方針を理解することは、 プラットフォームのそれ以外の部分の仕組みを理解するために重要です。
ウィジェット・ツールキットの設計に関する一般的な問題点は、 移植可能なツールキットとプラットフォームの統合との間のバランスの取り方です。 Java AWT (Advanced Widget Toolkit) は、リスト、テキスト、ボタンなど、 低レベルのウィジェット用のプラットフォーム統合ウィジェットを提供しますが、 ツリーやリッチ・テキストなどの高レベルのプラットフォーム・コンポーネントへのアクセスは提供しません。 したがって、アプリケーション開発者は "共通項" となる状況で作業しなければなりません。 アプリケーション開発者が使用できるのは、すべてのプラットフォームで使用可能なウィジェットのみです。
Swing ツールキットは、ツリー、テーブル、テキストなど高レベルのウィジェットの非ネイティブなインプリメンテーションを提供して、 この問題の解決を図ります。 Swing ツールキットには多数の機能が組み込まれていますが、 Swing で開発されたアプリケーションは他のアプリケーションと明確に異なります。 プラットフォームのルック・アンド・フィール・エミュレーション・レイヤーによって、 アプリケーションはプラットフォームと類似した外観になりますが、ユーザーとの相互作用は明確に異なります。 したがって、エミュレートされたツールキットを使用して、 特定の OS プラットフォーム専用に開発されたアプリケーション・パッケージに匹敵するアプリケーションを構築することは困難です。
SWT はこの問題を解決するために、サポートされているすべてのプラットフォームで提供されている共通の移植可能 API を定義し、 ネイティブ ・ウィジェットを使用するプラットフォームごとにこの API をインプリメントしています (インプリメントできる場合)。 これにより、ツールキットはすべてのプラットフォームで一貫したプログラミング・モデルを維持しながら、 基礎となる OS GUI のルック・アンド・フィールに関するすべての変更を即座に反映することができます。
SWT は、"共通項"の問題をいくつかの方法で解決します。
プラットフォームとの統合は、厳密にはルック・アンド・フィールの問題ではありません。 緊密に統合されているのは、ドラッグ・アンド・ドロップなどネイティブのデスクトップ機能と相互作用したり、 OS デスクトップ・アプリケーションと統合したり、 Win32 ActiveX のような OS コンポーネント・モデルにより開発されたコンポーネントを使用する機能です。
SWT ActiveX のサポートについては、
「SWT での ActiveX のサポート」を参照してください。
また、ネイティブ OS の開発者になじみのあるインプリメンテーションを提供することによって、コード自体で一貫性を保つことができます。 SWT は、ネイティブ C コード内で OS の違いを隠したり、 移植可能および移植不可能なレイヤーを Java インプリメンテーション内に構築したりするのではなく、 プラットフォームごとに個別に、異なる Java のインプリメンテーションを提供します。
インプリメンテーションに関する最も重要な規則の 1 つは、 C のネイティブ・コードで OS に対する呼び出しを使用して 1 対 1 のマップを行うことです。 SWT ツールキットでは、C で使用されるシステム呼び出しに直接マップされるネイティブ・コードが使用されるため、 Windows プログラマーは SWT ツールキットが Windows にインプリメントされていることを直ちに認識できます。 "プラットフォーム・マジック" が C コード内に隠されることはありません。 プラットフォーム開発者は、コードを調べることにより、 ツールキットからどのプラットフォーム呼び出しが実行されているかを正確に知ることができます。 これにより、デバッグを大幅に単純化することができます。 ネイティブ・メソッドの呼び出し時にエラーが発生する場合は、 C コードから同じパラメーターを使用してプラットフォーム API を呼び出しても、同じエラーが発生します。 (この問題点の詳細については、 「Java ネイティブへの SWT のインプリメンテーション戦略」を 参照してください)。