Java程序设计之swt教程 下载本文

}

}

b5.setLayoutData(gridData);

new Button(shell, SWT.PUSH).setText(\按钮 6\); Text t1=new Text(shell,SWT.BORDER); t1.setText(\文本框 1\); gridData = new GridData();

gridData.verticalSpan = 2; //跨两行 gridData.horizontalSpan=2; //跨两列

gridData.verticalAlignment = GridData.FILL; //垂直方向充满 gridData.grabExcessVerticalSpace = true; //抢占垂直方向额外空间 gridData.horizontalAlignment = GridData.FILL;//水平方向充满 gridData.grabExcessHorizontalSpace = true;//抢占水平方向额外空间 t1.setLayoutData(gridData); //gridData用于文本框t1 new Button(shell, SWT.PUSH).setText(\按钮 7\); new Button(shell, SWT.PUSH).setText(\按钮 8\); shell.pack(); shell.open();

while (!shell.isDisposed()) {

if (!display.readAndDispatch()) display.sleep(); }

display.dispose();

运行结果如图4.28所示。虽然按钮b1和文本框t1都占两行两列,但由于t1水平方向和垂直方向的alignment属性都是FILL,因此文本框t1充满了两行和两列的空间,而按钮b1的horizontalalignment属性是CENTER,而verticalalignment属性是FILL,所以水平方向居中放置,而垂直方向充满了两行。按钮b4和b5采用了不同的构造方法来创建gridData对象,但都充满了该列的水平空间。

当窗体变大时,由于设置了抢占水平方向和垂直方向额外的空间,即

grabExcessVerticalSpace = true和grabExcessHorizontalSpace = true,所以文本框t1随窗体的拉伸而变大,反之,当窗体缩小时,t1也会缩小。按钮b4和b5设置了水平方向充满属性,所以窗体拉伸时水平方向也会随之拉伸。其余的组件大小不变。如图4.29所示。这说明,如果组件所在的行变宽或列变高,所有具有填充(FILL)属性的组件也会变宽或变高;而具有BEGINNING、CENTER、END属性的组件不会改变其大小。

图4.28 GridData示例 图4.29 窗体拉伸时b4、b5和t1变化

4.4.4 表格式布局

表格式布局(FormLayout类)是一种非常灵活、精确的布局方式,这个布局是SWT2.0版新增的。FormLayout也有专用的布局数据类FormData,此外,还增加了一个FormAttachment类。FormAttachment定义了组件的四边与父容器(Shell、Composite等)的边距,为保证组件在父容器中的相对位置不变,FormAttachment类用不同的构造方法来实现组件的定位,用FormData和FormAttachment配合,可以创建复杂的界面,而且当主窗体大小改变时,组件的相对位置能保持相对不变。FormLayout的构造方法:FormLayout()。

1.FormLayout的属性

int marginWidth:设置组件与容器边缘的水平距离,默认值为0。 int marginHeight:设置组件与容器边缘的垂直距离,默认值为0。 例如,以下代码把父容器(shell)的四周边距都设置成10像素。 Display display = new Display (); Shell shell = new Shell (display);

FormLayout formlayout= new FormLayout (); formlayout.marginHeight = 10; formlayout.marginWidth = 10; shell.setLayout (formlayout); 2.FormData类

① FormData的构造方法

FormData() 默认构造方法,组件的宽度和高度要用属性width和height设置。 FormData(int width,int height) 参数width和height设置组件的宽度和高度。 ② FormData的属性

width 设置组件的宽度。 height 设置组件的高度。

top 和FormAttachment配合设置组件顶部和父容器顶部的边距。 bottom 和FormAttachment配合设置组件底部和父容器底部的边距。 left 和FormAttachment配合设置组件左边和父容器左边的边距。 right 和FormAttachment配合设置组件右边和父容器右边的边距。

如果FormData中的width和height设置的宽度和高度与FormAttachment设置的约束发生冲突,则按照FormAttachment设置,width和height的设定值就不起作用了。

3.FormAttachment类

Attachment的含义是附着、粘贴。FormAttachment类就是用来指定组件在父容器中的粘贴位置。FormAttachment计算组件粘贴位置和组件大小的方法是依据下面的表达式:

y = ax + b

表达式中y是纵坐标,从上往下是正方向;x是横坐标,从左至右是正方向;a是斜率(a=m/n,n≠0),b是偏移量,沿x、y轴正方向的偏移量为正,反之为负。.

