The best way to predict the future is to invent it
—Alan Kay
為什麼要使用SWT? SWT是IBM開發一套跨平台的GUI開發框架
為什麼IBM要創建另一種GUI呢?為什麼他們不使用現有的Java GUI框架呢?要回答這些問題
我需要回到Java的早期時代
Sun已經創建了一套跨平台的GUI框架 AWT (Abstract Windowing Toolkit)
這個AWT框架使用了本地窗口組件(native widgets)不過它存在LCD問題
這個LCD問題導致了它失去主要的平台特性
換句話說
如果平台A有窗口組件
-
而平台B有窗口組件
-
那麼這個跨平台的AWT框架只能提供這兩個集合的交集
為了解決這個問題
Sun創建了一個新的框架使用模擬窗口組件(emulated widgets)來代替本地窗口組件(native widgets)
這個方法解決了LCD問題同時提供了豐富的窗口組件
不過也產生了其他的問題
例如
Swing應用程序不再和本地程序在樣子上一致
雖然JVM有了很大的改善
但是Swing應用程序仍然存在它們本地配對物所沒有的性能問題
而且
Swing應用程序消耗了太多的內存
故不適合用於PDA和移動電話等小型設備
IBM發現這些方法都無法滿足他們的需求
因此
IBM創建了新的GUI庫叫做SWT
它解決了AWT和Swing框架中的問題
SWT框架使用JNI訪問本地窗口組件(native widgets)
如果一個窗口組件在主機平台上不能獲得
那麼SWT會模擬這個不能獲取的窗口組件
一個SWT應用程序的基礎材料 Display
Shell和Widgets是一個SWT應用程序的基礎材料
Displays用於管理事件循環(event loops)和控制UI線程和其他線程之間的通訊
Shell是應用程序中由操作系統窗體管理器來管理的窗體
任何SWT應用程序都需要至少一個Display實例和
個或更多的Shell實例
圖
說明了一個SWT應用程序的不同看法
第一幅圖是簡化的UI對象的繼承圖
第二幅圖是UI對象的包含結構
第三幅圖就是創建了的UI
如果一個應用程序使用多個線程
每個線程使用自己的Display對象實例
那麼你可以通過使用靜態的Display
getCurent()方法得到當前活躍的Display對象實例
一個Shell表示一個特別操作系統中的一個窗口
一個Shell可以最大化
正常化
和最小化
有兩種類型的shell
一種是頂層(top
level)Shell作為Display的主窗口創建的
另一種是依賴於其他shell的對話shell
Shell的類型是由傳給Shell構造函數的style位決定的
Shell的默認值是對話Shell
也就是說
如果沒有傳遞任何值給構造函數參數
那麼創建的是默認的對話Shell
如果一個Display對象作為參數
那麼它是頂層(top
level)Shell
有些窗口組件(widget)的屬性必須在創建時設定
這些窗口組件(widget)屬性叫做style bits
Style bits是在SWT類中定義的常量
如Button button = new Button( shell
)當然可以通過或操作|來使用多個style bit例如要使用一個有邊的按鈕你需要使用SWTPUSH | SWTBORDER作為style bit參數
環境設置
開發一個SWT應用程序與開發一個Swing應用程序不同為了可以開始一個SWT應用程序的開發你需要把SWT庫加到classpath中同時設置好對應的必要的環境變量
第一個需要的庫是swtjar文件它位於ECLIPSE_HOME\eclipse\plugins\orgeclipseswtwin_\ws\win目錄根據你使用的Eclipse版本你可能需要使用不同的目錄這個swtjar文件必須加到你的classpath中為此到Project>Properies>JavaBuildPath>Libraries>Add Variable > Eclipse Home >Extend並按上述路徑選擇swtjar庫然後單擊OK
然後你可以編譯SWT應用程序但是由於拋出下邊所示的運行時異常無法運行它因為swtjar使用了本地庫你需要設置javalibrarypath環境變量來在Java中使用本地庫
educitycn/img_///jpg >
要設置javalibrarypath變量到Run> Run> Java Applicaton> New >Arguments > VM Arguments然後如何需要如下修改path把它粘貼到VM Arguments部分Djavalibrarypath=c:\eclipse\plugins\orgeclipseswtwin_\os\win\x
裝載本地庫
如果你需要裝載應用程序使用的任何本地庫你可以使用RuntimegetPlatformloadLibrary(libraryname)方法
完成這些步驟你就可以在你的eclipse環境下運行SWT程序了
你的第一個SWT應用程序
創建一個典型的SWT應用程序需要一下步驟
創建一個Display
創建一個或多個Shells
設置Shell的Layout manager
創建Shell中的widgets
開啟Shell窗口
寫一個事件轉發循環
銷毀display
你可以使用下邊的代碼模板來快速的運行本文中的代碼片斷你可以復制粘貼這些代碼至合適的區域如源代碼所示
educitycn/img_///jpg >
這個例子顯示了一個空的窗口你可以加widget到上邊的模板任何SWT應用程序需要 一個Display和一個或多個 Shells這個Shell是個合成對象;它可以容納其他的合成對象如果沒有設置shell的 layout加到Shell的widget是不能看見的Shell窗口必須 打開才能顯示 事件處理循環讀取並轉發GUI事件如果沒有事件處理循環應用程序窗口是無法顯示的即使通過open()方法來打開Shell窗口讓後需要在Shell被丟棄的時候銷毀 Display
導入需要的庫
你可以使用Source>Organize Imports菜單或者Ctrl+Shift+O來自動導入需要的庫
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28075.html