Layout依据所给类型的特定规则来控制容器中组件的位置与大小。SWT有四种Layout类型:FillLayout、GridLayout、RowLayout、FormLayout。
1.将layout加入到容器中
使用layout的第一个步骤就是创建layout的对象,第二步骤就是对容器的对象调用setLayout方法来讲layout对象加入到容器中。
s.setLayout(new FillLayout());
2.FillLayout
FillLayout会让widget完全地填满被放置容器的工作区域,当容器调整大小时,widget也会被调整大小以继续填满容器。默认的FillLayout是水平的将widget定位以让widget相邻排列。如果想让widget垂直排列,则需要传递样式参数给FillLayout: SWT.VERTICAL
3.RowLayout
(1)RowLayout能让widget在容器中以行来排列。当行已经被适当调整过大小的widget完全填满时,就会开启新的行来放。
(2)RowLayout默认的行为在窗口大小不足以容下widget时可以自动换行,若不允许自动换行,可以设置RowLayout的属性warp为假,即r.warp=false即可。
(3)RowLayout的另一个属性pack是用来控制容器内widget的初始大小,设定为true时能让RowLayout依据widget的类型与文字来设定创建出不同大小的widget。若要同一行并排的widget有同样的大小,则可以设定r.pack=false;即可。
(4)默认的RowLayout会创建出水平的行,若需要垂直的列,则需要设置SWT.VERTICAL属性给RowLayout。
4.GridLayout
GridLayout类似RowLayout,它也会将widget逐行放置。然而,GridLayout可以指定每行应该有几个widget,创建由行与栏所组成的网格。创建GridLayout的步骤为,先创建出GridLayout的对象,然后额外的指定网格的栏数。
GridLayout g=new GridLayout();
g.numColumns=3;
使用GridLayout可以选择性的使用相应的GridData类来帮助GridLayout完成控制widget的大小与对齐方向的功能。GridData是一种为GridLayout提供处理widget的大小与位置能力的类。每个widget都可以使用它的setLayoutData()方法来进行布局。
final Text t=new Text(s,SWT.MULTI|SWT.BORDER|SWT.WRAP);
GridData gd=new GridData();
gd.horizontalAlignment=GridData.CENTER;
t.setLayoutData(gd);
final Button b=new Button(s,SWT.PUSH);
gd=new GridData();
gd.horizontalAlignment=GridData.CENTER;
b.setLayoutData(gd);
GridData对象的设定控制了widget是如何在每一格中被定位的。相关的设定有:GridData.CENTERED、GridData.BEGINNING、GridData.END。另一个GridData设定控制了widget在格子中是如何调整大小与定位的。可用的设定有:FILL_HORIZONTAL、FILL_VERTICAL、FILL_BOTH。若一个格子被指定了FILL_HORIZONTAL设定,它会扩展本身来填满所放置的格子。另两个额外的GridData实用设定为heightHint与widthHint,它们指定了格子在调整窗口大小时所允许缩小的像素的最小值。为了让一个widget跨越多个格子,可以设定GridData的verticalSpan和horizontalSpan属性。例如gd.verticalSpan=3;
5.FormLayout
SWT的FormLayout是被设计用来简化form的程序设计的。使用FormLayout可以让你将widget固定在窗口上的特定位置,以像素或者容器宽高的百分比来指定widget的宽与高。FormLayout包括两个辅助性类:FormData与FormAttachment。这两个类是必须的,如果没有使用FormData会导致所有的widget堆叠在容器中的同一个位置。
s.setLayout(new FormLayout());
final Label lable1=new Label(s,SWT.RIGHT);
lable1.setText("First Name");
FormData fd=new FormData();
fd.top=new FormAttachment(10,10);
fd.left=new FormAttachment(0,10);
fd.bottom=new FormAttachment(30,0);
fd.right=new FormAttachment(40,0);
lable1.setLayoutData(fd);
final Label lable2=new Label(s,SWT.RIGHT);
lable2.setText("Last Name");
fd=new FormData();
fd.top=new FormAttachment(19,5);
fd.left=new FormAttachment(0,10);
fd.bottom=new FormAttachment(40,0);
fd.right=new FormAttachment(40,0);
lable2.setLayoutData(fd);
final Text t1=new Text(s,SWT.SINGLE|SWT.BORDER|SWT.WRAP);
fd=new FormData();
fd.top=new FormAttachment(lable1,0,SWT.TOP);
fd.left=new FormAttachment(lable1,10);
t1.setLayoutData(fd);
final Text t2=new Text(s,SWT.SINGLE|SWT.BORDER|SWT.WRAP);
fd=new FormData();
fd.top=new FormAttachment(lable2,0,SWT.TOP);
fd.left=new FormAttachment(lable2,10);
t2.setLayoutData(fd);
FormData带有四个边的定位点,它们可以设定widget在form中的位置。四个边依序为left、right、top与bottom,都是FormData类中FormAttachment类型的对象变量。