【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  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!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

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

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

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

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています