レイアウトマネージャについて

SWTで提供されているレイアウトクラスです。

  • FillLayout ウィジェット(Widget)を垂直または水平方向に、一列に同じ大きさに並べるレイアウトです。SWTで提供されているレイアウトの中でもっともシンプルなレイアウトです。
  • RowLayout ウィジェットを垂直または水平方向に複数行に並べて配置するレイアウトです。ウィンドウがリサイズされたときに、収まりきらないウィジェットが次の行に配置されます。
    プロパティは、fill、wrap、spacingなどです。
  • GridLayout ウィジェットをグリッド上に配置するレイアウトです。配置したWidgetのmarginや位置合わせなど、細かい設定も可能です。
    HTMLのテーブルタグの感覚で配置でき、使いやすいレイアウトといえます。
  • FormLayout SWT独自のレイアウトで、WidgetをWindow内部の相対位置や、別のウィジェットとの相対位置で配置を指定できるものです。非常に柔軟性のあるレイアウトです。
  • StackLayout Stack式のLayout、もっと上のコントロールのみを表示する

それぞれのレイアウトには対応したレイアウトデータクラスというものがあり、配置するウィジェットにデータクラスをセットすることで、より細かなレイアウトを実現できます。
以下に各レイアウトを表にしてまとめます。

レイアウト名 対応するデータクラス
FillLayout 無し
RowLayout RowData
GridLayout GridData
FormLayout FormData

FillLayout

名前のとおり領域いっぱいにコンポーネントを配置するLayoutです。コンストラクタで水平方向か、垂直方向かを指定できます。
下の例では、GroupオブジェクトにFillLayoutを設定してありますが、Shellオブジェクトにも同じようにレイアウトを設定することができます。

  • プロパティ:
  • 並び方向:type
    1
      layout.type=SWT.HORIZONTAL/SWT.VERTICAL;// デフォルト水平方向
    
  • 余白:marginHeight、marginWidth、spacing
    1
    2
    3
      layout.marginHeight=10;// 上下余白高さをセット
      layout.marginWidth=10; // 左右余白幅をセット
      layout.spacing=5;      // コントロールの間隔をセット
    

RowLayout

RowLayoutは水平/垂直方向にコントロールを配置できるレイアウトです。
RowLayoutのtypeフィールドで水平方向か垂直方向の配置を指定でき、各コントロールのサイズをRowDataで設定できる。
- プロパティ: - 改行表示:wrap

1
layout.wrap=true/false;// デフォルト:true
- エリア大きさ:pack
1
layout.pack=false/true;// デフォルト:true
- 並び方向:type
1
layout.type=SWT.VERTICAL/SWT.HORIZONTAL;// デフォルト水平方向
- 行幅に合わせるかを設定する:justify
1
layout.justify=true/false;// デフォルト:false
:layout.justify=trueになる場合は,layout.spacingを再度設定しても,ウィンドウのサイズは大きくなければ、その設定を無効になります。 - 余白と間隔:marginLeft、marginTop、marginRight、marginBottom、spacing デフォルト:3px
1
2
3
4
5
layout.marginLeft=10;
layout.marginTop=10;
layout.marginRight=10;
layout.marginBottom=10;
layout.spacing=10;
- コントロールのサイズ:RowData
1
setLayoutData(new RowData(int width, int height));
- Monospaced:fill
1
layout.fill=true;// デフォルトfalse

GridLayout

GridLayoutは格子状にコンポーネントを配置するレイアウトです。
HTMLのテーブルタグの感覚で配置します。配置する格コンポーネントのレイアウト情報は、GridData経由で設定します。
GridLayoutで注意しなければいけないのは、SWTの仕様上GridDataのインスタンスを再利用してはいけないということです。再利用すると正しくレイアウトが表示されません。

  • プロパティ:
  • 列数:numColumns
    1
    layout.numColumns=3;// デフォルト:1列
    
  • 列の幅を同じように:makeColumnsEqualWidth
    1
    layout.makeColumnsEqualWidth=true;// デフォルト:false
    
  • 余白と間隔: marginLeft、marginTop、marginRight、marginBottom、horizontalSpacing、verticalSpacing
    デフォルト:5px
    1
    2
    3
    4
    5
    6
    layout.marginLeft=10;       // 左余白
    layout.marginTop=10;        // 上余白
    layout.marginRight=10;      // 右余白
    layout.marginBottom=10;     // 下余白
    layout.horizontalSpacing=10;// 水平間隔
    layout.verticalSpacing=10;  // 垂直間隔
    
  • 大きさ:GridData 注:GridDataオブジェクトを重複使えないように
  • Cell Alignment:horizontalAlignment/verticalAlignment

    • 水平Align方式(horizontalAlignment)の定数(デフォルト:SWT.BEGINNING)

      定数 意味
      SWT.BEGINNING /2.左詰め
      SWT.LEFT
      SWT.CENTER センタリング
      SWT.END /2.右詰め
      SWT.RIGHT
      SWT.FILL 水平でCellの幅に合わせ
    • 縦方向Align方式(verticalAlignment)の定数(デフォルト:SWT.CENTER)

      定数 意味
      SWT.BEGINNING /2.上詰め
      SWT.TOP
      SWT.CENTER センタリング
      SWT.END /2.下詰め
      SWT.BOTTOM
      SWT.FILL 縦方向でCellの幅に合わせ
      - インデント設定:horizontalIndent/verticalIndent
      ==デフォルト:0px=
      1
      2
      gridData.horizontalIndent=20;// 水平方向インデント:20px
      gridData.verticalIndent=20;//  縦方向インデント:20px
      
      - 行列でCell合併表示:horizontalSpan/verticalSpan
      1
      2
      gridData.horizontalSpan=2;// 水平2Cellを合併
      gridData.verticalSpan=2;// 縦2Cellを合併
      
      - Cellエリアは、ウィンドウ大きさの変更より変わる:grabExcessHorizontalSpace/grabExcessVerticalSpace
      ウィンドウ大きさを変更した時に、設定されたCellの大きさも変更します。デフォルト:false。
      1
      2
      gridData.grabExcessHorizontalSpace=true;// 横方向で
      gridData.grabExcessVerticalSpace=true;// 縦方向
      
      - コントロールの最小大きさ:minimumWidth/minimumHeight
      注:grabExcessHorizontalSpace=true/grabExcessVerticalSpace=trueになる場合のみ有効
      1
      2
      gridData.minimumWidth=100;// 最小幅
      gridData.minimumHeight=100;// 最小高さ
      
      - コントロールの大きさ:widthHint/heightHint
      ==コントロールの幅と高さを設定すること。ウィンドウのサイズを大きくに変更するときにコントロールのサイズも変わります。
      画面を初めて実行されたタイミングでのエフェクトです。ウィンドウのサイズを変わった後で、コントロールのサイズも再計算する。
      1
      2
      gridData.widthHint=100;// 设置幅
      gridData.heightHint=100;// 设置高さ
      
      - スタイル定数参照表
      GridDataを生成するための定数スタイル
    スタイル定数 プロパティ設定
    GRAB_HORIZONTAL grabExcessHorizontalSpace=true
    GRAB_VERTICAL grabExcessVerticalSpace=true
    HORIZONTAL_ALIGN_BEGINNING horizontalAlignment=SWT.BEGINNING
    HORIZONTAL_ALIGN_CENTER horizontalAlignment=SWT.CENTER
    HORIZONTAL_ALIGN_END horizontalAlignment=SWT.END
    HORIAONTAL_ALIGN_FILL horizontalAlignment=SWT.FILL
    VERTICAL_ALIGN_BEGINNING verticalAlignment=SWT.BEGINNING
    VERTICAL_ALIGN_CENTER verticalAlignment=SWT.CENTER
    VERTICAL_ALIGN_END verticalAlignment=SWT.END
    VERTICAL_ALIGN_FILL verticalAlignment=SWT.FILL
    FILL_BOTH horizontalAlignment=SWT.FILL/verticalAlignment=SWT.FILL

FormLayout

org.eclipse.swt.layout.FormLayoutは他のウィジェットとの相対位置で配置を指定するレイアウトです。   各ウィジェットのレイアウト情報はFormDataクラスとFormAttachmentクラスを使用して設定します。

  • プロパティ:
  • 余白と間隔:marginLeft、marginTop、marginRight、marginBottom、marginWidth、marginHeight、spacing デフォルト:0px GridLayoutと違うです
  • FormData FormDataを生成するときに下記のプログラムを指定すること

    1
    2
    3
    4
    formData.top = new FormAttachment(0, 60);// TopまでのPX
    formData.bottom = new FormAttachment(100, -5);// bottomまでのPX
    formData.left = new FormAttachment(20, 0);// 左側までのPX
    formData.right = new FormAttachment(100 -3);// 右側までのPX
    
  • 使用FormAttachment

    • new FormAttachment(int numerator, int offset); numerator:パーセント値(割合、分母100になる)
      offset:オフセット,>0正方向移動,<0逆に。
    • new FormAttachment(int numerator, int denominator, int offset); numerator:分子の数
      denominator:分母
      offset:オフセット
  • コントロール参照位置 FormAttachmentを使うとコントロールの参照位置を設定できます。FormAttachment(Control control, int offset, int alignment)のコンストラクタも使えます。
    Control:コントロールオブジェクト
    offset:オフセット
    alignment:SWT.TOP、SWT.BOTTOM、SWT.LEFT、SWT.RIGHT、SWT.CENTER/SWT.DEFAULT

