本文檔的原文在eclipse網站:http://www.eclipse.org/articles/Understanding%20Layouts/Understanding%20Layouts.htm
winion翻譯整理 Copyright 2001 Object Technology International, Inc.
摘要
採用
SWT編寫應用程式時,通常需要使用布局layouts來設計美觀的介面。一個布局管理著在Composite上面的子組件的大小和位置。布局類是抽象類別Layout的子類。本文檔介紹如何使用標準布局類,以及如何編寫自訂布局類。
原作者Carolyn MacLeod, OTI March 22, 2001
修訂Shantha Ramachandran, OTI May 02, 2002
翻譯 winion 2004.9.19
第一節 概述1.1 布局概述
當使用標準組件庫(SWT)編寫應用程式時,通常需要使用通常需要使用布局layouts來設計美觀的介面。一個布局管理著在Composite上面的子組件的大小和位置。SWT提供了及格標準的布局類,並且可以自訂布局類。
在SWT中,組件的位置和大小不是自動布置的。應用程式可以在初始化時計算Composite的子組件的大小和位置,也可以通過Resize監聽器來調整。如果沒有給定子組件的大小,那麼它們的尺寸將預設為0,因而介面上顯示不出來。
示範了幾個在布局中常用的概念。一個Composite(圖示是一個TabFolder)有一個位置(location)、客戶區(clientArea)和修飾區(trim)。Composite的大小就是客戶區大小加上修飾區大小。本例的Composite有兩個子組件並列排放。Layout用來管理子組件的大小和位置,它可以定義子組件之間的距離(spacing),子組件和邊界之間的空白大小(margin)。Layout的大小和Composite的客戶區大小一致。
一個組件的首選的尺寸(preferred size)是顯示大的內容所需的最小的尺寸。對容器而言,其大小是包含所有子組件的最小的矩形。如果子組件由應用程式放置,容器根據子組件的大小和位置來計算它的首選尺寸。如果容器使用布局類來放置子組件,它就要求Layout來計算它的客戶區尺寸,然後加上修飾區,從而得出它的首選尺寸。
1.2 標準布局
SWT中的標準布局類有:
l FillLayout:以相同的大小單行或單列的排列組件;
l RowLayout:以單行或多行的方式使用fill,wrap,spacing,等選項排列組件;
l GridLayout:在格子中排列組件;
l FormLayout(SWT 2.0的新特性):通過建立組件各個邊的“附件”來排列組件。
要使用標準布局類,需要引入SWT布局類包:
import org.eclipse.swt.layout.*;
布局是可插入的。要設定Composite組件的布局,使用setLayout(Layout)方法。一下代碼示範了,一個Shell(Composite的子類)採用RowLayout來布局它的子組件。
Shell shell = new Shell();
shell.setLayout(new RowLayout());
一個布局類可以有一個相應的布局資料類(Object的子類),可以對指定的子控制項設定具體的布局方式。為了使用方便,布局資料類的名字是通過替換布局類的Layout為Data而得到。例如,標準布局類RowLayout的布局資料類是RowData,GridLayoutt的布局資料類是GridData,FormLayout的布局資料類是FormData。以下代碼示範了如何設定組件的布局資料:
Button button = new Button(shell, SWT.PUSH);
button.setLayoutData(new RowData(50, 40));
1.3 本文檔使用的例子
本文檔的多數螢幕是根據不同變數運行下面範例程式碼得到的。可以更改布局的類型、參數以及子組件的類型和數量:
import org.eclipse.swt.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.layout.*;
public class LayoutExample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
//建立布局
RowLayout layout = new RowLayout();
// 設定可選的選項
layout.wrap = true;
// 設定到容器上
shell.setLayout(layout);
// 建立容器的子組件
new Button(shell, SWT.PUSH).setText("B1");
new Button(shell, SWT.PUSH).setText("Wide Button 2");
new Button(shell, SWT.PUSH).setText("Button 3");
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
}
}
運行上面的代碼,得到:
如果調整上面的介面,使右面放置不下Button 3,那麼RowLayout將折行,在下一行顯示Button 3,
使用布局受調整大小的很大限制。因此本文檔的多數例子示範了如果容器變大或變小將如何布局,以此說明布局的工作原理。
(待續)