17-1 コンテナの役割

レイアウトの機能を持つコンポーネントであるコンテナクラスについて説明します。


・ Containerは Componentの直接のサブクラスで、 その内部に他のComponentオブジェクトを配置し、位置やサイズを管理する 機能が追加されています。 Containerは abstractなクラスで、実際にプログラム内で利用される Containerのサブクラスである Panel, Window, Frameなどです。 Appletも Panelのサブクラスですから、Containerの機能を継承しています。 Swingのコンポーネントはすべて Containerを継承しています。 以下の説明では Containerのサブクラスのコンポーネントをまとめて、 「コンテナ」と呼ぶことにします。
コンテナの導入によってコンポーネント(ウィンドウ)の位置の管理が 処理しやすくなります。 各コンポーネントは、 その親に当たるコンテナのオブジェクトに対する相対位置で管理されます。 また、コンテナの内部にさらにコンテナを配置することも可能です。 アプリケーションは、一般にこうした階層的にレイアウトされたウィンドウによって 構成されることになります。 また、この後解説するように、 各コンポーネントは自分の内部のコンポーネントのレイアウトの具体的な処理を 行う LayoutManagerと呼ばれるオブジェクトを持つことができます。

コンテナの階層的な構造とLayoutManagerの存在

・ Container新たに定義されているレイアウト関連の主要なメソッド には以下のようなものがあります。

Containerクラスで拡張された主要なメソッドとその働き
メソッド名機能
add()引数で指定したコンポーネントを内部に追加する
remove()引数で指定したコンポーネントを削除する
doLayout()レイアウトを実行する
getCountComponents()内部にあるコンポーネントの個数を返す
getComponent()指定された番号のコンポーネントを返す
getComponents()内部の全コンポーネントを配列として返す
setLayout()レイアウトのポリシーの設定を行う
getLayout()レイアウトのポリシーの現在の状態を返す

これらのメソッドの他に、 コンテイナは内部のコンポーネントの相対的な位置の情報を管理する必要があります。 それらは ComponentのgetLocation(), setLocation()メソッドによって行います。
また、Containerの paint()などのメソッドは、自分自身だけではなく 内部のコンポーネントの paint()も再帰的に呼び出すように定義し直されています。