① FormAttachment的构造方法

FormAttachment() 组件紧贴父容器的左边缘和上边缘,如果父容器设置了FormLayout属性marginWidth和marginHeight,则距父容器的上边缘和左边缘为marginHeight和marginWidth的设定值。

FormAttachment(Control control) 以指定的组件control为参照物。

FormAttachment(Control control, int offset) 以指定的组件control为参照物,相对指定

组件的偏移量为offset。

FormAttachment(Control control, int offset,int alignment) 以指定的组件control为参照物,相对指定组件的偏移量为offset,对齐方式为alignment。alignment的取值如下:

SWT.TOP、SWT.BOTTOM、SWT.LEFT、SWT.RIGHT、SWT.CENTER

FormAttachment(int m,int n, int offset) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,n为a的分母,offset是偏移量。

FormAttachment(int m, int offset) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,a的分母为默认值100,offset是偏移量。

FormAttachment(int m) 以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位,m为a的分子,a的分母为默认值100,偏移量为默认值0。

例4.15 FormData与FormAttachment的配合使用。

package edu.ch4;

import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class Sample4_15 {

Display display = new Display (); Shell shell = new Shell (display); shell.setText(\示例\);

FormLayout formLayout= new FormLayout(); //创建表格布局对象formLayout shell.setLayout(formLayout); //设置shell的布局方式为表格布局 formLayout.marginHeight = 10; //设置shell的上下边距为10像素 formLayout.marginWidth = 20; //设置shell的左右边距为10像素 Button b1=new Button(shell,SWT.PUSH); b1.setText(\);

FormData formData1=new FormData(); //创建布局数据对象formData1 formData1.width=100; //按钮b1的宽度为100像素 formData1.height=50; //按钮b1的高度为50像素

b1.setLayoutData(formData1); //设置b1的布局数据为formData1

Button b2=new Button(shell,SWT.PUSH); b2.setText(\);

//创建FormAttachment对象formAttachment,以b1为参照物

FormAttachment formAttachment=new FormAttachment(b1); //指定B1为参照物 FormData formData2=new FormData(50,30); //创建FormData对象,宽度50,高度30 formData2.left=formAttachment; //b2的左边紧贴与b1的右边 b2.setLayoutData(formData2); //设置b2的布局数据为formData2

Button b3=new Button(shell,SWT.PUSH); b3.setText(\);

FormData formData3=new FormData();//创建布局数据对象formData3 public static void main(String[] args) {

formData3.top=new FormAttachment(b2,10,SWT.BOTTOM);//b2的底边与b3的顶部距离为10 formData3.left=new FormAttachment(b2,0,SWT.LEFT);//b2的左边与b3左边位移为0,

//即左边对齐

formData3.right=new FormAttachment(b2,0,SWT.RIGHT); //b2的右边与b3右边对齐 b3.setLayoutData(formData3); //设置b3的布局数据为formData3

shell.pack();

shell.open();

while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } }

display.dispose(); } }

运行结果如图4.30所示。本例中,按钮B1的宽度和高度由FormData设置,按钮的位置为默认的位置,即shell的左上角,边距由maginHeight和maginWidth设置。按钮B2以B1为参照物,位置紧靠B1右侧,B2的上部与shell的距离由maginHeight设定,B2的右边与shell的边距由maginWidth设定。按钮B3以B2为参照物,FormData3.TOP设定了B3的顶部距离B2的底部位移为10像素、FormData3.LEFT设定了B3与B2左边对齐、FormData3.RIGHT设定了B3与B2右边对齐。如果要使B1右侧与B2左侧相距20相素,可将FormAttachment的构造方法增加偏移量20,如:

FormAttachment formAttachment=new FormAttachment(b1,20); 运行结果如图4.31所示。

图4.30 FormAttachment(b1) 图4.31 FormAttachment(b1,20)

构造方法FormAttachment(int m,int n, int offset) 是以组件相对于父容器宽度或高度的百分比(即斜率a)来给组件定位的,当分子m=0时,组件以父容器的左边或上边为基准,偏移量为正数;当分子m=100时,组件以父容器的右边或下边为基准,偏移量为负数。当父容器的大小改变时,组件与父容器的基准边保持设定的距离,组件的大小随父容器的改变而变化。

例4.16构造方法FormAttachment(int m,int n, int offset)的使用示例。

package edu.ch4;

import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; public class Sample4_16 {

public static void main(String[] args) {

Display display = new Display ();