SWT的Composite可以使用Layout来对其子控件进行布局。SWT 提供了5 种布局方式: FillLayout, RowLayout, GridLayout, FormLayout和StackLayout。你也可以定义自己的Layout 。下面将分别介绍这5 种Layout 以及怎样定义一个新的Layout 。
FillLayout
FillLayout是SWT中最简单的Layout 类。它把控件以相同的大小分布在单行或者单列上。FillLayout不会自动换行或者换列。通过参数你可以指定页边空白和控件之间距离的大小。
比如下面的代码
FillLayout layout = new FillLayout(SWT.HORIZONTAL);
layout.marginWidth = 50;
layout.marginHeight = 100;
layout.spacing = 20;
将指定如下图的 Layout
如果使用SWT.VERTICAL控件将被安置在一列上。不指定什么参数,如果只贴加一个控件将填满窗口。
用Composite.setLayout(layout) 方法可以指定一个Composite 的Layout 。
FillLayout是按照子控件被贴加的顺序对子控件进行布局的,准确地讲是以子控件保存在Composite中顺序。而改变一个子控件的Z 顺序 ( 用moveAbove或者moveBelow) 会改变子控件的顺序。下面的例子演示了这一点,当你点一下按钮时,两个按钮会交换位置。
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setLayout( new FillLayout());
Button btn1 = new Button(shell, SWT.PUSH);
Button btn2 = new Button(shell, SWT.PUSH);
btn1.setText( " Button A " );
btn2.setText( " Button B " );
Listener listener = new Listener() {
public void handleEvent(Event event) {
((Button) event.widget).moveAbove( null );
shell.layout();
}
};
btn1.addListener(SWT.Selection, listener);
btn2.addListener(SWT.Selection, listener);
shell.open();
while ( ! shell.isDisposed()) {
if ( ! display.readAndDispatch())
display.sleep();
}
display.dispose();
}
程序如下图
SWT要求一个Layout 的实例(Instance)只能指定给一个Composite,应该避免将同一个Layout 实例指定给多个Composite。 FillLayout不需要另外对每个子控件指定LayoutData ,而后面讲到的另外4 个布局类会需要LayoutData ,同样的, LayoutData 的实例也是不能被多个子控件所共享的,因为Layout有可能会在LayoutData 中缓冲子控件的位置大小信息,以提高性能。FillLayout是非常简单的布局算法,多用来放置一个子控件填满父窗口,而布置多个控件在一行或者一列用RowLayout比较实用。下一节讲RowLayout。
转载请保留
http://www.blogjava.net/xilaile/archive/2007/02/17/100096.html