本文介紹SWT/JFace核心概念、基本控件(Label、Text、Button)、容器(Composite、Group、Shell)、佈局管理器(FillLayout、GridLayout)並構建首個可運行GUI應用。
Eclipse為通用工具平台,提供可擴展IDE基礎。SWT創建Java版本地操作系統GUI控件,依賴本地實現,使應用擁有原生外觀行為、控件集與特殊行為,區別於Swing的跨平台一致性目標。JFace在SWT之上添加高層服務(如模型-視圖分離),不隱藏SWT。關鍵術語:Widget(基礎GUI組件)、Control(擁有OS對等體)、Composite(含其他控件)、Item(被其他控件包含,如列表項)。圖1-3展示繼承層次。

圖 1. SWT Widget 樹

圖 2. SWT Composite 樹

圖 3. SWT Item 列表
所有控件(少數高級除外)創建時需父Composite,自動添加到父控件(自上而下構造)。構造函數參數:父控件與樣式(SWT類中static final int常量,無需樣式用SWT.NONE)。
顯示純文本或圖標,不獲取焦點,無輸入事件。Label不可同時顯示文本與圖標,需用CLabel(custom包)。清單1、2分別創建文本標簽與圖文標簽。
Label label = new Label(parent, SWT.CENTER);
label.setText("This is the label text");
清單 1. 創建一個帶文本的標簽
單行(SWT.SINGLE)或多行(SWT.MULTI),可只讀、限制長度、設置工具提示。清單3創建帶默認文本、長度限制與提示的文本框。
Text name = new Text(parent, SWT.SINGLE);
name.setText("<none>");
name.setTextLimit(50);
name.setToolTipText("Enter your name -- Last, First");
name.selectAll();
清單 3. 創建一個包含選定的默認文本和一個限制條件的文本
樣式:ARROW、CHECK、FLAT、PUSH(最常用)、RADIO、TOGGLE。文本中&創建加速鍵。清單4創建「Clear」按鈕。
Button clear = new Button(parent, SWT.PUSH);
clear.setText("Clea&r");
清單 4. 創建一個按鈕
通過SelectionListener(org.eclipse.swt.events)處理按鈕點擊。清單5匿名內部類打印消息。SelectionAdapter提供空實現減少代碼。事件處理須快速完成(<1秒),耗時操作需單獨線程。
clear.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
System.out.println("Clear pressed!");
}
public void widgetDefaultSelected(SelectionEvent e) {
widgetSelected(e);
}
});
清單 5. 按鈕事件處理程序
嵌套任意層級,混合匹配子控件,可帶邊框(SWT.BORDER)或無邊框。清單6創建帶邊框Composite。
Composite子類,支持標題(setText),常包裹單選按鈕組。清單7創建帶陰影邊框與標題的Group。
可能無父Composite,父為Display。常用樣式SWT.SHELL_TRIM(框架)、SWT.DIALOG_TRIM(對話框)。可模態/非模態,子Shell為獨立桌面窗口(父關閉則子關閉)。清單8、9分別創建框架與對話框Shell,圖4、5對比外觀。
Shell frame = new Shell(SWT.SHELL_TRIM);
Shell dialog = new Shell(frame, SWT.DIALOG_TRIM);

圖 4. 具有 SWT.SHELL_TRIM 的 shell

圖 5. 具有 SWT.DIALOG_TRIM 的 shell
兩種定位方式:絕對定位(手動設XY/寬高)與托管定位(LayoutManager)。推薦後者適應可變尺寸。SWT提供FillLayout、GridLayout等,重設Composite大小時自動重新定位。
按行/列排列,子控件均分空間(單子控件則填滿父控件)。清單10垂直FillLayout。
FillLayout fillLayout = new FillLayout(SWT.VERTICAL);
composite.setLayout(fillLayout);
類似HTML表格,創建二維單元格,支持跨列/行、固定或百分比寬高。清單11創建兩行兩列含標籤與文本框的表單。
GridLayout gridLayout = new GridLayout(2, false);
composite.setLayout(gridLayout);
Label l1 = new Label(composite, SWT.LEFT);
l1.setText("First Name: ");
Text first = new Text(composite, SWT.SINGLE);
// ...
控制控件在單元格內如何使用剩餘空間。清單12設置文本框填滿可用空間(SWT.FILL、grabExcessHorizontal/Vertical=true)。
first.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
last.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
SWT GUI需Display實例提供環境,事件循環readAndDispatch()/sleep()處理用戶輸入,最後dispose()釋放資源。清單13完整啟動代碼,圖6為運行效果。
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("Shell Title");
// 構建 Shell 子控件...
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();

圖 6. 示例應用程序
第一部分覆蓋核心概念、Label/Text/Button/Composite/Shell、FillLayout/GridLayout與啟動流程。第二部分將介紹菜單、List/Tree/Table等更多控件。
來源:IBM developerWorks