可以使用標准窗口小部件工具箱(Standard Widget Toolkit
SWT)和 JFace 庫來開發用於 Eclipse 環境的圖形用戶界面
而且還可以將它們用於開發單獨的 GUI 本機應用程序
在本文中
我將介紹一些基本的 SWT(基本 GUI 對象的名稱)類型
並展示如何綜合使用它們來創建有用的應用程序
關於 EclipseSWT 和 JFace 正如 Eclipse 的 Web 站點上所提到的
Eclipse 是一種通用工具平台
它是一個開放的
可用於任何東西的可擴展 IDE
沒什麼特別之處
它為工具開發人員提供了靈活性以及對軟件技術的控制
Eclipse 為開發人員提供了生產大量 GUI 驅動的工具和應用程序的基礎
而這項功能的基礎就是 GUI 庫 SWT 和 JFace
SWT 是一個庫
它創建了Java 版的本地主機操作系統 GUI 控件
它依賴於本機實現
這意味著基於 SWT 的應用程序具有以下幾個關鍵特性
它們的外觀
行為和執行類似於
本機
應用程序
所提供的窗口小部件(widget)反映了主機操作系統上提供的窗口小部件(組件和控件)
主機 GUI 庫的任何特殊行為都在 SWT GUI 中得到反映
這些目標使得 SWT 不同於 Java 技術的 Swing
Swing 的設計目標是消除操作系統的差異
SWT 庫反映了主機操作系統的基本窗口小部件
在許多環境下
這種方法太低級
JFace 庫有助於向 SWT 應用程序中添加大量服務
JFace 並沒有隱藏 SWT
它只是擴展了 SWT
正如您將在這一系列的後面部分中看到的
SWT 最重要的擴展之一是
將應用程序的數據模型與顯示及更改它的 GUI 隔離開來
在開始之前
我需要介紹一些 SWT 術語
Widget —— 基本的 SWT GUI 組件(類似於 Java AWT 中的 Component 和 Swing 中的 JComponent)
Widget 是一個抽象類
Control —— 擁有操作系統的對等物的窗口小部件(換句話說
在操作系統中具有同一身份)
Control 是一個抽象類
Composite —— 包含其他控件的控件(類似於 Java AWT 中的 Container 和 Swing 中的 JPanel)
Item —— 其他控件包含的窗口小部件(該控件可能不是復合控件)
比如列表和表
注意
包含一些項的控件很少包含其他控件
反之亦然
Item 是一個抽象類
這些窗口小部件被安排在繼承層次結構中
參見圖
圖
和圖
了解它們是如何安排的
在圖
中
Basic
類是來自本文的類
而其他所有類都是標准的 SWT 窗口小部件
圖 SWT Widget 樹
圖 SWT Composite 樹
圖 SWT Item 列表
注意Eclipse 具有跨平台特性(因此可以在許多操作平台上運行)本文基於 Eclipse 的 Microsoft? Windows? 版本因此本文包含的每個例子都應該能夠不加任何更改地在其他平台上使用還要注意的是本文是基於 Eclipse V 的Eclipse V 中添加了少許 GUI 窗口小部件類型和特性
基本控件
幾乎所有 SWT GUI 都是從某些基礎部分開始創建的所有 SWT 窗口小部件都可以在 orgeclipseswtwidget 或 orgeclipseswtcustom 包中找到(一些 Eclipse 插件還在其他包中提供了定制的窗口小部件)窗口小部件包中包含一些基於操作系統控件的控件而定制包中則包含一些超出操作系統控件集之外的控件一些定制的軟件包控件類似於窗口小部件包中的控件為了避免命名沖突定制控件的名稱都是以C開始的(例如比較 CLabel 與 Label)
在 SWT 中所有控件(除了一些高級控件比如 shell將在後面進行討論)在創建的時候都必須有一個父控件(一個復合實例)在創建的時候這些控件被自動添加到父控件中這與必須明確添加到父控件中的 AWT/Swing 中的控件有所不同自動添加產生了一種自上而下地構造 GUI 的方法這樣所有控件都可以采用一個復合父控件(或者一個子類)作為構造函數的參數
大多數控件都有一些必須在創建時設置的標記選項因此大多數控件還有另外一個構造函數參數我們通常稱之為樣式該參數提供了設置這些選項的標記所有這些參數值都是 static final int並且都是在 orgeclipseswt 包的 SWT 類中定義的如果不需要任何參數則可以使用 SWTNONE 值
標簽
標簽可能是最簡單的控件標簽 被用於顯示純文本(沒有顏色特殊字體或樣式的文本)或稱為圖標的小圖像標簽不接受焦點(換句話說用戶不能通過 Tab 鍵或鼠標移動到標簽)因此標簽無法產生輸入事件
清單 展示了如何創建一個簡單的文本標簽
清單 創建一個帶文本的標簽
import orgeclipseswtwidget*;
:
Composite parent = ;
:
// create a center aligned label
Label label = new Label(parent SWTCENTER);
labelsetText(This is the label text);
注意該文本是采用不同於構造函數的單獨的方法設置的這是所有 SWT 控件的一個典型象征只有父控件和樣式是在構造函數中設置的其他所有屬性都是在已創建的對象上設置的
由於平台的限制標准標簽控件不能同時擁有文本和圖標為了支持同時擁有文本和圖標可以使用 CLabel 控件如清單 中所示
清單 創建一個包含文本和圖像的標簽
import comeclipseswtgraphics*;
import orgeclipseswtwidget*;
import orgeclipseswtcustom*;
:
Composite parent = ;
Image image = ;
:
// create a left aligned label with an icon
CLabel Clabel = new CLabel(parent SWTLEFT);
labelsetText(This is the imaged label text);
labelsetImage(image);
文本
在標簽顯示文本的同時您時常還想允許用戶插入文本文本 控件就是用於此目的的文本可以是單行的(一個文本字段)也可以是多行的(一個文本區域)文本還可以是只讀的文本字段中沒有描述因此常常通過標簽控件處理它們以確定它們的用途文本控件還可以包含一個工具提示提供關於控件用途的信息(所有控件都支持這一特性)
清單 顯示了如何使用允許使用的有限數量的特性來創建一個簡單的文本字段選擇默認文本是為了便於擦除
清單 創建一個包含選定的默認文本和一個限制條件的文本
import orgeclipseswtwidget*;
:
Composite parent = ;
:
// create a text field
Text name = new Text(parent SWTSINGLE);
namesetText(<none>);
namesetTextLimit();
namesetToolTipText(Enter your name Last First);
nameselectAll(); // enable fast erase
按鈕
通常您希望用戶指出應該何時進行某項操作最常見的做法是使用按鈕 控件存在以下幾種樣式的按鈕
ARROW —— 顯示為一個指向上下左右方向的箭頭
CHECK —— 已標記的復選標記
FLAT —— 沒有凸起外觀的按鈕
PUSH —— 瞬時按鈕(最常見的事件源)
RADIO —— 具有排他性的粘性標記(sticky mark)其他所有單選按鈕都在相同的組中
TOGGLE —— 一個粘性按鈕
清單 創建了一個Clear按鈕
清單 創建一個按鈕
import orgeclipseswtwidget*;
:
Composite parent = ;
:
// create a push button
Button clear = new Button(parent SWTPUSH);
clearsetText(Clea&r);
名稱中的 & 導致利用緊接著的一個字母創建一個加速器允許通過 Ctrl+<字母> 順序的方式按下按鈕(控件順序由主機操作系統決定)
事件監聽器
通常您可能想在選擇按鈕(特別是某種推式按鈕)的時候執行一些操作您可以通過向該按鈕添加一個 SelectionListener(在 orgeclipseswtevents 包中)做到這一點當按鈕狀態發生改變時(通常是按鈕被按下)就會生成事件清單 在單擊 Clear 按鈕時輸出一條消息
清單 按鈕事件處理程序
import orgeclipseswtevents*;
:
// Clear button pressed event handler
clearaddSelectionListener(new SelectionListener() {
public void widgetelected(selectionEvent e) {
Systemoutprintln(Clear pressed!);
}
public void widgetDefaultSelected(selectionEvent e) {
widgetelected(e);
}
});
此代碼使用了一個匿名的內部類但您還可以使用指定的內部類或單獨的類作為監聽器多數包含兩個或更多方法的 Listener 類還有一個類似的 Adapter 類這個類提供了一些空的方法實現並且可以減少您需要編寫的代碼數量例如還有一個 SelectionAdapter 類這個類實現了 SelectionListener
注意在這些方法中執行的操作必須快速完成(通常不足一秒時間)或者說 GUI 的反應將是遲鈍的更長時間的操作(比如訪問文件)需要單獨的線程但那是以後某期文章的主題
復合控件
至此我們已經討論了一些單獨的控件在多數 GUI 中許多控件被組合在一起以提供豐富的用戶體驗在 SWT 中這種組合是通過 Composite 類實現的
復合控件可以在任何級別上進行嵌套並且可以混合和匹配控件將它們作為子控件進行組合這樣做可以極大地減少 GUI 開發的復雜性並為 GUI 代碼重用(通過封裝內部 GUI)創造了機會復合控件可以是有邊界的並且這些邊界很容易在視覺上產生混淆或者它們也可以是無邊界的無縫集成到更大的組中
清單 創建一個有邊界的復合控件
單 創建一個有邊界的復合控件
import orgeclipseswtwidget*;
:
Composite parent = ;
:
Composite border = new Composite(parent SWTBORDER);
除了邊界之外
Group 復合子類還支持標題
在定義排他性按鈕集合時
組通常被用來包含單選類型的按鈕
清單
創建了一個有邊界的組
清單 創建一個有邊界的組
import orgeclipseswtwidget*;
:
Composite parent = ;
:
Group border = new Group(parent SWTSHADOW_OUT);
bordersetText(Group Description);
shell
shell 是一種可能沒有父復合控件的復合控件(框架或窗口)此外它還有一個作為父控件的 Display這通常也是默認設置shell 有很多種樣式但最常見的樣式是 SWTSHELL_TRIM
或 SWTDIALOG_TRIM
shell 可以是模態的也可以是非模態的模態 shell 常常用於對話框防止父 GUI(如果有的話)在關閉子 shell 之前被處理
清單 創建了一個框架樣式的頂級非模態 shell
清單 創建一個頂級 shell
import orgeclipseswtwidget*;
:
Shell frame = new Shell(SWTSHELL_TRIM);
:
shell 可以有子 shell
這些子 shell 是與父 shell 相關的獨立桌面窗口(也就是說
如果父 shell 關閉
那麼其所有子 shell 也將關閉)
清單
創建了一個對話框樣式的子 shell
清單 創建一個對話框 shell
:
Shell dialog = new Shell(frame SWTDIALOG_TRIM);
:
參見圖
中具有 SWT
SHELL_TRIMSee 的 shell
以及圖
中具有 SWT
DIALOG_TRIM 的 shell
了解這些值如何影響 shell 的整潔性
圖 具有 SWTSHELL_TRIM 的 shell
圖 具有 SWTDIALOG_TRIM 的 shell
布局管理器 復合控件常常包含多個控件
可以使用以下兩種方法安排這些控件
絕對定位 —— 為每個控件設置明確的 X 和 Y 位置並通過代碼設置一定的寬度和高度
托管定位 —— 每個控件的 XY寬度和高度都是通過LayoutManager 設置的
在多數情況下應該選擇使用 LayoutManagers因為很容易調整它們來適應可變大小的 GUISWT 也提供了一些布局管理器供您使用在這一期的系列文章中我們將討論兩種基本的布局管理器FillLayout 和 GridLayout在這兩種情況下每當重新設置復合控件的大小都需要進行定位
一些布局管理器常常是專為某一個復合控件分配的一些布局管理器只使用它們自身的參數就可以控制而另一些布局管理器還需要其他參數 —— LayoutData該參數是在它們管理的復合控件中的每個控件上指定的
FillLayout
FillLayout 以行或列的形式安排控件每個控件所設置的大小將與填充該復合控件所需的寬度和高度相同在這些控件之間空間是平均分配的一種特殊情況是在僅有一個子控件時該控件的大小被設置為填充整個父復合控件的大小
清單 使用 FillLayout 創建一列控件
import orgeclipseswtwidget*;
import orgeclipseswtlayouts*;
:
Composite composite = ;
FillLayout fillLayout = new FillLayout(SWTVERTICAL);
compositesetLayout(fillLayout);
GridLayout GridLayout 提供了一個功能更強大的布局方法
該方法類似於使用 HTML 表的方法
它創建了
D 網格的單元格
可以將控件放置在一個或多個單元格中(可以稱之為單元格跨越)
單元格的大小可以是相等的
或者是網格寬度或高度的某個給定可變百分比
可以將控件添加到某一行的下一個可用列中
如果這一行中沒有更多的列
那麼該控件將移動到下一行的第一列中
清單
創建了一個復合控件
該控件有兩行和兩個列
其中包含兩個已標記的文本字段
這些列可以有不同的寬度
清單 創建一個控件表
import orgeclipseswtwidget*;
import orgeclipseswtlayouts*;
:
Composite composite = ;
GridLayout gridLayout = new GridLayout( false);
compositesetLayout(gridLayout);
Label l = new Label(composite SWTLEFT);
lsettext(First Name: );
Text first = new Text(composite SWTSINGLE);
Label l = new Label(composite SWTLEFT);
lsetText(Last Name: );
Text last = new Text(composite SWTSINGLE);
GridData 考慮一下這種情況
您需要指定每個控件如何使用其單元格中的剩余空間
為了給每個單元格提供這種精確控制
添加到 GridLayout 的托管復合控件的控件可以擁有 GridData 實例(LayoutData 的子類)
清單
設置了這些文本字段
以便采用所有可用的剩余空間(根據前面的清單)
清單 配置一個擴展到所有可用空間的布局
firstsetLayoutData(new GridData(SWTFILL SWTFILL true true));
lastsetLayoutData(new GridData(SWTFILL SWTFILL true true));
構建一個運行程序
現在是時候來看一下我們已經在簡單的可執行例子 Basic 中討論過的所有 SWT 控件了請參閱 參考資料以獲得該應用程序的完整源代碼
SWT GUI 需要一個已配置好的環境來運行這個環境是通過一個顯示實例提供的該實例提供了對主機操作系統顯示設備的訪問這個顯示實例允許您處理每個用戶輸入(鼠標或鍵盤)來處理您的 GUI
清單 創建了一個環境和一個 GUI並顯示了這個 GUI
清單 創建一個 GUI 應用程序並啟動它
import orgeclipseswtwidget*;
:
Display display = new Display();
Shell shell = new Shell(display);
shellsetText(Shell Title);
// *** construct Shell children here ***
shellopen(); // open shell for user access
// process all user input events
while(!shellisDisposed()) {
// process the next event wait when none available
if(!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose(); // must always clean up
此代碼創建了一個類似於圖
的窗口
圖 示例應用程序
結束語 在 SWT 和 JFace 系列的第一期中
我們介紹了大多數基本 SWT 窗口小部件控件
標簽
文本
按鈕
復合控件和 shell
這些控件
與顯示類(display class)相結合
允許創建全功能的 GUI
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28294.html