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