第11回 JVEで編集できないレイアウトを2つ紹介


米持幸寿
2007/4/25

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

今回の主な内容

相対位置で調整するFormLayout
画面を重ねるレイアウト ― StackLayout

 連載第7回より引き続き、SWTで使用できるレイアウトの詳細について解説していますが、今回はJVEで編集できないレイアウトを2種類紹介します。

 FormLayoutは、相対位置でレイアウトを調整していくレイアウトです。残念ながら、JVEでは編集できず、コーディングでの利用となります。

 StackLayoutは、JVEで編集できないカスタム・レイアウトですが、日本のアプリケーションには画面遷移型のアプリケーションが多いため、利用する機会は多いと思いますから、解説しておきたいと思います。

編集部注:JVEについては連載第2回を、[SWTで使用できるレイアウトの種類]については連載第6回を、参照してください。

 相対位置で調整するFormLayout

 FormLayoutは、JVEで編集できないので、コーディングで実装していきます。

 Visual Classとして追加したコンポーネントでも、普通のJavaクラスとして追加したコンポーネントから始めても構いません。FormLayoutをCompositeにセットしましょう。

リスト1 FormLayoutを設定
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Composite;

public class FormLayoutSample extends Composite {

    public FormLayoutSample(Composite parent, int style) {
        super(parent, style);
        setLayout(new FormLayout());
    }
}

FormDataとFormAttachmentで細かく設定

 FormLayoutに載せるコンポーネントには、FormDataを与えてレイアウトを調整していきますが、FormDataにはさらに、FormAttachmentというオブジェクトを付けて与えます。このFormAttachmentオブジェクトが、対象となるオブジェクトのすべての辺ごとに与えられることによって、相対調整されるコンポーネントとの関係を細かく設定していくことができます。

 FormDataには、以下のプロパティがあります。

表1 FormDataのプロパティ
プロパティ名 属性 説明
width int 部品の幅を指定
height int 部品の高さを指定
left FormAttachment 対象部品の左側を調整するためのFormAttachment
right FormAttachment 対象部品の右側を調整するためのFormAttachment
top FormAttachment 対象部品の上側を調整するためのFormAttachment
bottom FormAttachment 対象部品の下側を調整するためのFormAttachment

 widthとheightが指定されていなければ、部品が自分で大きさを決めます。指定されていれば、その大きさに変更されます。

 さらに、FormAttachmentオブジェクトが張り付けられていない部分はレイアウトはいじらないので、部品がその位置を決めますが、張り付けられている場所は、FormAttachmentに指定されている部品への相対位置で自動調整されます。

 FormAttachmentには、以下のプロパティがあります。

表2 FormAttachmentのプロパティ
プロパティ名 属性 説明
control Control 対象のコンポーネント
alignment int 対象のコンポーネントのどこへ合わせるか?
SWT.LEFT、SWT.RIGHT、SWT.TOP、SWT.BOTTOMのいずれか
denominator int 相対位置の分母(デフォルトで100)
numerator int 相対位置の分子
offset int 相対位置からのオフセット

 例えば、ウィンドウに1つだけボタンが付いていて、そのボタンの右端が、親のコンポジットの右端−20ピクセルに配置されるように設定してみます。

図1 ボタンが1つだけ付いた例
図1 ボタンが1つだけ付いた例

 この場合、以下のコードを記述することになります。

リスト2 ボタンを追加
    FormData fd1 = new FormData();
    // 右端を、親コンポーネントに対して
    fd1.right = new FormAttachment(this);
    fd1.right.numerator = 100; // 100%(右端)
    fd1.right.offset = -20; // -20ピクセルの位置に
    button = new Button(this, SWT.NONE);
    button.setText("ボタン");
    button.setLayoutData(fd1); // ボタンを調整

 fd1は、ボタンに与えられるレイアウト・データです。今回は、ボタンの右端の調整のみを行うので、fd1.rightに親のコンポジット(this)に対するFormAttachmentを作ります。このFormAttachmentのプロパティを変更することで位置合わせの調整ができます。

重なった部品をレイアウトできる

 同様に、テーブルをボタンの左端+10ピクセルに合わせ、それ以外を下地のコンポーネントの外側に合わせるようにするには、次のコードを記述します。

リスト3 テーブルを追加
    FormData fd2 = new FormData();
    fd2.right = new FormAttachment(button);
    fd2.right.numerator = 0;
    fd2.right.offset = 10;
    fd2.left = new FormAttachment(this);
    fd2.left.numerator = 0;
    fd2.top = new FormAttachment(this);
    fd2.top.numerator = 0;
    fd2.bottom = new FormAttachment(this);
    fd2.bottom.numerator = 100;
    table = new Table(this, SWT.NONE);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    table.setLayoutData(fd2);

図2 テーブルを追加した例
図2 テーブルを追加した例

 ほかのレイアウトと違い、FormLayoutではこの例のように重なった部品をレイアウトすることも可能です。

  1/2

 INDEX
第11回 JVEで編集できないレイアウトを2つ紹介
Page1
相対位置で調整するFormLayout
  FormDataとFormAttachmentで細かく設定
  重なった部品をレイアウトできる
  Page2
画面を重ねるレイアウト ― StackLayout




Java Solution全記事一覧



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

注目のテーマ

Java Agile 記事ランキング

本日 月間