StackLayout

StackLayoutは、TabFolderと似っていますが,もっと上のコントロールのみ表示できること

サンプル

FillLayout

サンプル:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
//デフォルトのFillLayoutはHORIZONTAL
shell.setLayout(new FillLayout());
Group group1 = new Group(shell, SWT.NONE);
group1.setText("FillLayout HORIZONTAL");
group1.setLayout(new FillLayout(SWT.HORIZONTAL));
new Button(group1, SWT.PUSH).setText("Button1");
new Button(group1, SWT.PUSH).setText("Button2");
new Button(group1, SWT.PUSH).setText("Button3");

Group group2 = new Group(shell, SWT.NONE);
group2.setText("FillLayout VERTICAL");
group2.setLayout(new FillLayout(SWT.VERTICAL));
new Button(group2, SWT.PUSH).setText("Button1");
new Button(group2, SWT.PUSH).setText("Button2");
new Button(group2, SWT.PUSH).setText("Button3");

RowLayout

サンプル:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
         shell.setLayout(new FillLayout());
         //------- Group1
         Group g1 = new Group(shell, SWT.NONE);
         g1.setText("HORIZONTAL");
         RowLayout layout1 = new RowLayout();
         layout1.type = SWT.HORIZONTAL;
         g1.setLayout(layout1);
         Button b1 = new Button(g1, SWT.PUSH);
         b1.setText("Big");
         b1.setLayoutData(new RowData(100,50));
         Button b2 = new Button(g1, SWT.PUSH);
         b2.setText("Medium");
         b2.setLayoutData(new RowData(70, 50));

         Button b3 = new Button(g1, SWT.PUSH);
         b3.setText("Small");
         b3.setLayoutData(new RowData(40,50));

         //------- Group1
         Group g2 = new Group(shell, SWT.NONE);
         g2.setText("VERTICAL");
         RowLayout layout2 = new RowLayout();
         layout2.type = SWT.VERTICAL;
         g2.setLayout(layout2);

         Button b4 = new Button(g2, SWT.PUSH);
         b4.setText("Big");
         b4.setLayoutData(new RowData(100,50));

         Button b5 = new Button(g2, SWT.PUSH);
         b5.setText("Medium");
         b5.setLayoutData(new RowData(70, 50));

         Button b6 = new Button(g2, SWT.PUSH);
         b6.setText("Small");
         b6.setLayoutData(new RowData(40,50));

GridLayout

サンプル1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        GridLayout layout = new GridLayout();
        layout.numColumns = 3;
        shell.setLayout(layout);

        GridData gd = null;

        new Button(shell, SWT.PUSH).setText("Button1");
        new Button(shell, SWT.PUSH).setText("Button2");
        new Button(shell, SWT.PUSH).setText("Button3");

        Button b4 = new Button(shell, SWT.PUSH);
        b4.setText("Button4");
        gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.horizontalSpan = 2;
        b4.setLayoutData(gd);

        new Button(shell, SWT.PUSH).setText("Button5");

        Button b6 = new Button(shell, SWT.PUSH);
        b6.setText("Button6");
        gd = new GridData(GridData.FILL_BOTH);
        gd.verticalSpan = 2;
        b6.setLayoutData(gd);

        new Button(shell, SWT.PUSH).setText("Button7");
        new Button(shell, SWT.PUSH).setText("Button8");
        new Button(shell, SWT.PUSH).setText("Button9");
        new Button(shell, SWT.PUSH).setText("Button10");

  • "サンプル2": //TODO

FormLayout

サンプル:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// FormLayoutに設定
shell.setLayout(new FormLayout());
// ボタン
Button button = new Button(shell,SWT.NULL);
button.setText("PUSH");
FormData buttonData = new FormData();
buttonData.top   = new FormAttachment(0,0);   // ウィンドウの上側にはりつく
buttonData.right = new FormAttachment(100,0); // ウィンドウの右側にはりつく
button.setLayoutData(buttonData);
// テキストフィールド
Text text = new Text(shell,SWT.BORDER);
FormData textData = new FormData();
textData.top   = new FormAttachment(0,0);      // ウィンドウの上側にはりつく
textData.left  = new FormAttachment(0,0);      // ウィンドウの左側にはりつく
textData.right = new FormAttachment(button,0); // ボタンの左側にはりつく
text.setLayoutData(textData);
text.setText("これはFormLayoutの設定サンプル!");