相信对于组件的布局(Layout)大家都不会太陌生,它的存在就是提供给我们一种可以在组件位置移动或更改大小时重新绘制组件的机制。SWT中的标准布局可以在org.eclipse.swt.layout包中找到。设置各种布局方法很简单,比如设置FillLayout:
1
|
shell.setLayout (
new
FillLayout ());
|
在SWT Designer上有两中方式可以进行布局设置,一个是点击Application Window,然后在属性栏可以找到layout栏,可供选择的布局方式分别有:Absolute layout, FillLayout,GridLayout,FormLayout,RawLayout,StackLayout,GroupLayout。 第二种方法是在Palette中的layout选项卡下也可以选择不同的布局方式,但是比第一中方法多了三个,分别是:BoxLayout 和 BorderLayout,以及FlowLayout。
SWT Designer中默认的布局方式Absolute layout,这是最简单的布局方式,每个组件可以通过函数setBounds(leftTopX,leftTopY,rightDownX,rightDownY),一种坐标的方式来设置组件在Application Window的位置。优点:灵活,鼠标可以随意拖动组件,不足:组件位置固定,不能随窗口的变化而自动调整组件大小。
FillLayout:让所有子组件等大小的”填满”整个面板空间。使用了该布局的容器中的所有控件将以同一尺寸放在一行或者一列中, 它有一个type属性,用来指定布局是采用列排列还行排列, type的属性值为SWT.HORIZONTAL和SWT_VERTICAL, 默认情况下是行排列。如下图:
RowLayout:类似于AWT中的FlowLayout,让所有组件按行排列,一行排不下就放到下一行。RowLayout比FillLayout用得更广泛一些,原因很简单,就是RowLayout支持FillLayout所部支持的功能,例如能够外覆, 能够修改边框和间距等等。另外,每一个位于RowLayout中的窗口组件都可以通过设定一个RowData类来指定其在RowLayout中的宽度和高 度。
GridLayout: GridLayout是3个标准布局类中最有用的,但同时也是最复杂的–没办法,强大的功能必定伴随着一定程度的复杂性。通过GridLayout,一个Composite的子窗口组件被放置在一个网格(Grid)之中。GridLayout有很多配置字段,并且和 RowLayout一样,每一个布局于其中的窗口组件都可以有一个与之相关联的布局数据类,称为GridData。GridLayout的强大功能是通过 对于每一个窗口组件的GridData的灵活控制来实现的。所以一般来说,很少人直接手写GridData,所以借助SWT Designer可视化编程,的确方便了很多。
FromLayout:其是所有布局里面最复杂的一种, 它也使用到自己的LayoutData:FormData, 另外它还会在FormData中通过使用FromAttachment来控制关联控件的位置, FormData可以设置四个FormAttachment实例,分别表示控件的四边与相对控件之间的位置关系。FormAttachment有以下几个成员变量:
alignment 用来指定关联的控件的某个边和相对控件之间的对齐方式, 如果关联的是上下位置,那么可以设置SWT.TOP, SWT.CENTER, SWT.BOTTOM,是左右位置可以设置SWT.LEFT, SWT.CENTER, and SWT.RIGHT, 该属性一般在指定的相对控件不是容器的时候使用, 否则会没有效果。而且通常是使用FormAttachment(int numerator,int offset)这个构造器,也就是百分比+偏移量,前者可以应付容器尺寸变化时内部组件跟着调整;后者以应付精确的布局。
StackLayout是一个用的很少的布局, 从字面意思我们可以看出来, 它是将使用该布局的容器内的所有控件位置,大小设置为相同, 然后层叠在一起,只有位于最上面控件可见, 它使用topControl来指定哪个控件位于堆栈最上层并可见, 如果设置为null表示所有控件均不可见, 设置之后并调用容器的layout()方法才能使指定的控件可见。
GroupLayout,这个好像是Java6的一个新特性。从GroupLayout的单词意思来看,它是以Group(组)为单位来管理布局,也就是把多个组件(如:JLable、JButton)按区域划分到 不同的Group(组),再根据各个Group(组)相对于水平轴(Horizontal)和垂直轴(Vertical)的排列方式来管理。可以参考:http://blog.csdn.net/djsl6071/archive/2007/05/19/1616035.aspx
除了上面介绍的布局之外,SWT Designer还提供了SWING中也有的BoxLayout 和 BorderLayout,以及FlowLayout布局。这个部分可以参考AWT或SWING中对应的布局。