17-3:Swingのコンテナとその機能

Swingによって新たに提供さえるコンテナのクラスと、 その機能について調べてみましょう。


・ Swingに提供されるコンポーネントはすべて Containerのサブクラスです。 しかし、コンテナとして専用に利用されるクラスと、直接ユーザー入力を 処理するクラスとは区別しておいた方がいいでしょう。
以下に主要なコンテナクラスをまとめておきます。 表以外にも他のコンポーネントの内部で利用されるコンテナクラスが いくつか存在します。

Swingの主要なコンテナとその機能
クラス名特徴・機能LayoutManagerのクラス
JWindow独立したポップアップウィンドウ デフォルトは null(内部のRootPaneに設定される)
JFrame独立したウィンドウ デフォルトは null(内部のRootPaneに設定される)
JPanel汎用のパネルデフォルトはFlowLayout
JScrollPane大きなコンポーネントをスクロールさせて見せる ScrollPaneLayout
JTabbedPane 複数のコンポーネントを「タグ(しおり)」を付けてページ状に重ねる 独自のものを UIクラス自身が実装
JSplitPane2個のコンポーネントを可動なしきりで区切る 独自のものを UIレベルで用意
JDesktopPane擬似的なウィンドウシステム画面を提供 JRootPane.RootLayout
JInternalFrameJDesktopPane内の擬似的なフレーム デフォルトは null(内部のRootPaneに設定される)
JOptionPaneポップアップのウィンドウなどを生成 なし
Box左から右もしくは上から下に単純に並べる BoxLayout

・ JFrame,JWindow,JPanel は従来の Frame, Window, Panel に相当するコンテナです。 あまり特殊化した機能は持たず、 多くのアプリケーションで共通して利用される存在です。 従来との違いで注意すべきことは、 JFrame, JWindowが内部にさらに JRootPane というコンテナを持つことです。 JRootPaneの内部にはさらに MenuBar や ContentPaneと呼ばれる構造があります。
JFrameなどにコンポーネントをレイアウトする場合には、 通常は JFrameの内部の ContentPane の add()メソッドを呼び出します。 レイアウトの方針を決める LayoutManager を設定する setLayout()に関しても 同様です。 JFrameの内部に存在する JRootPane や JLayeredPaneも Swingで提供されるコンテナのクラスです。


Frame frame = new Frame( "Old Frame" );
Button button = new Button( "Old Button" );
frame.setLayout( new BorderLayout() );
frame.add( new Button( button );

JFrame jframe = new JFrame( "Swing Frame" );
JButton jbutton = new JButton( "Swing Button" );
jframe.getContentPane().setLayout( new BorderLayout() );
jframe.getContentPane().add( jbutton );


JFrameの内部構造
  |
  +- JRootPane -+- glassPane(任意の Component)
                |
                +- layeredPane(LayeredPane)
                       |
                       +- menuBar(JMenuBar オプションで生成) 
                       |
                       +- contentPane(任意の Container)

・ Swingで提供される新しいタイプのコンテナについても見てみましょう。 JSplitPane, JTabbedPane, JDesktopPane などがその代表です。 JScrollPane は jdk1.1 までの ScrollPane と同様の機能を提供します。 特殊化した機能を提供する点では他の新しいコンテナと似ています。


JTabbedPaneの利用例

JDesktopPaneの内部には擬似的なフレームのオブジェクト JInternalFrameを 配置することができます。


JDesktopPaneの利用例