CodeZine(コードジン)

特集ページ一覧

Swing再入門 JavaにおけるGUIのレイアウト

第1回 レイアウトを考える

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/08/29 14:00

一応、Javaは一通り覚えた、という人へ。Swingを本当に使えていますか? 今回からSwingのちょっとうろ覚えな部分をおさらいしていくことにしましょう。まずは、GUIの基本である「レイアウト」についてです。

目次

はじめに

 Javaを初めて覚えようとするとき、多くの人はどのような順番に学習していくでしょうか。Java文法、基本的なクラスライブラリ、ファイルの入出力やスレッド、そしてAWT/Swing。大体、このあたりまで一通り使えるようになったところで、「そろそろビギナー卒業かな?」と思うのではないでしょうか。

 が、「一通り覚えた」と「マスターした」は大きく違います。中でも、特に注目してほしいのが、Swingです。Swingは非常に大きなライブラリであり、そう簡単にマスターできるものでもありません。が、「AWTの強化版だろう」ぐらいなつもりで、JButtonやJFieldなど主なコンポーネントとイベント関係を一通り使ってみて「わかった、わかった!」と通過してしまった人は意外に多いんじゃないでしょうか。

 こうした「通り一遍にSwingを通り過ぎてしまった人」のために、もう一度改めてSwingの機能をおさらいしていこうと思います。

対象読者

  • Javaの基本機能は一通り覚えた、というビギナーを卒業しかけている人。
  • Swingはマスターした? といわれると、ちょっと自信がない人。
  • これからはクライアントサイドが注目されると信じている人。

JFrameへの組み込み

 皆さんは、Swingと言うとどのようなイメージを持っているでしょうか。高機能だがAWTより面倒、と思っている人、多いんじゃないでしょうか。では、まずコンポーネントの組み込みあたりから見ていくことにしましょう。

package jp.codezine;

import java.awt.*;
import javax.swing.*;

public class SampleApp extends JFrame {
    private static final long serialVersionUID = 1L;
    private JLabel label;
    
    public SampleApp(){
        this.setSize(new Dimension(300,200));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        label = new JLabel("Hello");
        label.setFont(new Font("Serif",Font.PLAIN,28));
        this.add(label,BorderLayout.CENTER);
    }

    public static void main(String[] args) {
        new SampleApp().setVisible(true);
    }
}
JFrameにJLabelを組み込んだだけのシンプルなSwingアプリケーション。
JFrameにJLabelを組み込んだだけのシンプルなSwingアプリケーション。

 非常に単純なSwingアプリケーションの例です。単にJLabelを組み込んで表示しているだけです。が、中には「何か違う」と感じた人もいるんじゃないでしょうか。まず、コンポーネントの組み込みにthis.addとしています。getContentPaneがない、と思った人。JavaSE 5.0より、JFrameへの組み込みはコンテントペインではなく、JFrameに直接組み込むことが可能になっています。

 では、コンテントペインはなくなったのか? いえいえ、そうではありません。thisaddするとコンテントペインにコンポーネントが組み込まれるように機能修正されているのです。実際にはコンテントペインにコンポーネントは組み込まれているけれど、それをあたかもJFrameに直接組み込んであるかのように扱うことができる、というわけです。

 もちろん、互換性の観点から、従来どおりthis.getContentPane().addとしても問題なく動きます。

使ってますか? BoxLayout

 コンポーネント類は、レイアウトマネージャを元にしてレイアウトされます。レイアウトの方式を変えるには、このレイアウトマネージャを変更すればいい――このあたりはSwingでもAWTでも同じです。が、実はSwingにはAWTとは異なる部分があります。それは、「Swing専用のレイアウトマネージャがある」という点です。レイアウトマネージャはAWTと共通、と思い込んでいる人、いませんか?

package jp.codezine;

import java.awt.*;
import javax.swing.*;

public class SampleApp extends JFrame {
    private static final long serialVersionUID = 1L;
    
    public SampleApp(){
        this.setSize(new Dimension(300,200));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BoxLayout boxlayout =
            new BoxLayout(this.getContentPane(),BoxLayout.Y_AXIS);
        this.setLayout(boxlayout);
        for(int i = 0;i < 5;i++){
            JButton btn = new JButton("button" + i);
            btn.setFont(new Font("Serif",Font.PLAIN,18));
            this.add(btn);
        }
    }

    public static void main(String[] args) {
        new SampleApp().setVisible(true);
    }
}
BoxLayoutを使ったレイアウト。これは縦一列にJButtonを並べたところ。
BoxLayoutを使ったレイアウト。これは縦一列にJButtonを並べたところ。

 これは、BoxLayoutというレイアウトマネージャを使った例です。このBoxLayoutは、JavaSE 5.0から用意されている新しいレイアウトマネージャです。

 BoxLayoutは、縦一列や横一列にコンポーネントを並べるときに便利です。例えば、ツールパレットのようなものを作るときには重宝します。「GridLayoutがあるじゃないか」と思われた人。GridLayoutは、組み込むコンポーネントの個数が決まっていないときには少々不便でしょう?

 このBoxLayoutは、次のような形でインスタンスを作成します。

new BoxLayout( [コンテナ] , [並び順] );

 第1引数には、BoxLayoutを組み込むコンテナを指定します。 ここでは、this.getContentPaneが指定されていますね。このとき注意すべきは「コンテナの指定はthisではダメ!」ということでしょう。コンポーネントの組み込みなどはthis.addでよかったので「じゃあ、これもthisでいいのか」と思いがちですが、this.addでの組み込み先は、実際にはthisではなくコンテントペインです。

 第2引数には、並び順の方式を示すint値が指定されます。これは、BoxLayoutに用意されているstaticフィールドを指定します。ここでは、縦一列に並べるY_AXISを指定してあります。この他のものを使うことで縦一列にしたり、折り返し表示させることも可能です。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

あなたにオススメ

著者プロフィール

  • 掌田 津耶乃(ショウダ ツヤノ)

    三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。 ※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開中。またGoogle+プロフィールはこちら。

バックナンバー

連載:Swing再入門
All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5