AWTの紹介

Javaプログラミング言語クラスライブラリは、Abstract WindowingToolkitまたはAWTと呼ばれるユーザーインターフェイスツールキットを提供します。 AWTは強力で柔軟性があります。しかし、新参者はしばしばその力が覆い隠されていることに気づきます。配布されたドキュメントにあるクラスとメソッドの説明は、新しいプログラマーにほとんどガイダンスを提供しません。さらに、利用可能な例では、多くの重要な質問に答えられないことがよくあります。もちろん、初心者はいくつかの困難を期待する必要があります。効果的なグラフィカルユーザーインターフェイスは、設計と実装が本質的に困難であり、AWTのクラス間の複雑な相互作用によって、このタスクがより複雑になる場合があります。ただし、適切なガイダンスがあれば、AWTを使用したグラフィカルユーザーインターフェイスの作成が可能であるだけでなく、比較的簡単です。

この記事では、AWTの背後にある哲学の一部を取り上げ、アプレットまたはアプリケーションの単純なユーザーインターフェイスを作成する方法に関する実際的な懸念に対処します。

ユーザーインターフェイスとは

ユーザーインターフェイスは、プログラムのユーザーと対話するプログラムの一部です。ユーザーインターフェイスにはさまざまな形式があります。これらのフォームは、単純なコマンドラインインターフェイスから、多くの最新のアプリケーションによって提供されるポイントアンドクリックのグラフィカルユーザーインターフェイスまで、複雑さの範囲があります。

最も低いレベルでは、オペレーティングシステムは、マウスとキーボードからの情報を入力としてプログラムに送信し、プログラム出力用のピクセルを提供します。 AWTは、プログラマーがマウスの追跡やキーボードの読み取りの詳細について心配したり、画面への書き込みの詳細に注意を払ったりしないように設計されています。 AWTは、これらの低レベルのサービスおよびリソースに対して、適切に設計されたオブジェクト指向インターフェースを提供します。

Javaプログラミング言語はプラットフォームに依存しないため、AWTもプラットフォームに依存しない必要があります。AWTは、さまざまなプラットフォームで機能するグラフィカルユーザーインターフェイス設計のための共通のツールセットを提供するように設計されました。AWTによって提供されるユーザーインターフェイス要素は、各プラットフォームのネイティブGUIツールキットを使用して実装されるため、各プラットフォームのルックアンドフィールが維持されます。これはAWTの最大の強みの1つです。このようなアプローチの欠点は、あるプラットフォームで設計されたグラフィカルユーザーインターフェイスが、別のプラットフォームで表示されたときに異なって見える可能性があるという事実です。

コンポーネントとコンテナ

グラフィカルユーザーインターフェイスは、コンポーネントと呼ばれるグラフィカル要素で構成されています。一般的なコンポーネントには、ボタン、スクロールバー、テキストフィールドなどのアイテムが含まれます。コンポーネントを使用すると、ユーザーはプログラムを操作して、プログラムの状態に関する視覚的なフィードバックをユーザーに提供できます。AWTでは、すべてのユーザーインターフェイスコンポーネントは、クラスComponentまたはそのサブタイプの1つのインスタンスです。

コンポーネントはスタンドアロンではなく、コンテナ内にあります。コンテナには、コンポーネントのレイアウトが含まれ、制御されます。コンテナはそれ自体がコンポーネントであるため、他のコンテナ内に配置できます。AWTでは、すべてのコンテナーはクラスContainerまたはそのサブタイプの1つのインスタンスです。

空間的には、コンポーネントは、それらを含むコンテナ内に完全に収まる必要があります。このコンポーネント(コンテナを含む)のコンテナへのネストにより、要素のツリーが作成されます。ツリーのルートにあるコンテナから始まり、ボタンなどのコンポーネントであるリーフに拡張されます。

図1の図は、Windows 95で表示したときの単純なグラフィカルユーザーインターフェイスを示しています。図2は、ツリーとして配置された図1のインターフェイスコンポーネントを示しています。

コンポーネントの種類

図3は、AWTによって提供されるユーザーインターフェイスコンポーネントクラス間の継承関係を示しています。クラスコンポーネントは、すべてのコンポーネントが準拠する必要のあるインターフェイスを定義します。

AWTは、ユーザーインターフェイスを構築できる9つの基本的な非コンテナコンポーネントクラスを提供します。(もちろん、新しいコンポーネントクラスは、これらのいずれかまたはクラスComponent自体から派生する可能性があります。)これらの9つのクラスは、クラスButton、Canvas、Checkbox、Choice、Label、List、Scrollbar、TextArea、およびTextFieldです。図4は、各クラスのインスタンスを示しています。

このアプレットを表示するには、Java対応のブラウザが必要です。

図4。

9つのユーザーインターフェイスコンポーネント

この表示のソースはここにあります。

コンテナの種類

