Swingとは
Java Foundation Class
Swing は JFC (Java Foundation Class) の一つです
JFC とは、Java の GUI 開発のための API セットのことです
主に AWT、Swing、2D API などを含みます
Swing は GUI 開発の中枢部であり基本構造部分です
当初、Java の GUI 開発は AWT を使って行われましたが
AWT はピアに依存するため、ネイティブなプラットフォームにレンタリングされてしまいます
しかし、Swing コンポーネントはプラットフォームに依存しないルックアンドフィールを実現します
ところで、Swing が独自の新しい Java 技術であると思っている人もいるようですが、それは違います
Swing のほとんどがAWT を継承した軽量コンポーネントなのです
AWT が持つ重量コンポーネントの多くを Swing でもサポートし、さらに便利な機能を追加しています
Swing は JDK1.2 から標準でサポートされています
JDK1.1 でも使用できますが、この場合は Swing コンポーネントをインストールする必要があります
ブラウザでも同様に、アプレットに Swing を使用する場合は Swing コンポーネントが必要です
NN 4.04、IE 4.0 以降は JDK1.1 をサポートしているので、コンポーネントがあれば実行できます
ただし、全てのブラウザで互換性のある動作を要求するならば
Sun Microsystems が提供する Java プラグインをインストールするしかありません
ルックアンドフィール
Swing の最大の機能は「ルックアンドフィール」です
これは、簡単に言うならば外観と動作の一貫性のことを表します
Javaの思想は「どこでも動く」というCPUやプラットフォームに依存しないプログラムです
AWT もこれを守っていましたが、ネイティブなピアに描画を依存したため
動作が同じでも、見た目が環境によって異なっていました
重量コンポーネントの生成は、ネイティブな環境の描画機能に依存するからです
そこで、ネイティブな環境に描画や動作が依存しないコンポーネントの開発として
注目されていた JDK1.1 以降の「軽量コンポーネント」の技術が Swing に使われたのです
より正確には、以前からこのようなサードパーティが開発されており
その代表作に Netscape の IFC(Internet Foundation Class) と呼ばれるクラス郡があります
IFC は軽量コンポーネントのクラス郡で AWT より確実で機能が豊富なツールキットだったのです
こうして、Sun Microsystems は Netscape と協力し IFC の思想を元に
さらにルックアンドフィールなどの機能を追加した Swing を開発したそうです
すなわち Swing はどのプラットフォームでも同じ動作をするばかりか
どのプラットフォームでも同じ外観と動作を保証しているのです
ただし、JDK1.3 の現時点で Microsoft と Apple は他の環境で
自社の(つまり、Windows と Macintosh)ルックアンドフィールの使用を認めていません
因みに、このように自在に変更できる機能を
Java は プラグイン可能なルックアンドフィールと呼んでいます
(Pluggable Look and Feel : PLAF)
PLAF は、プログラムが動的にルックアンドフィールを変更させることすらできる
非常に柔軟で強力な機能を持っています
致命的な欠陥
GUI を担当する AWT と Swing API の関係において高い評価はできません
これらの設計は、洗練された Java システムにおいて最悪の水準です
理由は Java があまりにも早く普及しすぎたことにあるでしょう
統一した Java の GUI 開発システムが早急に望まれた当時
Java 開発者はピアを用いた AWT を設計しましたが、これは最悪でした
事実上は同一のクラスファイルは異なるプラットフォームでも同じ動作をするべきです
しかし、AWT はピアに依存するため、動作はするもののレイアウトが問題となります
大部分が横着して作られた AWT の設計は、欠陥住宅ならぬ欠陥システムなのです
確かに、これを解決する役割を持つのが Swing であり
AWT に比べて洗練された設計を持つ Swing は柔軟であり、非常に強力です
しかし、AWT との互換性が Swing の足を引っ張っています
Swing コンポーネントは AWT を継承した軽量コンポーネント郡であり
設計理想から考えれば、AWT の機能はそのまま使えるべきと考えられます
しかし、ピアを持つ AWT と、これを抽象化する Swing で相違があり
ずさんな設計の AWT と、それを補完する Swing で相性が合わない部分が多々あります
例えば、子コンポーネントを直接コンポーネントに追加できなくなっている点や
paint() のオーバーライドが推奨されなくなっているというようなことです
これらの問題は、確実に AWT の Java プログラマーを混乱させます
設計から見れば、新しい Swing の規制の方が構造的で柔軟なのですが
元々存在する AWT を継承しているという観点から考えると
スーパークラスの機能が保障されない(推奨されない)点は、残念としかいえません