Standard Widget Toolkit (SWT )は、Javaプラットフォーム 用 よう ウィジェット・ツールキット の一種 いっしゅ 。元々 もともと 、IBM が開発 かいはつ したが、現在 げんざい はEclipse Foundation がEclipse と共 とも に管理 かんり 保守 ほしゅ している。サン・マイクロシステムズ がJava 標準 ひょうじゅん の一環 いっかん として提供 ていきょう するJava用 よう GUI ツールキットであるAWT とSwing を代替 だいたい するものとして開発 かいはつ された。
SWTはJavaで書 か かれている。GUI部品 ぶひん を表示 ひょうじ するため、SWTはそのオペレーティングシステム (OS) が提供 ていきょう するGUIライブラリ を JNI (Java Native Interface ) 経由 けいゆ で使用 しよう する(これはシステム固有 こゆう のAPI を使 つか う一般 いっぱん 的 てき 手法 しゅほう である)。SWTを使 つか うプログラム は移植 いしょく 性 せい があるが、ツールキット自体 じたい の実装 じっそう はJavaでかかれているにもかかわらず、各 かく プラットフォーム固有 こゆう である。
SWTはEclipse Public License でライセンスされている。このライセンスはOpen Source Initiative がオープンソース ライセンスとして認 みと めている[ 1] 。
最初 さいしょ のJava用 よう GUIツールキットは、AWT (Abstract Window Toolkit ) であり、サンのJava標準 ひょうじゅん の一部 いちぶ としてJDK 1.0 で登場 とうじょう した。AWTは比較的 ひかくてき 単純 たんじゅん であり、OSが提供 ていきょう するネイティブなオブジェクト をJavaコードで包 つつ み、メニューやボタンといったGUI部品 ぶひん を生成 せいせい する。AWTはネイティブウィジェット ラッパーとしては非常 ひじょう に薄 うす く、プラットフォーム固有 こゆう のコードが開発 かいはつ 者 しゃ に透 す けて見 み え、バグやOS固有 こゆう の癖 くせ がそのままさらけ出 だ されているため、異 こと なるプラットフォーム間 あいだ で移植 いしょく 性 せい のあるアプリケーションを作成 さくせい するには限界 げんかい があった。
Swing は第 だい 二 に 世代 せだい のツールキットで、サンがJ2SE 1.2で導入 どうにゅう した。AWT よりもオブジェクト指向 しこう 的 てき である。SwingのGUI部品 ぶひん は 100% Java であり、ネイティブコードは使 つか っていない。ネイティブAPIをラップする代 か わりに、Swingは低 てい レベルなOSルーチンを使 つか ってGUI部品 ぶひん を自前 じまえ で描画 びょうが する。
そのころ、IBM はSmalltalk を使 つか った統合 とうごう 開発 かいはつ 環境 かんきょう (IDE) であるVisualAge を開発 かいはつ していた。これをオープンソースとして公開 こうかい することに決 き め、それがEclipseの開発 かいはつ へと繋 つな がっていった。EclipseはMicrosoft Visual Studio のようなIDEとも競合 きょうごう できるものとすることを目的 もくてき としていた。EclipseはJavaで書 か かれており、IBMの開発 かいはつ 者 しゃ らは「ネイティブのルック・アンド・フィール 」と「ネイティブの性能 せいのう 」を持 も ったツールキットが必要 ひつよう と考 かんが え、Swingを置換 ちかん するものとしてSWTを開発 かいはつ した。
SWTは、GTK オブジェクトやMotif オブジェクトなど、ネイティブのコードオブジェクトのラッパーである。そのため、SWTウィジェットは「重 おも い」ネイティブオブジェクトに軽 かる いJavaラッパーをかぶせたようなイメージで「重 おも い」と言 い われることが多 おお い。SWTが必要 ひつよう とする機能 きのう をネイティブのGUIライブラリ が持 も っていない場合 ばあい 、SWTはSwingのように独自 どくじ のGUIコードをJavaで実装 じっそう している。SWTは本質 ほんしつ 的 てき には、AWTの性能 せいのう やルック・アンド・フィールとSwingのそれとの中間 ちゅうかん にあると言 い える。
Eclipse Foundationによれば、SWTとSwingは目標 もくひょう の異 こと なる異 こと なったツールである。SWTの目的 もくてき は、各種 かくしゅ プラットフォームのネイティブウィジェットにアクセスできる共通 きょうつう APIを提供 ていきょう することである。設計 せっけい 目標 もくひょう の第 だい 一 いち は高性能 こうせいのう なネイティブのルック・アンド・フィールとプラットフォーム統合 とうごう の達成 たっせい である。一方 いっぽう Swingは高度 こうど にカスタマイズ可能 かのう で全 ぜん プラットフォームに共通 きょうつう なルック・アンド・フィールの提供 ていきょう にある。
SWTはSwingに比較 ひかく すると単純 たんじゅん なツールキットであり、標準 ひょうじゅん 的 てき な開発 かいはつ に無関係 むかんけい の機能 きのう はあまり存在 そんざい しない[ 2] 。このため、SWTがSwingに比 くら べて機能 きのう が少 すく ないと批判 ひはん する人 ひと もいる[ 3] 。
Javaの設計 せっけい 者 しゃ であるジェームズ・ゴスリン は、SWTが単純 たんじゅん すぎ、AWTと同 おな じ理由 りゆう で新 あら たなプラットフォームへの移植 いしょく が難 むずか しいと主張 しゅちょう した。単純 たんじゅん すぎ、低 てい レベルすぎ、Win32 GUI APIと結 むす びつきすぎているため、Motif やOS X Carbonといった他 ほか のGUIツールキットへの対応 たいおう が難 むずか しいとした[ 2] 。
developer.comにてMauro Marinilliaは「SWTはSwingに比較 ひかく すると単純 たんじゅん すぎるように見 み える。Swingは多 おお くの洗練 せんれん された機能 きのう を持 も っているから(例 たと えば、精巧 せいこう なSwingクラス階層 かいそう 、交換 こうかん 可能 かのう なルック・アンド・フィール、Model View Controller 手法 しゅほう など)」と主張 しゅちょう した。これに対 たい して、Model View Controllerのような複雑 ふくざつ な問題 もんだい に一種 いっしゅ の強制 きょうせい 的 てき な正 ただ しい手法 しゅほう を適用 てきよう することは良 よ いことだと思 おも う人 ひと もいるだろう。Marinilliaはさらに「(SWTと比較 ひかく して)Swingの提供 ていきょう する機能 きのう は豊富 ほうふ で洗練 せんれん されており、抽象 ちゅうしょう 化 か レベルが高 たか い(そのため、特製 とくせい のGUI部品 ぶひん で複雑 ふくざつ なGUIを構築 こうちく するのが容易 ようい である)」と続 つづ け、「一般 いっぱん にSWTはとっつきやすいが、複雑 ふくざつ なGUIをそれで構築 こうちく しようとすると、Swingの方 ほう がより柔軟 じゅうなん で容易 ようい な結果 けっか を生 う む」とした[要 よう 出典 しゅってん ] 。
SWTは Swing その他 た の高 こう レベルなGUIツールキットが提供 ていきょう する Model View Controller アーキテクチャを実装 じっそう していないが、Eclipse プロジェクトの1つとして開発 かいはつ された JFace ライブラリがプラットフォームに依存 いぞん しない高度 こうど な Model View Controller をSWT上 じょう に実装 じっそう している。開発 かいはつ 者 しゃ は、ツリー/テーブル/リストのような複雑 ふくざつ なSWTコントロールについて、JFaceが提供 ていきょう する柔軟 じゅうなん な抽象 ちゅうしょう データモデルを使 つか うこともできるし、SWTのコントロールを直接 ちょくせつ 使 つか うこともできる。
SWTは「高性能 こうせいのう 」GUIツールキットとして、Swingよりもシステムリソースを浪費 ろうひ しないよう設計 せっけい された[ 4] 。SWTとSwingのベンチマーク 比較 ひかく がいくつか行 おこな われ、SWTがSwingより効率 こうりつ がよいことが示 しめ されている。しかし、ベンチマークに使 つか われたアプリケーションはそれほど複雑 ふくざつ ではなく、SWTが常 つね にSwingより性能 せいのう が良 よ いとは言 い えない[ 5] 。
SWTウィジェットは、ネイティブウィジェットと同 おな じルック・アンド・フィール を提供 ていきょう する。これとは対照 たいしょう 的 てき に、Swingのウィジェットはネイティブウィジェットに近 ちか い複製 ふくせい である。場合 ばあい によっては、この違 ちが いが見 み た目 め にも明 あき らかとなる。例 たと えば、Mac OS Xのツリーウィジェット機能 きのう はツリーの展開 てんかい 時 じ にアニメーションを行 おこな い、デフォルトボタンもユーザーがフォーカスした際 さい にアニメーションを行 おこな う。Swingでは、これらのアニメーションは行 おこな われない。
SWTはネイティブGUIコードの単純 たんじゅん なラッパーであるため、(ネイティブAPIが互換 ごかん を保 たも つ限 かぎ り)ネイティブコードが変更 へんこう されても大 おお きな修正 しゅうせい を必要 ひつよう としない。OSベンダーはAPI上 じょう の互換 ごかん 性 せい を保 たも つよう常 つね に気 き をつけている。Swingでは事情 じじょう が異 こと なる。Swing は動作 どうさ 中 ちゅう のアプリケーションのルック・アンド・フィールを交換 こうかん 可能 かのう であり、ネイティブGUIのテーマをエミュレート可能 かのう である。この機能 きのう はOSのGUIが変更 へんこう されるたびに、その変化 へんか (テーマやその他 た のルック・アンド・フィールの更新 こうしん )を反映 はんえい しなければならない。逆 ぎゃく に言 い えば、ネイティブAPIが変更 へんこう されれば、SWTは修正 しゅうせい が必須 ひっす となるが、Swingは修正 しゅうせい の必要 ひつよう がない。
SWT は「プラットフォームとの密 みつ な統合 とうごう 」を目指 めざ しており、ネイティブウィジェットを利用 りよう する。developer.com の Mauro Marinilliaによると「ネイティブプラットフォームとの密 みつ な統合 とうごう が必要 ひつよう なら、SWTはよい選択 せんたく だ」としている[ 6] 。このような密 みつ な統合 とうごう の利点 りてん を生 い かした例 れい として、SWTは Microsoft Windows のActiveX オブジェクトもラップ可能 かのう である。
拡張 かくちょう 性 せい と他 た の Java コードとの比較 ひかく [ 編集 へんしゅう ]
ネイティブコードを利用 りよう するため、SWTクラスでは全 ぜん ウィジェットクラスについて、継承 けいしょう は容易 ようい には許 ゆる されない。このため、拡張 かくちょう 性 せい に問題 もんだい があるとする人 ひと もいる[ 6] 。この点 てん ではSwingの方 ほう が容易 ようい にカスタマイズ可能 かのう である。どちらのツールキットも新 あら たなウィジェットをJavaコードだけを使 つか って書 か くことができる。
SWTはAWT同様 どうよう 、手動 しゅどう でオブジェクトの解放 かいほう をする必要 ひつよう がある。SwingやJavaのメモリ の自動 じどう ガベージコレクション とは異 こと なる。close() しないといけないI/Oリソースと同 おな じである。SWTオブジェクトは "dispose()" メソッドを使 つか って明示 めいじ 的 てき に解放 かいほう する必要 ひつよう があり、C言語 げんご の "free" に似 に ている[ 7] 。これをしないと、メモリリーク などの好 この ましくない結果 けっか を生 しょう じる。ただし、親子 おやこ 関係 かんけい にある Widget は親 おや を dispose() すれば、子 こ も dispose() される。この問題 もんだい について、「リソースの明示 めいじ 的 てき 解放 かいほう の必要 ひつよう 性 せい は、少 すく なくとも平均 へいきん 的 てき なJava開発 かいはつ 者 しゃ にとっては、開発 かいはつ 時間 じかん とコストに悪影響 あくえいきょう を及 およ ぼす」とのコメントもある。さらに「これはありがた迷惑 めいわく である。Swingがより自動 じどう 化 か され遅 おそ いのに対 たい して、SWTはよりきめ細 こま かいコントロールができるが複雑 ふくざつ になる」としている[ 6] 。SWTが手動 しゅどう でのオブジェクト解放 かいほう を必要 ひつよう とするのは、ネイティブオブジェクトを使 つか っているのが主 おも な原因 げんいん である。つまり、それらオブジェクトは Java VM の管理 かんり 範囲 はんい 外 がい にあり、Java VM からそれらが解放 かいほう 可能 かのう かどうかを判断 はんだん できない。
GTK+ 環境 かんきょう での Azureus BitTorrent クライアント
SWTはプラットフォーム固有 こゆう のGUIライブラリへのラッパーであるため、Javaが動作 どうさ するプラットフォーム全 すべ てで動作 どうさ するとは限 かぎ らない。つまり、SWTはGUIライブラリ毎 ごと に移植 いしょく が必要 ひつよう であり、Javaが新 あら たなプラットフォームに移植 いしょく されても、即座 そくざ にSWTが移植 いしょく されるとは限 かぎ らない(Swing や AWT はJava本体 ほんたい の一部 いちぶ だが、SWTはそうではない)。また、Windows 上 じょう のSWT以外 いがい は、比較的 ひかくてき 効率 こうりつ が悪 わる いと言 い われている[ 3] 。SWTはプラットフォーム毎 ごと に異 こと なるネイティブライブラリを使 つか っているため、プラットフォーム固有 こゆう のバグもSWTではそのまま存在 そんざい している。
SWTはSwingよりも低 てい レベルな詳細 しょうさい を開発 かいはつ 者 しゃ に提示 ていじ する。これはSWTがネイティブライブラリで提供 ていきょう されるGUI機能 きのう の上 うえ の層 そう であるためであり、ネイティブGUIコードを開発 かいはつ 者 しゃ に提示 ていじ するのも意図 いと 的 てき と思 おも われる。SWTの目的 もくてき は、高度 こうど なユーザインタフェース設計 せっけい フレームワークを提供 ていきょう することではなく、可能 かのう な限 かぎ り多数 たすう のプラットフォームで薄 うす いユーザインタフェースAPIを提供 ていきょう し、その上 うえ に高度 こうど なGUIアプリケーションを構築 こうちく できるだけの機能 きのう を提供 ていきょう することである。
SWTの実装 じっそう はプラットフォーム毎 ごと に異 こと なるので、複数 ふくすう のプラットフォーム対応 たいおう としてアプリケーションを配布 はいふ する際 さい には、プラットフォーム毎 ごと のSWT(JARファイル)が必要 ひつよう になる。
SWTはJavaクラスライブラリ を必要 ひつよう 最小 さいしょう 限 げん しか使 つか っていないため、古 ふる いJDK(例 たと えば 1.1.8)でも動作 どうさ するし、Javaクラスライブラリを完全 かんぜん 実装 じっそう していない携帯 けいたい 機器 きき でも動作 どうさ すると言 い われている[要 よう 出典 しゅってん ] 。
2006年 ねん 3月 がつ 現在 げんざい 、SWTがサポートされているプラットフォーム/GUIライブラリは次 つぎ の通 とお りである。
SWTを利用 りよう しているアプリケーションとして、以下 いか のものがある。
GUIツールキットとしてはSwingよりも新 あたら しいため、SWT関連 かんれん の文書 ぶんしょ /書籍 しょせき はSwingに比 くら べて少 すく ない[要 よう 出典 しゅってん ] 。
SWT: The Standard Widget Toolkit は、Eclipse Foundation推薦 すいせん のSWT解説 かいせつ 書 しょ である[ 8] 。他 ほか にもSWT関連 かんれん 書籍 しょせき として以下 いか のものがある。
Rob Warner, Robert Harris (2004年 ねん ). The definitive guide to SWT and JFace . Apress
Eric Clayberg and Dan Rubel (2004年 ねん ). Eclipse: Building commercial-quality plug-in . Addison-Wesley
Erich Gamma and Kent Beck (2004年 ねん ). Contributing to Eclipse . Addison-Wesley
Sherry Shavor et al (2004年 ねん ). The Java Developers Guide to Eclipse . Addison-Wesley
Eclipseコミュニティでの最近 さいきん [いつ? ] の動 うご きとして、SWT(とJFace)をウェブ向 む けのウィジェットツールキットとして移植 いしょく しようとしている。Eclipse RAP [ 9] (Rich Ajax Platform) はQooxdoo AJAX ライブラリとSWT APIを組 く み合 あ わせたものである。他 た のJava AJAX プロジェクト(Echo2やGWT )と同様 どうよう 、SWT APIを使 つか うことで、デスクトップと同 おな じ形 がた でWeb用 よう のアプリケーション開発 かいはつ が可能 かのう となる。
Eclipseが人気 にんき を得 え てきた結果 けっか として、SwingとSWTをある意味 いみ で「統合 とうごう 」しようとする活動 かつどう もある。
SwingとSWTの統合 とうごう については、以下 いか のようにいくつかの異 こと なる手法 しゅほう が存在 そんざい している。
Eclipseプロジェクトでは、SwingウィジェットをSWTコンテナウィジェットに埋 う め込 こ もうとしている[要 よう 出典 しゅってん ] 。
SwingWT はSwing APIの代替 だいたい 実装 じっそう を提供 ていきょう しようとするプロジェクトである。その1つとしてSWT上 じょう でSwingウィジェットを使 つか えるようにするプロジェクトが行 おこな われている[ 10] 。
SWTSwing は、逆 ぎゃく に Swing 上 じょう で SWT API を提供 ていきょう するプロジェクトである。これによりSWTがサポートされていないプラットフォーム上 じょう でもJavaさえ動作 どうさ すればSWTアプリケーションを実行 じっこう 可能 かのう となる[ 11] 。