AWTは4つのコンテナクラスを提供します。それらは、クラスWindowとその2つのサブタイプ(クラスFrameとクラスDialog)、およびPanelクラスです。AWTによって提供されるコンテナに加えて、アプレットクラスはコンテナです。これはPanelクラスのサブタイプであるため、コンポーネントを保持できます。AWTが提供する各コンテナクラスの簡単な説明を以下に示します。

トップレベルの表示面(ウィンドウ)。Windowクラスのインスタンスは、別のコンテナーにアタッチも埋め込みもされません。Windowクラスのインスタンスには、境界線もタイトルもありません。
フレーム 境界線とタイトルのあるトップレベルの表示面(ウィンドウ)。Frameクラスのインスタンスには、メニューバーがある場合があります。それ以外の点では、Windowクラスのインスタンスに非常によく似ています。
ダイアログ 境界線とタイトルのあるトップレベルの表示面(ウィンドウ)。Dialogクラスのインスタンスは、Frameクラスの関連インスタンスなしでは存在できません。
パネル

コンポーネントを保持するための汎用コンテナ。Panelクラスのインスタンスは、コンポーネントを追加するためのコンテナーを提供します。

コンテナの作成

ユーザーインターフェイスを構成するコンポーネントを追加する前に、プログラマーはコンテナーを作成する必要があります。アプリケーションを構築するとき、プログラマーは最初にクラスWindowまたはクラスFrameのインスタンスを作成する必要があります。アプレットを作成するとき、フレーム(ブラウザウィンドウ)はすでに存在します。AppletクラスはPanelクラスのサブタイプであるため、プログラマーはコンポーネントをAppletクラス自体のインスタンスに追加できます。

リスト1のコードは、空のフレームを作成します。フレームのタイトル(「例1」)は、コンストラクターの呼び出しで設定されます。フレームは最初は非表示であり、そのshow()メソッドを呼び出して表示する必要があります。

importjava.awt。*;

public class Example1 {public static void main(String [] args){Frame f = new Frame( "Example 1");

f.show(); }}

リスト1。

空のフレーム

リスト2のコードは、リスト1のコードを拡張して、新しいクラスがクラスPanelから継承するようにします。main()呼び出しを経由する方法、この新しいクラスのインスタンスが作成され、Frameオブジェクトに追加add()する方法。結果が表示されます。両方の例の結果は同じに見えるはずです(つまり、まったく面白くないように見えるはずです)。

importjava.awt。*;

public class Example1a extends Panel {public static void main(String [] args){Frame f = new Frame( "Example 1a");

Example1a ex = new Example1a();

f.add( "Center"、ex);

f.pack(); f.show(); }}

リスト2。

パネルが空のフレーム

PanelクラスではなくAppletクラスから新しいクラスを派生させることにより、この例はスタンドアロンアプリケーションとして、またはWebページに埋め込まれたアプレットとして実行できるようになりました。この例のコードをリスト3に示します。結果のアプレットを図5に示します(それでもまったく面白くありません)。

importjava.awt。*;

public class Example1b extends java.applet.Applet {public static void main(String [] args){Frame f = new Frame( "Example 1b");

Example1b ex = new Example1b();

f.add( "Center"、ex);

f.pack(); f.show(); }}

リスト3。

空のアプレットのあるフレーム

このアプレットを表示するには、Java対応のブラウザが必要です。

図5。

空のフレーム

注:Windowオブジェクト、場合によってはDialogオブジェクトでさえ、Frameオブジェクトを置き換えることができます。これらはすべて有効なコンテナであり、コンポーネントは同じ方法でそれぞれに追加されます。

コンテナへのコンポーネントの追加

有用であるためには、ユーザーインターフェースは単なるコンテナ以上のもので構成されている必要があります-それはコンポーネントを含んでいなければなりません。コンポーネントは、コンテナのadd()メソッドを介してコンテナに追加されます。この方法には3つの基本的な形式がありadd()ます。使用する方法は、コンテナのレイアウトマネージャによって異なります(「コンポーネントレイアウト」というタイトルのセクションを参照)。

リスト4のコードは、リスト3に示されているコードに2つのボタンの作成を追加します。作成は、init()アプレットの初期化中に自動的に呼び出されるため、メソッドで実行されます。したがって、プログラムがどのように起動されても、ボタンはinit()ブラウザまたはmain()メソッドのいずれかによって呼び出されるため、作成されます。図6には、結果のアプレットが含まれています。

importjava.awt。*;

public class Example3 extends java.applet.Applet {public void init(){add(new Button( "One")); add(new Button( "Two")); }

public Dimension PreferredSize(){return new Dimension(200、100); }

public static void main(String [] args){Frame f = new Frame( "Example 3");

Example3 ex = new Example3();

ex.init();

f.add( "Center"、ex);

f.pack(); f.show(); }}

リスト4。

2つのボタンが付いたアプレット

