WisdomSoft - for your serial experiences.

1.2 Abstract Windows Toolkit

Swing の前身となっている AWT の概要について、及びプラットフォームに依存しない Java が、どのようにシステムに依存するウィンドウなどの UI を表示するか、その仕組みを解説します。

1.2.1 ピアと抽象ウィンドウシステム

最初の Java によるウィンドウプログラミングには Abstract Window Toolkit 通称 AWT と呼ばれるシステムが採用されていました。AWT は java.awt パッケージに配置されるクラス群で、ウィンドウの表示やグラフィックスに関連したクラスを提供しています。Swing においても AWT を基本に構成されているため、Java のグラフィックスプログラミングにおいて AWT の存在は重要です。

Java はどこでも実行できることが最大の強みだったため、もし、ウィンドウを表示するようなプログラミングが特定のシステムに依存するようでは、Java は世界から無視されたでしょう。そこで、Sun Microsystem はピアという概念を持ち出して、ネイティブなウィンドウシステムのウィンドウを抽象的に Java から制御するという方法を採用したのです。これが AWT コンポーネントです。

Java アプリケーションがウィンドウを生成する場合は、最初に Java のプログラムコードが AWT にウィンドウの生成を要求し、AWT がネイティブなシステムの API を呼び出してウィンドウを生成するという 3 段階の手順に分かれます。アプリケーション開発者は AWT が提供する抽象的なライブラリを操作するだけでウィンドウを制御できるため、実行しているネイティブシステムを意識する必要はないという仕組みです。

図1 Java とピアの関係
図1 Java とピアノ関係

しかし、多くの技術者はすぐに AWT の問題を指摘するようになり、Java によるプラットフォームに依存しない GUI システムの限界に気がつきました。ピアシステムはネイティブな API を間接的に呼び出すため、機能を拡張することが不可能だったのです。拡張ができるようにネイティブな API を操作できるようにしてしまえば、Java の GUI プログラムは結局ネイティブなシステムに依存することになってしまいます。これを避けるために実装を隠蔽していたのですが、これが逆に AWT の可能性に限界を設けてしまったのです。

さらに、ウィンドウシステムの見た目や動作は Windows や Mac OS、Linux 等のシステムによって異なるため、これらのシステムで共通する基本的な GUI 部品しか提供されなかったのも大きな問題でした。結局、AWT で開発できるのはインターネットの Web サイトや携帯端末で実行する簡単なミニゲーム程度でしかなかったのです。結局 AWT が提供する GUI 部品の多くは設計面で多くの問題を残し、事実上失敗に終わったと言えるでしょう。

なぜ、AWT がこのような結果に終わってしまったかは、Java の急速な普及が背景にあります。Java が世界的に有名になるにつ入れて、Java 専用の GUI プログラミング用のライブラリの開発が求められるようになりました。AWT の開発チームは、ピアに依存した単純な実装で、急いでライブラリを作らなければならないという事情があったのです。

この問題を解決するために、拡張可能な GUI 部品として Java AWT の描画処理だけで実現する GUI 部品を新たに実装しました。これを従来のピアを保有する部品に対して軽量コンポーネントと呼びます。軽量コンポーネントは、開発者が描画処理や動作を独自に実装することができるため、オリジナルの GUI ボタンなど、新しい GUI 部品の開発を可能にしたのです。

ピアを持つウィンドウは、ネイティブシステムによって描画されていたため、必ず矩形で全体が塗りつぶされていました。矩形以外の形や、背景が透明の GUI 部品を実現することはできませんでしたが、軽量コンポーネントであれば、Java の描画機能によって実装されるため、形や背景の描画に制限はありません。