株式会社八角研究所 > 【連載】いまさらSwing - 第3回 レイアウトマネージャー

エンジニア募集中!

独立心旺盛で、新しい技術で新しいWebサービスを作りたいと思っているけれど、ひとりでやることに限界を感じているフリーのエンジニアの方。あなたの期待にこたえられる仲間と環境を、八角研究所なら提供できると思います。社員としてではない関わり方も、あるかもしれません。

2009年04月17日 12:44

いまさらSwing
第3回 レイアウトマネージャー * * * *

by tunakan

Tags: Java 気になる技術をメモりたい Swing

コンポーネントを自由に配置するためには避けて通れないレイアウトマネージャーについて書いてみます。

レイアウトマネージャの仕事

Swing(AWT)では、コンテナに対してadd(Component)/add(Component,int)/add(Component,Object)/add(Component,Object,int)のいずれかのメソッドを使用してコンポーネントを追加します。レイアウトマネージャは、addされたコンポーネントをコンテナ上に「良きに計らって」配置してくれるものです。

例として、FlowLayout(左から順に配置するレイアウトマネージャ)の場合を見てみます。表示される座標などの細かな指示を与えていないにも関わらず、いい感じに配置されています。

FlowLayout

3_1

import java.awt.FlowLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ImasaraSwing3_1 {
    private static void createAndShowGUI() {

        final JFrame f = new JFrame("いまさらSwing3_1");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new FlowLayout());  //レイアウトマネージャにFlowLayoutを設定

        final JButton button1 = new JButton("ボタン1");
        f.add(button1);

        final JButton button2 = new JButton("ボタン2");
        f.add(button2);

        final JButton button3 = new JButton("ボタン3");
        f.add(button3);

        final JButton button4 = new JButton("ボタン4");
        f.add(button4);

        final JButton button5 = new JButton("ボタン5");
        f.add(button5);

        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

LayoutManagerとLayoutManager2

レイアウトマネージャーは、LayoutManagerもしくはLayoutManager2を実装したもので、LayoutManager2を実装したものは、各コンポーネントに対して制約オブジェクトを設定できるので全般的に高機能なものが多くなっています。制約オブジェクトとは、コンテナのadd(Component,Object)/add(Component,Object,int)のObjectで設定され、その値は、各レイアウトマネージャごとに異なります(String型であったり、専用の制約クラスが用意されていたりします)。

例としてLayoutManager2の実装クラスのBorderLayoutを見てみます。BorderLayoutの制約オブジェクトはString型でBorderLayout.NORTH(文字列 "North" )のように定数として定義されています。

BorderLayout

3_2

import java.awt.BorderLayout;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class ImasaraSwing3_2 {
    private static void createAndShowGUI() {

        final JFrame f = new JFrame("いまさらSwing3_1");
        //f.setLayout(new BorderLayout()); //デフォルトでBorderLayoutなので設定しなくてもよい。
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JButton button1 = new JButton("ボタン1");
        f.add(button1, BorderLayout.NORTH);  //制約 NORTH

        final JButton button2 = new JButton("ボタン2");
        f.add(button2, BorderLayout.WEST);  //制約WEST

        final JButton button3 = new JButton("ボタン3");
        f.add(button3, BorderLayout.CENTER);  //制約CENTER

        final JButton button4 = new JButton("ボタン4");
        f.add(button4, BorderLayout.EAST);  //制約EAST

        final JButton button5 = new JButton("ボタン5");
        f.add(button5, BorderLayout.SOUTH);  //制約SOUTH

        f.pack();
        f.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

よく使うレイアウト

個人的にですが、下記レイアウトマネージャーがよく使われているのではないかと思っています。はじめは、これらのレイアウトマネージャーから手をつけてみると良いかもしれません。

  • BorderLayout - 標準で設定されているレイアウトです。適当に作ってもきれいに表示されるので個人的に好きです。
  • GridLayout - 格子状のレイアウトです。1マスの大きさは1×1なのであまり柔軟ではありません。
  • GridBagLayout - GridLayoutよりも柔軟な指定が可能なレイアウトです。HTMLのテーブルを作成するようなイメージです。
  • GroupLayout - 一番新しいレイアウトマネージャです。かなり柔軟ですが、手書きはかなり厳しいです。NetBeansがおすすめです。
  • Null Layout - レイアウトマネージャを使わずに自力で座標を指定して位置を決めます。

この記事の執筆者

九州男児 tunakan 28歳 入社2年目

内臓が全般的に弱いです。データベースは苦手なのに変なデーターベースに当たることが多い気がします。

この人の会社をみる この人関連のイベントをさがす この人と一緒にはたらく

この記事を読んだ人はこんな記事も読んでいます

この日記にコメントする

(メールアドレスは公開されません。メールで返答が欲しい場合などに入力してください)

このエントリへのトラックバックURL

コメント

コメントはありません

トラックバック

トラックバックはありません

メンバー紹介

tunakan

tunakan

内臓が全般的に弱いです。データベースは苦手なのに変なデーターベースに当たることが多い気がします。

boy

boy

少年です。 18歳以下(嘘)でも立派に社員です。 よろしくおねがいします。

はち子さん

はち子

広報を担当している、はち子です。本当は広報じゃなくて事務デスが、広報って言うほうがかっこいいし! 社内でゆいいつ、...