【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷


第6回 SWTレイアウトを活用しよう


米持幸寿
2006/6/1


米持先進技術工房 @IT分室では、テクノロジー・エバンジェリスト 米持幸寿氏が、J2EEの最新技術情報を提供します。最新技術の中身をいち早くキャッチアップしたい読者のためのコーナーです。

 SWTでコンポーネントを作っていくには、前回解説したようにCompositeのサブクラスにCompositeのサブクラスを載せていくということの繰り返しとなります。この場合、Compositeをどのように配置するかを自動調整してくれるのがレイアウトです。オブジェクト指向のGUIツールキットは、多くの場合レイアウトを持っています。AWT、Swingなどにも、同様にレイアウトがあります。

 レイアウトを利用しない(null を設定)で画面を作る作業は、視覚的にわかりやすいため使うのが簡単ですが、筆者はあまりお勧めしません。ウィンドウシステムやIDEの設定によってフォントの大きさが変わると正しく表示されないですし、表示言語が変わったときも正しく表示されません。また、最近はウィンドウソフトウェアは「アクセシビリティ(視覚障害などを持つ人が使いやすいソフトウェアを作ること)」が重要視されています。そういったときにはレイアウトを利用しておかないと正しく動作しないからです。

 また、Shellを持ったウィンドウアプリケーションや、ワークベンチ上に表示されるビューなどは表示サイズが変化します。そのようなとき、ウィンドウの周りに表示される部品を都合よく配置するにもレイアウトの利用は不可欠と考えていいでしょう。

 レイアウトは全部で4種類あり、一度にすべてを説明するのは無理です。今回は全体を簡単に解説し、次回以降でJVE上での操作を含めて、細かい動作を説明します。

SWTのレイアウトの種類

 SWTで利用できるレイアウトを表1にまとめました。

表1 SWTで提供されるレイアウト
レイアウトクラス名 レイアウトデータ 説明
null - 自動配置しない
FillLayout - コンポーネントを均等に割り付ける
RowLayout RowData 行として配置する
GridLayout GridData グリッド(格子)状に配置する
FormLayout

FormData
FormAttachment

相対位置の指定で詰める

 nullは正確にはレイアウトではなく、レイアウトをセットしないということです。

 レイアウトデータとは、レイアウトにCompositeクラスを載せて自動的に配置するときに、配置のされ方を微調整するためのデータをセットするクラスです。Compositeクラスは、初めからレイアウトで再配置されることが想定されているので、レイアウトデータをセットするメソッドsetLayoutData が装備されています。レイアウトデータは、搭載されるCompositeの方にセットします。ただし、FillLayoutにはレイアウトデータはありません。

図1 レイアウトの各クラスの関係

 SWTでは、Compositeクラスに定義されているsetLayoutメソッドでXXXLayoutオブジェクトをセットし、そのCompositeに載せたクラス(引数として渡すことで親ウィンドウに設定されます)が自動配置されるようになります。その関係を示すために、ソースコード例をリスト1に示します。

package com.yone.swt.sample;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowData;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

public class CodeSample extends Composite {

    public CodeSample(Composite parent, int style) {
        super(parent, style);
        RowLayout rowlayout = new RowLayout(); // レイアウトの準備
        rowlayout.type = SWT.VERTICAL;
        setLayout(rowlayout);

        Label l = new Label(this, SWT.NULL); // ラベル
        l.setText("項目1");

        Text t = new Text(this, SWT.NULL); // テキスト入力フィールド

        Button b = new Button(this, SWT.NULL); // ボタン
        b.setText("OK");

        RowData rowdata = new RowData(); // RowDataの設定
        rowdata.width = 100;
        b.setLayoutData(rowdata);
    }
}

  リスト1をJavaBeanとして実行すると、図2のように表示されます。ここでは、ボタンにのみ「RowData」を渡して、width(幅)を100とセットしているので、ボタンだけが大きくなっているのが分かります。

図2 実行結果

自動レイアウトを使わない場合の配置

 単にCompositeのインスタンスを作った場合、デフォルトのレイアウトは設定されていません。これは、Layoutとしてnullをセットするのと同じことです。

図3 レイアウトを使わない配置

 レイアウトを使わない場合のコンポーネントの配置は、各コンポーネントのsetBounds( )への値の設定で決まります。つまり、コンポーネントごとに1をプログラム的に設定するわけです。JVE上では、コンポーネントを選択し、表示されるインジケーターをドラッグ&ドロップすることで位置決めを行います。

図4 ドラッグによるサイズ変更

  また、「レイアウトのカスタマイズ」という、複数のコンポーネントをきれいに並べるための機能もあります。

図5 レイアウトのカスタマイズ機能

  1/2

 INDEX

SWTレイアウトを活用しよう
Page1
SWTのレイアウトの種類
自動レイアウトを使わない場合の配置
  Page2
コンポーネントを均等に割り付ける − FillLayout
行として配置 − RowLayout
格子を使って並べる − GridLayout
相対位置の指定で詰める − FormLayout




Java Solution全記事一覧

ホワイトペーパーTechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  直属上司が海外にいるのエンジニアに見る
【実例】場所に捉われないワークスタイル

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?