6-4:コンポーネントとGUI


・ java.awt は GUIの機能を実現するために「コンポーネント(Component)」 と呼ばれるウィンドウのオブジェクトを提供します。 これらは目的に応じてさまざまなタイプのものが利用可能です。 それらは java.awt 及び javax.swingのパッケージのクラスとして定義され、 継承関係によって使用目的ごとにグループ化されています。 もちろんプログラマが独自のコンポーネントを設計することも可能です。 ここではコンポーネントの果たす役割と基本的な仕組みについて解説します。
まず、コンポーネントは大きく2つのグループに分けることができます。 第1のグループは GUIを直接担当するクラスです。 javax.swing.JButton や javax.swing.JTextField などがその典型でしょう。


JButton と JTextField

こうしたコンポーネントは GUIの両面にかかわる機能が含まれています。 ユーザーに対して必要な情報をグラフィックスの表示によって提示することと、 ユーザーからの入力をマウスやキーボードのイベントとして受け付けることです。 ただし受け付けたイベントを処理する機能については、 一般にコンポーネントから分離してリスナ(アダプタ)のクラスにまかせます。 これが「代理人モデル」の考え方でした。
グラフィックスの表示およびイベントの検出(リスナのメソッドの呼び出し)の機構は、 あらかじめコンポーネント内部に備えられています。 この仕組みは、すべてのコンポーネントの共通のスーパークラスである java.awt.Component のレベルで定義されています。


・ コンポーネントのもう一つのグループは、 他のコンポーネントのオブジェクトをレイアウトするための機能を提供するものです。 これらは「コンテナ(Container)」のクラスと呼ばれ、 Componentに レイアウトの機能を追加した java.awt.Containerを共通のスーパークラスとします。 コンテナは自身では直接 GUIの機能は提供しませんが、 内部のコンポーネントのオブジェクトの位置、サイズなどを自動的に調整する 機能を提供します。アプリケーションを構成するためには必須の存在です。 javax.swing.JPanel, javax.swing.JFrame などが典型的なコンテナです。


JPanel と JFrame にレイアウトされたコンポーネント

・ 複雑な機能を持つコンポーネントは、 他の複数のコンポーネントを部品として用いて構成されている場合もあります。 たとえば javax.swing.JColorChooser は、 ユーザーからの入力を直接取り扱う javax.swing.JSlider などと、 それらをレイアウトするためのコンテナから構成されています。


複合的な構造を持つ JColorChooserのコンポーネント

また、 javax.swing のほとんどのコンポーネントの共通のスーパークラスである javax.swing.JComponent は、java.awt.Component だけではなく java.awt.Container のサブクラスでもあります。 このため、すべての Swingコンポーネントは、 実はコンテナとしての機能を備えています。 少し意外な気がしますが、 この設計によって Swingコンポーネントのデザインが非常に柔軟なものになります。 また JColorChooserなどの複合的な構造を持つコンポーネントも JComponentの直接のサブクラスとして定義することができるわけです。