このアプレットを表示するには、Java対応のブラウザが必要です。

図6。

2つのボタンが付いたアプレット

コンポーネントのレイアウト

これまで、コンテナに追加されたコンポーネントがどのように配置されるかについては何も言われていませんでした。レイアウトは、コンテナーではなく、コンテナーに関連付けられたレイアウトマネージャーによって制御されます。レイアウトマネージャーは、すべてのコンポーネント配置の決定を行います。AWTでは、すべてのレイアウトマネージャークラスがLayoutManagerインターフェイスを実装します。

AWTは5つのレイアウトマネージャーを提供します。それらは非常に単純なものから非常に複雑なものまでさまざまです。この記事では、ここでの例で使用されている2つのレイアウトマネージャークラス、FlowLayoutクラスとBorderLayoutクラスについてのみ説明します。

FlowLayoutクラスは、コンポーネントをコンテナに左から右に配置します。1つの行のスペースがなくなると、別の行が開始されます。コンテナのadd()メソッドの単一引数バージョンは、コンポーネントを追加するために使用されます。

BorderLayoutクラスには、図7に示すように、5つのゾーンがあります。ゾーンの名前は、「North」、「South」、「East」、「West」、および「Center」です。これらの5つのゾーンのそれぞれに単一のコンポーネントを配置できます。囲んでいるコンテナのサイズが変更されると、各境界ゾーンは、その中に配置されたコンポーネントを保持するのに十分なサイズに変更されます。余分なスペースはセンターゾーンに与えられます。コンテナのadd()メソッドの2つの引数バージョンは、コンポーネントを追加するために使用されます。最初の引数は、コンポーネントを配置するゾーンに名前を付けるStringオブジェクトです。

各コンテナクラスには、デフォルトのレイアウトマネージャがあります。FrameクラスとDialogクラスのデフォルトのレイアウトマネージャーはBorderLayoutマネージャーです。Panelクラス(およびAppletクラス)のデフォルトのレイアウトマネージャーはFlowLayoutマネージャーです。

リスト5のコードは、両方のレイアウトマネージャーを使用し、さらにいくつかのユーザーインターフェイスコンポーネントを含んでいます。結果を図8に示します。

importjava.awt。*;

public class Example4 extends java.applet.Applet {public void init(){Panel p;

setLayout(new BorderLayout());

p = new Panel();

p.add(new TextArea());

add( "Center"、p);

p = new Panel();

p.add(new Button( "One")); p.add(new Button( "Two"));

選択肢c = new Choice();

c.addItem( "one"); c.addItem( "two"); c.addItem( "three");

p.add(c);

add( "South"、p); }

public static void main(String [] args){Frame f = new Frame( "Example 4");

Example4 ex = new Example4();

ex.init();

f.add( "Center"、ex);

f.pack(); f.show(); }}

リスト5。

より複雑な例

このアプレットを表示するには、Java対応のブラウザが必要です。

図8。

より複雑な例

イベント処理

上記の例は、不活性なユーザーインターフェイスを表示するだけです。もちろん、ユーザー入力の結果としてユーザーインターフェイスがアクションを実行することは非常に重要です。ただし、イベント処理の謎を深く掘り下げることは、この記事の範囲を超えています。それは将来の記事まで待たなければなりません。ただし、完全を期すために、リスト6のサンプル・コードは、プログラムが受け取る可能性のある1つのタイプのイベントを処理する方法を示しています。新しいクラスaction()は、Componentクラスによって提供されるメソッドをオーバーライドします。このaction()メソッドは、たとえば、ポップアップリストからアイテムを選択することによって生成されるアクションイベントに応答します。ザ・action()メソッドでは、EventインスタンスとObjectインスタンスの2つのパラメーターを指定する必要があります。イベントインスタンスには、イベントのターゲット(イベントを最初に受信したコンポーネント)、イベントのx座標とy座標、イベントが発生した時刻など、イベントに関する情報が含まれています。Objectインスタンスは、イベント固有のデータを保持します。Buttonオブジェクトの場合、ボタンラベルにテキストが含まれます。

importjava.awt。*;

パブリッククラスExample5はjava.applet.Applet {TextArea ta = null;を拡張します。

public void init(){パネルp;

setLayout(new BorderLayout());

p = new Panel();

ta = new TextArea();

p.add(ta);

add( "Center"、p);

p = new Panel();

p.add(new Button( "One")); p.add(new Button( "Two"));

選択肢c = new Choice();

c.addItem( "one"); c.addItem( "two"); c.addItem( "three");

p.add(c);

add( "South"、p); }

public boolean action(Event e、Object o){String str =(String)o;

ta.appendText(str + "\ n");

falseを返します。}

public static void main(String [] args){Frame f = new Frame( "Example 5");

Example5 ex = new Example5();

ex.init();

f.add( "Center"、ex);

f.pack(); f.show(); }}

リスト6。

イベント処理の例