1. 程式人生 > >使用Eclipse進行SWT程式設計(1)

使用Eclipse進行SWT程式設計(1)

使用Eclipse進行SWT程式設計(1

"The best way to predict the future is to invent it."—Alan Kay

1. 為什麼要使用SWT?

SWTIBM開發一套跨平臺的GUI開發框架。為什麼IBM要建立另一種GUI呢?為什麼他們不使用現有的Java GUI框架呢?要回答這些問題,我需要回到Java的早期時代。

Sun已經建立了一套跨平臺的GUI框架 AWT (Abstract Windowing Toolkit)這個AWT框架使用了本地視窗元件(native widgets)不過它存在LCD問題. 這個LCD問題導致了它失去主要的平臺特性。換句話說,如果平臺

A有視窗元件140而平臺B有視窗元件2025,那麼這個跨平臺的AWT框架只能提供這兩個集合的交集。

為了解決這個問題,Sun建立了一個新的框架使用模擬視窗元件(emulated widgets)來代替本地視窗元件(native widgets)。這個方法解決了LCD問題同時提供了豐富的視窗元件,不過也產生了其他的問題。例如,Swing應用程式不再和本地程式在樣子上一致。雖然JVM有了很大的改善,但是Swing應用程式仍然存在它們本地配對物所沒有的效能問題。而且,Swing應用程式消耗了太多的記憶體,故不適合用於PDA和行動電話等小型裝置。

IBM發現這些方法都無法滿足他們的需求。因此,IBM建立了新的

GUI庫叫做SWT,它解決了AWTSwing框架中的問題。SWT框架使用JNI訪問本地視窗元件(native widgets),如果一個視窗元件在主機平臺上不能獲得,那麼SWT會模擬這個不能獲取的視窗元件。

2. 一個SWT應用程式的基礎材料

Display, ShellWidgets是一個SWT應用程式的基礎材料。Displays用於管理事件迴圈(event loops)和控制UI執行緒和其他執行緒之間的通訊。Shell是應用程式中由作業系統窗體管理器來管理的窗體。任何SWT應用程式都需要至少一個Display例項和1個或更多的Shell例項。

1.不同視角看的SWT程式

1說明了一個SWT

應用程式的不同看法。第一幅圖是簡化的UI物件的繼承圖。第二幅圖是UI物件的包含結構。第三幅圖就是建立了的UI

如果一個應用程式使用多個執行緒,每個執行緒使用自己的Display物件例項。那麼你可以通過使用靜態的Display.getCurent()方法得到當前活躍的Display物件例項。

一個Shell表示一個特別作業系統中的一個視窗。一個Shell可以最大化,正常化,和最小化。有兩種型別的shell。一種是頂層(top-levelShell作為Display的主視窗建立的,另一種是依賴於其他shell的對話shell

Shell的型別是由傳給Shell建構函式的style位決定的。Shell的預設值是對話Shell。也就是說,如果沒有傳遞任何值給建構函式引數,那麼建立的是預設的對話Shell。如果一個Display物件作為引數,那麼它是頂層(top-levelShell

有些視窗元件(widget)的屬性必須在建立時設定。這些視窗元件(widget)屬性叫做style bitsStyle 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
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1403)
at java.lang.Runtime.loadLibrary0(Runtime.java:788)
at java.lang.System.loadLibrary(System.java:832)
...
at org.eclipse.swt.widgets.Display.<init>(Display.java:287)
at Main.main(Main.java:25)
Exception in thread "main"

要設定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
  • 設定ShellLayout 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是個合成物件;它可以容納其他的合成物件。如果沒有設定shelllayout,加到Shellwidget是不能看見的。Shell視窗必須開啟才能顯示。事件處理迴圈讀取並轉發GUI事件。如果沒有事件處理迴圈應用程式視窗是無法顯示的。即使通過open()方法來開啟Shell視窗。讓後,需要在Shell被丟棄的時候銷燬Display

匯入需要的庫

你可以使用Source->Organize Imports選單或者Ctrl+Shift+O來自動匯入需要的庫。