SwingとAWT


とりあえずJavaの基本は覚えた。AWTでウインドウを使ったプログラムも作れるようになった。さて、次のステップは何だろう……そう考えている人。おそらくあなたの前にはいくつかの選択肢があるはずです。

・1つは、サーバサイドJavaへの道。
・1つは、iアプリなど携帯Javaへの道。
・残る1つは、Swingによるより高度なGUIアプリケーションへの道。

より本格的なアプリケーションを作成しよう、と思う人の進むべき道が「Swingへの道」でしょう。Swingを使えば、AWTよりはるかに高度なGUIを利用することができます。この連載では、より本格的なアプリケーション開発を目指す人のために、Swingの使い方について解説をしていきます。

まずは、「Swingとはどういうものか」から説明していきましょう。そもそも、Javaには当初からAWTというGUIキットが搭載されていました。それが、ver. 1.2から、新たにSwingというフレームワークが追加されることになったわけです。なぜ、AWTの他にSwingというものを用意したのでしょう。両者はどのような違いがあるのでしょうか。整理すると、以下のようになります。

Swingによるアプリケーション。通常のWindowsのルックアンドフィールと似ているが、微妙に異なっていることがわかる。


・AWTはOSのルックアンドフィールそのまま
AWTで作成したGUIは、そのOSのルックアンドフィールそのままです。が、Swingで作成されたGUIは、OS固有のものとは微妙に感じが違う、一種独特の雰囲気になっています。OSのルックアンドフィールにあわせることもできますが、完全に同じものではない、と考えたほうがよいでしょう。

・AWTはネイティブコードを含んでいる
AWTは、その多くの部分をネイティブコードに依存しています。例えばButtonを作成すると、内部的にOSのAPIにあるボタンの描画機能を呼び出して画面にボタンを表示させたりしているのですね。JavaではなくOS内の機能を利用することで描画速度などを速くしているのですが、逆にJavaで制御できない部分で表示をしているため、ボタンの表示をカスタマイズしたりできなくなっています。それだけ自由度が低いのです。

・動作速度の違い
Swingは、AWTをベースに拡張していますが、基本的にはpure Javaで動いています。このため、AWTより表示などがややもったりした感じとなっていることは否めないでしょう。ただし、すべてJavaでできていることで、表示のカスタマイズなども自由に行えます。それだけ自由度が高いのですね。

・標準コンポーネントのレベルの差
AWTに標準で用意されているコンポーネントは、一般的なGUIで使われている基本的なものだけです。これに比べ、Swingに搭載されているコンポーネントは多彩です。AWTに用意されていないツリー表示、表計算のシート、スライダー、スピニングボタンなど多くのGUI用コンポーネントが用意されています。また、Swingのコンポーネント類は、中のデータ構造や表示などを行うためのクラスを別途持っており、それらを新規作成することでコンポーネントの振る舞いなどを変更することも可能です。

・表示機能の違い
AWTのコンポーネントは、基本的に表示をいじることはできません。が、先に述べたようにSwingでは表示を自由に変更できます。そればかりでなく、コンポーネントのルックアンドフィールについても、いくつかのセットが用意されており、Windows風、Linux風といったように変更することが可能です。またコンポーネントを描画する仕組みがAWTよりぐっと複雑になっており、細かに制御できるようになっています。


――以上、整理すれば、「シンプルで使いやすいが高度なことはできないAWT」と「より高度な表現が可能だが複雑で使いこなすのが難しいSwing」という違いといってよいでしょう。

最近になって、「クライアント再度でのGUI開発を見直そう」という動きが強まってきています。これまでJavaの世界は、どちらかというとサーバサイドの進化を中心に動いてきました。が、最近になって「もっとユーザが直接使うGUI部分を考える必要がある」というように変わりつつあります。インターネットの世界も、「RIA(Rich Internet Application)」と呼ばれる、より高度なGUIをもったインターネットアプリケーションが注目されつつあります。簡単にRIAを実現できるJavaアプレットは、最近になって再評価されつつあります。

その中心にあるのが、Swingなのです。Swingを見直し、もっと活用しよう。例えば、次期Java 7で標準搭載されるといわれる新しいスクリプト言語「Java FX」などは、簡単なスクリプトでGUIを構築することを考えて設計されたものですが、これで利用されるのは、やっぱりSwingなのです。