1. 為什麼要使用SWT?
SWT是一個IBM開發的跨平台GUI開發套件。至於為什麼IBM要費勁自己另起爐灶開發一個GUI工具包,而不是使用Sun現有的由AWT, Swing, Java 2D, Java 3D等構成的Java GUI架構,那就說來話長了。(記得在一個BBS上讀過一個關於SWT起源的調侃類的文章)。
在SWT之前,Sun已經提供了一個跨平台GUI開發套件AWT (Abstract Windowing Toolkit)。雖然AWT架構也使用的是原生視窗組件(native widgets),但是它一直未能突破LCD問題。LCD問題導致了一些主要平台特徵的遺失。如果你不明白的話(其實我也沒明白),換句話說,如果平台A有視窗組件(widgets)1–40,而平台B有視窗組件(widgets)20–25,那麼跨平台的AWT架構只能提供這兩個視窗組件集的交集。
為解決這個問題,Sun又建立了一個新的架構。這個架構不再使用原生視窗組件,而是使用模擬視窗組件(emulated widgets)。這個方法雖然解決了LCD問題,並且提供了豐富的視窗組件集,但是它也帶來了新的問題。例如,Swing應用程式的介面外觀不再和原生應用程式的外觀相似。雖然在JVM中這些Swing應用程式已經得到了最大程度的效能改善,但是它們還是存在著其原生對應物所不具有的效能問題。並且,Swing應用程式消耗太多的記憶體,這樣Swing不適於一些小裝置,如PDA和行動電話等。
IBM進行了嘗試以徹底解決AWT和Swing架構帶來的上述問題。最終,IBM建立了一個新的GUI庫,這就是SWT。SWT架構通過JNI來訪問原生視窗組件。如果在宿主(host)平台上無法找到一個視窗組件,SWT就會自動地類比它。
2. SWT應用程式的組成
一個SWT應用程式的基本組成部分為顯示介面(Display)、命令介面(Shell,使命令進入並使運行初始化)和視窗組件(Widgets)。Display負責管理事件迴圈和控制UI線程和其他線程之間的通訊。Shell是應用程式中被作業系統視窗管理器管理的視窗。每個SWT應用程式至少需要一個Display和大於等於1個的Shell執行個體。
圖1:從不同的角度看SWT應用程式
圖1從不同的角度展示了SWT應用程式。左側的圖是一個簡化的UI對象的繼承圖。中間的圖展示了UI對象的容器結構(containment structure)。右側的圖則是建立後的UI外觀。
如果一個應用程式使用了多個線程,那麼每個線程都使用的是Display對象分配給它自己的執行個體。程式員可以使用靜態方法Display.getCurent()來得到Display對象的當前活動的執行個體。
Shell用於在特定的作業系統中表現視窗。Shell可以最大化、最小化或正常化。Shell有兩種類型。第1種是高層shell,它是Display的子視窗,同時它也是一個主視窗。第2類是對話shell,這種shell要依賴於其他的shell視窗存在。shell視窗最終成為上述那種類型,要看在建立shell時傳遞給shell建構函式的是什麼風格位(style bits)。一個shell的預設值是DialogShell。也就是說,如果不帶參數,那預設就是一個對話shell。而如果給參數賦予了一個Display對象,則該shell將是一個高層shell。
一些視窗組件的屬性必須在建立它們的初期就要被設定。這些視窗組件的屬性就是前面所說的風格位(style bits)。在SWT的類中,風格位被定義為常數。例如,Button button = new Button( shell, 〈styleBits〉 )。可以使用或(OR)操作符“|”來設定多個風格位。例如,如果想設定一個帶邊界的壓下按鈕,需要傳遞SWT.PUSH | SWT.BORDER作為風格位參數。