SWT的Composite可以使用Layout來對其子控件進(jìn)行布局。SWT 提供了5 種布局方式: FillLayout, RowLayout, GridLayout, FormLayout和StackLayout。你也可以定義自己的Layout 。下面將分別介紹這5 種Layout 以及怎樣定義一個新的Layout 。
FillLayout
FillLayout是SWT中最簡單的Layout 類。它把控件以相同的大小分布在單行或者單列上。FillLayout不會自動換行或者換列。通過參數(shù)你可以指定頁邊空白和控件之間距離的大小。
比如下面的代碼
FillLayout layout = new FillLayout(SWT.HORIZONTAL);
layout.marginWidth = 50;
layout.marginHeight = 100;
layout.spacing = 20;
將指定如下圖的 Layout
如果使用SWT.VERTICAL控件將被安置在一列上。不指定什么參數(shù),如果只貼加一個控件將填滿窗口。
用Composite.setLayout(layout) 方法可以指定一個Composite 的Layout 。
FillLayout是按照子控件被貼加的順序?qū)ψ涌丶M(jìn)行布局的,準(zhǔn)確地講是以子控件保存在Composite中順序。而改變一個子控件的Z 順序 ( 用moveAbove或者moveBelow) 會改變子控件的順序。下面的例子演示了這一點,當(dāng)你點一下按鈕時,兩個按鈕會交換位置。
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,應(yīng)該避免將同一個Layout 實例指定給多個Composite。 FillLayout不需要另外對每個子控件指定LayoutData ,而后面講到的另外4 個布局類會需要LayoutData ,同樣的, LayoutData 的實例也是不能被多個子控件所共享的,因為Layout有可能會在LayoutData 中緩沖子控件的位置大小信息,以提高性能。FillLayout是非常簡單的布局算法,多用來放置一個子控件填滿父窗口,而布置多個控件在一行或者一列用RowLayout比較實用。下一節(jié)講RowLayout。
轉(zhuǎn)載請保留
http://www.tkk7.com/xilaile/archive/2007/02/17/100096.html