レイアウト・マネージャ

last modified: Jun./29th/2002; Since: Jan./22nd/2002

前節では、コンポーネントの配置にレイアウト・マネージャの一つである BorderLayout を使いました。正確にいうと、レイアウト・マネージャはコンテナのレイアウト方法を認識しているクラスのためのインタフェースであり、これを実装したクラスはコンポーネントの配置方法を指定することになります。

ここでは Java プラットフォームで提供されている次の6つのレイアウトを紹介します:

  1. FlowLayout
  2. GridLayout
  3. BorderLayout
  4. CardLayout
  5. GridBagLayout
  6. BoxLayout

実際には、これらを組み合わせて理想の配置を実現します。

レイアウト・マネージャの種類

FlowLayout

全ての JPanel コンポーネントのデフォルトレイアウトマネージャです。すべてのコンポーネントを左から右へ配置し、必要があれば改行して続きます。

コンストラクタ

FlowLayout()
デフォルトの 5 単位の水平間隔と垂直間隔を持つ FlowLayout を中央に揃えて構築します。
FlowLayout(int align)
デフォルトの 5 単位の水平間隔と垂直間隔を持つ FlowLayout を指定された配置で構築します。
FlowLayout(int align, int hgap, int vgap)
指定された配置および指定された水平間隔および垂直間隔で新しいフローレイアウトマネージャを作成します。

GridLayout

指定された行数に分けて配置します。このとき、全てのコンポーネントのサイズは同じになります。

コンストラクタ

GridLayout()
1 行中にコンポーネントあたり 1 つの列を持つデフォルト指定でグリッドレイアウトを作成します。
GridLayout(int rows, int cols)
指定された数の行と列を持つグリッドレイアウトを作成します。
GridLayout(int rows, int cols, int hgap, int vgap)
指定された数の行と列を持つグリッドレイアウトを作成します。

BorderLayout

全てのコンテント・ペインのデフォルトレイアウト・マネージャです。領域を上、下、左、右、中央の五つに分けて配置します。それぞれは固有のキーワードである、 NORTH, SOUTH, WEST, EAST, CENTER で指定されます。

コンストラクタ

BorderLayout()
コンポーネント間に間隔を設けずに、新しいボーダレイアウトを構築します。
BorderLayout(int hgap, int vgap)
コンポーネント間に間隔を指定して、新しいボーダレイアウトを構築します。

CardLayout

カードを積み重ねるように実装します。

コンストラクタ

CardLayout()
新しいカードレイアウトをサイズゼロの間隔で作成します。
CardLayout(int hgap, int vgap)
指定された水平方向および垂直方向の間隔を使って新しいカードレイアウトを作成します。

GridBagLayout

最も複雑な配置を実現できます。グリッドのように配置しますが、一つのコンポーネントが複数のセルをまたがることが出来ます。また、グリッドとは異なり、行の高さ、列の幅は自在です。

コンストラクタ

GridBagLayout()
グリッドバッグレイアウトマネージャを作成します。

BoxLayout

コンポーネントを単一行、もしくは単一列に配置します。

コンストラクタ

BoxLayout(Container target, int axis)
コンポーネントを左から右、あるいは上から下のどちらにもレイアウトするレイアウトマネージャを作成します。

サンプル

JFrame のコンテント・ペインに、二つのパネルを配置し、各々に別のレイアウト・マネージャを指定します。

LayoutDemo.java:

//awt パッケージのインポート
import java.awt.*;
//swing パッケージのインポート
import javax.swing.*;

class LayoutDemo implements SwingConstants {
	public static void main(String[] args) {
		//JFrame のインスタンス化
		JFrame frame = new JFrame("HowdyGUI");
		//JPanel のインスタンス化
		JPanel panel1 = new JPanel();
		JPanel panel2 = new JPanel();
		//JLabel のインスタンス化
		JLabel label1 = new JLabel("JLabel 1", CENTER);
		JLabel label2 = new JLabel("JLabel 2", CENTER);
		JLabel label3 = new JLabel("JLabel 3", CENTER);
		//JButton のインスタンス化
		JButton button1 = new JButton("JButton 1");
		JButton button2 = new JButton("JButton 2");
		JButton button3 = new JButton("JButton 3");

		//レイアウト・マネージャ
		panel1.setLayout(new BorderLayout());
		//部品の配置
		panel1.add(button1, BorderLayout.CENTER);
		panel1.add(label1, BorderLayout.NORTH);
		//レイアウト・マネージャ
		panel2.setLayout(new FlowLayout());
		//部品の配置
		panel2.add(button2);
		panel2.add(label2);
		panel2.add(button3);
		panel2.add(label3);

		//コンテント・ペインの取得
		Container cont = frame.getContentPane();
		//レイアウトマネージャ
		cont.setLayout(new GridLayout(2,1));
		//コンテントペインに部品を配置
		cont.add(panel1);
		cont.add(panel2);

		//Frame のセットアップ
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.pack();
		frame.setVisible(true);
	}
}

コンパイルと実行:

C:\java>javac LayoutDemo.java

C:\java>java LayoutDemo

LayoutDemo.java の実行結果1
図:実行結果1

二つのパネルが2行1列の GridRayout で配置されています。グリッド・レイアウトは指定された行数、列数の同じ大きさの矩形領域を作り、コンポーネントを配置します。

最初のパネルには、ボタンやラベルが BorderLayout で配置されています。ボーダー・レイアウトは、レイアウト領域を東西南北、中央の五つに分割し、指定された領域にコンポーネントを配置します。

二番目のパネルには、ボタンやラベルが FlowLayout で配置されています。コンポーネントを、その推奨サイズで表示し、出来るだけ一行内に等幅で表示しようとします。レイアウト領域の幅が、コンポーネントの推奨サイズの和を割り込んだら、新しい行を作って、はみ出したコンポーネントをそこに表示します。

LayoutDemo.java の実行結果2
図:実行結果2


Copyright © 2001-2002 SUGAI, Manabu. All Rights Reserved.