第1回 レイアウトを考える
掌田 津耶乃 [著] 2007/08/29 14:00

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

1 2 3 4 →

はじめに

 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を指定してあります。この他のものを使うことで縦一列にしたり、折り返し表示させることも可能です。


1 2 3 4
→
INDEX
Swing再入門 JavaにおけるGUIのレイアウト
Page1
はじめに
対象読者
JFrameへの組み込み
使ってますか? BoxLayout
知ってました? GroupLayout
独自に並べる最も単純な方法は?
レイアウトマネージャ、作れますか?
LayoutManager2は使えますか?
まとめ
プロフィール
掌田 津耶乃 ショウダ ツヤノ

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆活動をする傍ら、ログハウスの普及活動にいそしんでいる。(掌田津耶乃のWebサイトはこちら

※現在、新しい入門記事の投稿サイト「libro」を公開中。またGoogle+プロフィールはこちら


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト