使用Eclipse進行SWT程式設計(1)
使用Eclipse進行SWT程式設計(1)
"The best way to predict the future is to invent it."—Alan Kay
1. 為什麼要使用SWT?
SWT是IBM開發一套跨平臺的GUI開發框架。為什麼IBM要建立另一種GUI呢?為什麼他們不使用現有的Java GUI框架呢?要回答這些問題,我需要回到Java的早期時代。
Sun已經建立了一套跨平臺的GUI框架 AWT (Abstract Windowing Toolkit)。這個AWT框架使用了本地視窗元件(native widgets)不過它存在LCD問題. 這個LCD問題導致了它失去主要的平臺特性。換句話說,如果平臺
為了解決這個問題,Sun建立了一個新的框架使用模擬視窗元件(emulated widgets)來代替本地視窗元件(native widgets)。這個方法解決了LCD問題同時提供了豐富的視窗元件,不過也產生了其他的問題。例如,Swing應用程式不再和本地程式在樣子上一致。雖然JVM有了很大的改善,但是Swing應用程式仍然存在它們本地配對物所沒有的效能問題。而且,Swing應用程式消耗了太多的記憶體,故不適合用於PDA和行動電話等小型裝置。
IBM發現這些方法都無法滿足他們的需求。因此,IBM建立了新的
2. 一個SWT應用程式的基礎材料
Display, Shell和Widgets是一個SWT應用程式的基礎材料。Displays用於管理事件迴圈(event loops)和控制UI執行緒和其他執行緒之間的通訊。Shell是應用程式中由作業系統窗體管理器來管理的窗體。任何SWT應用程式都需要至少一個Display例項和1個或更多的Shell例項。
圖 1.不同視角看的SWT程式
圖1說明了一個SWT
如果一個應用程式使用多個執行緒,每個執行緒使用自己的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, <styleBits> )。當然可以通過或操作|來使用多個style bit。例如,要使用一個有邊的按鈕,你需要使用SWT.PUSH | SWT.BORDER作為style bit引數。
3. 環境設定
開發一個SWT應用程式與開發一個Swing應用程式不同。為了可以開始一個SWT應用程式的開發,你需要把SWT庫加到classpath中,同時設定好對應的必要的環境變數。
第一個需要的庫是swt.jar檔案,它位於ECLIPSE_HOME/eclipse/plugins/org.eclipse.swt.win32_2.1.0/ws/win32目錄。根據你使用的Eclipse版本,你可能需要使用不同的目錄。這個swt.jar檔案必須加到你的classpath中,為此到Project->Properies->JavaBuildPath->Libraries->Add Variable -> Eclipse Home ->Extend並按上述路徑選擇swt.jar庫,然後單擊OK。
然後,你可以編譯SWT應用程式,但是由於丟擲下邊所示的執行時異常,無法執行它,因為swt.jar使用了本地庫。你需要設定java.library.path環境變數來在Java中使用本地庫。
Console output |
java.lang.UnsatisfiedLinkError: no swt-win32-2133 in java.library.path |
要設定java.library.path變數,到Run-> Run...-> Java Applicaton-> New ->Arguments -> VM Arguments。然後,如何需要,如下修改path,把它貼上到VM Arguments部分。-Djava.library.path=c:/eclipse/plugins/org.eclipse.swt.win32_2.1.0/os/win32/x86
裝載本地庫 | |
如果你需要裝載應用程式使用的任何本地庫,你可以使用Runtime.getPlatform.loadLibrary("libraryname")方法。 |
完成這些步驟,你就可以在你的eclipse環境下執行SWT程式了。
4. 你的第一個SWT應用程式
建立一個典型的SWT應用程式需要一下步驟:
- 建立一個Display
- 建立一個或多個Shells
- 設定Shell的Layout manager
- 建立Shell中的widgets
- 開啟Shell視窗
- 寫一個事件轉發迴圈
- 銷燬display
你可以使用下邊的程式碼模板來快速的執行本文中的程式碼片斷。你可以複製貼上這些程式碼至合適的區域。如原始碼1所示:
原始碼 1. SWT應用程式模板 |
import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class SliderExample { public static void main(String args[]) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout( new RowLayout()); // ------------------------ // Your code comes to here. // ------------------------ shell.pack(); shell.open(); while( !shell.isDisposed()) { if(!display.readAndDispatch()) display.sleep(); } display.dispose(); } } |
這個例子顯示了一個空的視窗。你可以加widget到上邊的模板。任何SWT應用程式需要一個Display和一個或多個Shells。這個Shell是個合成物件;它可以容納其他的合成物件。如果沒有設定shell的layout,加到Shell的widget是不能看見的。Shell視窗必須開啟才能顯示。事件處理迴圈讀取並轉發GUI事件。如果沒有事件處理迴圈應用程式視窗是無法顯示的。即使通過open()方法來開啟Shell視窗。讓後,需要在Shell被丟棄的時候銷燬Display。
匯入需要的庫 | |
你可以使用Source->Organize Imports選單或者Ctrl+Shift+O來自動匯入需要的庫。 |