6-1: AWT とは?

Java ではさまざまなウィンドウシステム上で動作が可能なアプリケーションを 開発するために AWT という機構を導入しています。


・ 最初に AWTという言葉の意味から説明しましょう。 AWT は "abstract window toolkit" の省略形です。 "window toolkit" は「ウィンドウアプリケーションを作り上げるための道具箱」 というような意味たど考えてください。 java.awt およびそのサブパッケージ群は、 そのためのクラスやインターフェイスを提供します。 具体的にはウィンドウや画面に描かれる画像、 あるいはマウスで操作可能な擬似的なボタンのようにユーザーインターフェイスを 構築する部品が含まれます。
さて、次に AWTの先頭にある "abstract" の意味も考えてみましょう。 これは「抽象化されて実体を持たない」ということを表します。 画面上のウィンドウやイメージは現実に目に見えるオブジェクトです。 どうして「抽象的(abstract)」なのでしょうか?  この意味を理解するためには、 Javaは特定のマシンやシステムに依存しないという事実を思い出す必要があります。 アプリケーションは、 UNIXのXウィンドウ、Windows、Macintoshなど複数のウィンドウシステム上で 実行可能でなくてはいけません。


AWTはすべてのウィンドウシステムの上に共通して存在する

・ ウィンドウシステムを選ばないアプリケーションは、 次に述べる2つの条件を満たさなければならないでしょう。

ちょっと考えるとこの2つの要求は矛盾しているように思えます。 実際、単純にクラスを設計したのでは上の条件を両立させることはできません。 少し工夫が必要になります。 そのからくりは java.awtの本質と言っていいでしょう。 簡単に説明したのが下図です。 javaのawtパッケージで提供されるクラスと、 個々のウィンドウシステムとの間に、もう1つ、その橋渡しをするための クラスの層を用意しています。この中間のクラスの存在がポイントです。


AWTの機能を実現する「3層構造」

・ 3つの層のうち一番上が私たちがJavaのプログラミングの中で取り扱っている java.awtパッケージのクラスです。これらのクラスにはシステムに依存する 記述はいっさい含まれません。 たとえば java.awt.Graphics クラスを例にとって見てみましょう。 ふだんはあまり意識していませんが、 実は Graphicsクラスは abstractなメソッドを含む抽象クラスです。 このクラスは、システムに依存しないように、二番目の層のクラスを 覆い隠す目的を持っています。 すなわち、 実際にオブジェクトとして生成されているのは、 2番目の層に属するGraphicsのサブクラスなのです。 その名前が何になるかはシステムに依存します。 たとえば、Solarisならば sun.awt.motif.MGraphicsというクラスです。 java.awt.Graphics にはシステムの機能の呼び出しなどは記述されていません。 一方、sun.awt.motif.MGraphicsは内部で nativeメソッドと呼ばれる マシンに依存したコードを呼び出すようになっています。 このようなクラスの継承の利用によって、 実際にはシステムの機能を呼び出しているにもかかわらず、 プログラムの記述の中にはシステムに依存する部分は見えなくなります。

・ JDK1.1 まで利用されてきた コンポーネントのクラスの実現方法もやはり3層の構造を利用しています。 ただし、少しだけ複雑です。コンポーネントのクラスの直接のサブクラスが nativeメソッドを呼び出すオブジェクトになるのではなく、 peer と呼ばれるインターフェイスを 実装したクラスをコンポーネントのクラスが内部に保持するという形式になります。 このような仕組みになっている理由は2つほどあります。 まず、peerを実装したクラスを複数用意しておけば、 それを交換することでコンポーネントのデザインを容易に変更することが 可能になります。 第2点目に、peerのインターフェイスを通じて、そのコンポーネントが実装すべき 機能を定義できるという点です。つまり peerは単に2層目のシステム依存の クラスを覆い隠すだけでなく、コンポーネントの規格を定める役割もはたすわけです。 たとえば Buttonクラスの場合、ButtonPeerインターフェイスによって ラベルの文字列を設定できるようにすることが要求されます。
コンポーネントのクラスは3層のモデルに頼らなくても実現は可能です。 システム固有のウィンドウオブジェクトを呼び出す代わりに、 100% Javaで記述する方法もあります。 JDK1.2 から新たに提供されるコンポーネントは、そのような方針で設計されています。 ただし、その場合でも Graphics や Imageのオブジェクトは上のような仕組みで 抽象化されたクラスを利用しなければなりません。