本文檔的原文在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,如圖:
使用佈局受調整大小的很大限制。因此本文檔的多數例子演示瞭如果容器變大或變小將如何佈局,以此說明佈局的工作原理。
(待續)