}
}
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 ();