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