為什麼要使用SWT?
SWT是一個IBM開發的跨平台GUI開發工具包至於為什麼IBM要費勁自己另起爐灶開發一個GUI工具包而不是使用Sun現有的由AWT Swing Java D Java D等構成的Java GUI框架那就說來話長了
在SWT之前Sun已經提供了一個跨平台GUI開發工具包AWT (Abstract Windowing Toolkit) 雖然AWT框架也使用的是原生窗口部件(native widgets)但是它一直未能突破LCD問題LCD問題導致了一些主要平台特征的遺失如果你不明白的話(其實我也沒明白)換句話說如果平台A有窗口部件(widgets)–而平台B有窗口部件(widgets)–那麼跨平台的AWT框架只能提供這兩個窗口部件集的交集
為解決這個問題Sun又創建了一個新的框架這個框架不再使用原生窗口部件而是使用仿真窗口部件(emulated widgets)這個方法雖然解決了LCD問題並且提供了豐富的窗口部件集但是它也帶來了新的問題例如Swing應用程序的界面外觀不再和原生應用程序的外觀相似 雖然在JVM中這些Swing應用程序已經得到了最大程度的性能改善但是它們還是存在著其原生對應物所不具有的性能問題並且Swing應用程序消耗太多的內存這樣Swing不適於一些小設備如PDA和移動電話等
IBM進行了嘗試以徹底解決AWT和Swing框架帶來的上述問題最終IBM創建了一個新的GUI庫這就是SWTSWT框架通過JNI來訪問原生窗口部件如果在宿主(host)平台上無法找到一個窗口部件SWT就會自動地模擬它
SWT應用程序的組成
一個SWT應用程序的基本組成部分為顯示界面(Display)命令界面(Shell使命令進入並使運行初始化)和窗口部件(Widgets)Display負責管理事件循環和控制UI線程和其他線程之間的通訊Shell是應用程序中被操作系統窗口管理器管理的窗口每個SWT應用程序至少需要一個Display和大於等於個的Shell實例
圖從不同的角度看SWT應用程序
圖從不同的角度展示了SWT應用程序左側的圖是一個簡化的UI對象的繼承圖中間的圖展示了UI對象的容器結構(containment structure)右側的圖則是創建後的UI外觀
如果一個應用程序使用了多個線程那麼每個線程都使用的是Display對象分配給它自己的實例程序員可以使用靜態方法DisplaygetCurent()來得到Display對象的當前活動的實例
Shell用於在特定的操作系統中表現窗口Shell可以最大化最小化或正常化Shell有兩種類型第種是高層shell它是Display的子窗口同時它也是一個主窗口第類是對話shell這種shell要依賴於其他的shell窗口存在shell窗口最終成為上述那種類型要看在創建shell時傳遞給shell構造函數的是什麼風格位(style bits)一個shell的默認值是DialogShell也就是說如果不帶參數那默認就是一個對話shell而如果給參數賦予了一個Display對象則該shell將是一個高層shell
一些窗口部件的屬性必須在創建它們的初期就要被設置這些窗口部件的屬性就是前面所說的風格位(style bits)在SWT的類中風格位被定義為常數例如Button button = new Button( shell <styleBits> )可以使用或(OR)操作符|來設置多個風格位例如如果想設置一個帶邊界的壓下按鈕需要傳遞SWTPUSH | SWTBORDER作為風格位參數
進行SWT開發前的環境設置
為了進行SWT應用開發你需要把SWT庫添加到類路徑(classpath)上並設置必要的環境變量
首先你要在ECLIPSE_HOME\eclipse\plugins\orgeclipseswtwin_\ws\win目錄下找到swtjar庫文件注意這裡的orgeclipseswtwin_目錄是和Eclipse的版本有關的實在找不到你就用文件搜索功能吧然後依次打開下面窗口Project>Properies>JavaBuildPath>Libraries>Add Variable > Eclipse Home >Extend將swtjar文件加到類路徑中
接著你肯定想編譯這個SWT應用了但是會出現下面所示的運行異常出現這個異常的原因是swtjar庫使用的是原生庫你需要設置javalibrarypath環境變量來使用Java中的原生庫
控制台(Console )的輸出如下
javalangUnsatisfiedLinkError: no swtwin in javalibrarypath
at javalangClassLoaderloadLibrary(Unknown Source)
at javalangRuntimeloadLibrary(Unknown Source)
at javalangSystemloadLibrary(Unknown Source)
at orgeclipseswtinternalLibraryloadLibrary(Libraryjava:)
at orgeclipseswtinternalwinOS<clinit>(OSjava:)
at orgeclipseswtwidgetsDisplayinternal_new_GC(Displayjava:)
at orgeclipseswtgraphicsDeviceinit(Devicejava:)
at orgeclipseswtwidgetsDisplayinit(Displayjava:)
at orgeclipseswtgraphicsDevice<init>(Devicejava:)
at orgeclipseswtwidgetsDisplay<init>(Displayjava:)
at orgeclipseswtwidgetsDisplay<init>(Displayjava:)
at comswtdesignertrytrymain(trytryjava:)
Exception in thread main
按下面的步驟設置javalibrarypath變量依次打開Run> Run……> Java Applicaton> Project >Arguments > VM Arguments在VM Arguments中輸入
Djavalibrarypath=c\eclipse\plugins\orgeclipseswtwin_\os\win\x
注意要輸入你自己的swtjar所在的路徑
小技巧加載原生庫
如果你需要加載自己應用程序所使用的原生庫可以使用RuntimegetPlatformloadLibrary(libraryname)方法
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28086.html