本サイトは、SWTとJFaceについての情報を取り扱います。 2008年現在、SWTプログラミングをすることができる最低限の情報は記述してあります。 目標は、最初から最後まで一貫した情報を載せることです。
SWTとは、Standard Widget Toolkitの略で、JavaでGUIプログラミングを行うためのAPI群です。 このAPI群を使うと、Javaでもシステム関数を呼び出して記述したアプリケーションと同じような、 Swingよりはるかによい見栄えのアプリケーションを作成することが可能となります。
つまり、C言語で記述したアプリケーションと、見栄えにおいては全く同じ(引けをとらない)ということになります。 Windows上で実行すればWindows APIを使ってプログラミングを行った見栄えとなります。 それだけではなく、Mac OSやX Window System上で実行すれば、それらの環境の見栄えとなります。
こちらはSwingのサンプルです。 タイトルがJava Servletとかついているのはちょっとした間違いです。気にしないで下さい(ぉぃ)。

そしてこれがSWTのサンプルです。

もともとSWT/JFaceは、Eclipseと、そのプラグインを作成するためのライブラリとして作成されましたが、 それ単体で動作するアプリケーションの作成にも問題なく適用することが可能です(私はこちらを目的として学習しました)。 本サイトでは、以降、SWT APIとJFace APIをまとめて単にSWTと呼びます (その他「SWTプログラミング」、SWTとJFaceどちらも登場してややこしい場合には「Eclipse API」などの言い回しもあります)。
AppletやSwing等のSwingライブラリ(軽量コンポーネントと言われている)では、ボタンやその他のアイテムの作成の処理の大部分をJava VM上で行っていました。 そのため、Javaの特性上、どうしても処理速度に問題を感じられてしまったり、 また、見栄えもあまりいいものとはいえません。(VMの速度が改善されるにつれて、速度の問題は解決される可能性がある)
しかしSWT(重量コンポーネントの呼び出しと言われている)では、Javaからそのマシンのシステムコールを行います
(Windows 32ビットOSであればWin 32 APIを呼び出します)。
その結果、
C言語やDelphiやVisualBasic等でGUIプログラミングをすると得られる見栄えを手に入れることができるだけでなく、
Java VM上で描画するよりもはるかに速い描画処理を行うことができます。
システムコールはJNI(Java Native Interface)という技術で成り立っており、
SWTの仕事もこのインターフェイスを通して行われます。
ここでの軽量コンポーネント(lightweight)や重量コンポーネント(heavyweight)は、プログラマへの負担や、その仕様の変更の容易さを指します。
重量コンポーネントはシステムのより深い部分で生成されるコンポーネントであり、
軽量コンポーネントは比較的上位層のプログラムで生成されるコンポーネントだと思って下さい。
SWTはシンプルさを第一に考えて設計されており、 さほどオブジェクティブで便利な設計ではありません (メッセージループ等は、普通にWindows API等を呼び出したプログラムに似たものを持ちます)。 それを オブジェクティブにラップしたのがJFaceです(Facadeデザインに近いかな?)。 JFaceは、Javaのみで記述されており、SWTをラップするためのクラス群です。 JFaceは、生産性を高くすることを目的として作成されたため、 通常Eclipse APIによるプログラミングは、JFaceで機能が提供されていればJFaceで行い、 JFaceに提供されていないような部分についてはSWTで行います。
SWTとJFaceが行う仕事は、お互いに重複しています。 例えばメニューを表示したいときでも、SWTにメニューの表示のAPIが、JFaceにもメニュー表示のAPIが用意されています。 JFaceによるメニュー表示では、構造的で効率的なプログラムを作成することが可能なのに対して、 SWTによるメニュー表示では、JFaceよりも細部をプログラマが決定することが可能です。 このことは、学び始めでは、SWTとJFaceのどちらを採用するのか混乱の元になるかもしれませんが、 プログラミングのシチュエーションによって両者を使い分けることで、仕事の効率が向上します。 このお互いの関係は、C言語(比較的高水準な立場)のプログラミングにおいて、 必要な部分をアセンブラ言語(比較的低水準な立場)で記述することに似ているかもしれません。 というわけでSWTの技術を使って実用的な開発を行いたいならば、SWTとJFaceのどちらも覚える必要があります。 ここでは、どちらについても情報を提供しています。
SWTにできることは、JNIを通したGUIプログラミングにおけるシステムコールです。 SWTには、多彩なウィンドウやグラフィックス描画の機能に加え、 クリップボードの利用等、プロセスを超えた影響を及ぼすような機能もありますが、 SWTで提供されている機能では、 グローバルフック等の、かなり低水準な処理はできない ようです。 このような提供されていない機能を実現するためには、自前でJNIを利用したAPI等を作成するか、 C言語等、Java以外の言語で記述したプログラムを、JNIを通して呼び出すしかありません (どちらの手段でも、JNIは不可欠)。
学習をする上でとても気になるのが、学習対象の未来です。 未来のないものを学習しても意味にならないので、この点がはっきりしていないと、学習する気にもなれません。
SwingはJavaのスタンダードな(として定められた)GUI APIとなっており、 スタンダードというのはほぼ未来が約束されています (しかし設計が悪い等の指摘が存在するので、今後メジャーチェンジをしないともいいきれない)。 現に、Swingは広く普及しています。
Swingがいかに普及しているといえど、 SWTの目指すゴールはSwingとは全く別物なので、用途によってSWTとSwingは使い分ける必要があります。 例えば、統一したグラフィックにこだわりたいならばSwingを選択し、 速度、見栄えにこだわるのならば、SWTを選択します。
SWTと競合するパッケージは今のところ出てきていないので、このままいけばSWTはますます使われるようになるのではと思っています。 また特定の企業が開発しているのではなく、無償の団体(Eclipseコンソーシアム)が活発に議論・開発しているので、 倒産や採算性の考慮による開発打ち切りの可能性も低いため、その点でも安心です。
SWTやJFace等の説明には、よくSwingと対比させて説明をされることが多いですが、 ここではそのようなことは行いません。 Swingと対比させることで、確かにSwingを理解している人にとっては理解しやすい例えになるかもしれませんが、 Swingを知らない人にとっては、ただの混乱の元です。 それになにより、Swingの深い知識が、私にはないからです。
Swingを熟知していないのでなんとも言えないですが、 Swingはjava.awtパッケージの部品を継承(やや無理矢理再利用)していて、 構造がすごくややこしいですが、SWTはorg.eclipse.swtとして一から開発されたので、とてもシンプルになっていて、 Swingより幾分理解しやすいというのが私の意見です。
ただ、SWTの情報は新しいので、まだ情報が十分でないことが問題です。
2008年初め現在、日本語の書籍では、1冊か2冊くらいしか出ていないようです。
ただ、英語の書籍は結構出版されてきているので、その和訳版や要約版等が近いうちに出てくると思われます。
それまで待てない、あるいは本買いたくないという方は、私が当サイトに日本語で説明した情報を読むことも意義があると思います。
もう日本語の書籍も沢山出版されているようです。 書籍についてはSWT関連の書籍の紹介を参照して下さい。
PC関連ランキング: Googleのページランクを上げたいので、できましたら投票してやって下さいm(_ _)m
当サイトは、少し特殊な(独自の)管理ツールを使用していて、 トップページの位置は変更されませんが、その下の階層の位置は、 比較的簡単に変更できる(される)ようになっています。 なので、下のほうの階層のコンテンツのみをブックマークしていた場合、 時間が経過すると、そこにページが存在しなくなっている可能性があります。 その場合にはトップページから辿ることができるように、 トップページ(このページ)もブックマークしておくことをお奨めします。
原則として、当サイトのコンテンツの著作権は、著者KenjiNagaoに帰属します。 プログラムのソースコード等については、自由に使って頂いて構いません。 しかし当サイトでは、ただの簡単な改変や抜粋のコードも存在します。 そのようなものについては、改変元や抜粋元が書いてあります。 (改変元、抜粋元の著作権の扱いとその判断は、利用者の責任となります。)
また、当サイトを参照することによって発生したいかなる損害についても、著者KenjiNagaoは責任を負いません。 あらかじめご了承下さい。