SWT, Swing and AWT[收藏]

SWT, Swing or AWT: Which is right for you?

 http://www-128.ibm.com/developerworks/grid/library/os-swingswt/  

---------------------------------------------------------------------------------------------------------------------------

awt/swing and swt/jface

   Swing和SWT是採用不同的機制的,AWT是Swing的前身,實際上是調用本地操作系統的控件。由於在不同的操作系統下,提供的控件是不一樣的,AWT採用最小公約數的辦法,只提供所有操作系統都有的控件。但後來SUN改變了做法,在Swing裏除了JFrame,JWinodows,JDialog(記不太清了,好像是這幾個)是調用本地操作系統的控件,其它JPanel,JButton之類的都是繪出來的,所以Swing在所有平臺看起來都是一樣的外觀。這樣保持了外觀一致性,但犧牲了性能。

       IBM更喜歡AWT的實現機制,做出了SWT,SWT採用的是最大公倍數的做法。SWT大部分都是用的本地操作系統的控件,一些在windows裏有的控件可能在linux下沒有,對這種控件才採用自己繪製的方式。SWT採用類似JAVA虛擬機的方式,在不同的平臺,有不同的開發包,我們寫的java代碼是一樣的,但不同平臺下看起來外觀是不一樣的,但性能提升很高。

  1. 如果你需要開發一個基於數據項的應用程序,例如表單等等,最好選擇SWT。它給Windows用戶(非專業人士)熟悉的Windows界面的感覺。他們容易上手。
  2. 如果你需要開發實用程序例如下載管理器,媒體播放器,p2p客戶端,郵件客戶端,文本編輯器等等,你可以使用SWT。這些程序主要針對非技術用戶。例如Azzerus Bit Torrent Client.
  3. 如果你開發一個複雜的 gui 例如一個 BPEL 建模工具,或者一個 CAD 模型軟件,你需要定製大量的小組件,這時候用Swing來定製組件要比SWT容易的多。

 -------------------------------------------------------------------------------------------------------------------------

在 Java 技術剛出現的初期,大家最感興趣的 Java API 無疑地就是 AWT。一方面因爲 JDK 1.0 時只有 AWT 稱得上是一組完整的 application framework,其它 Java API 都比較偏向個別的 class,二方面是因爲當時大家受盡了 MFC 的苦,希望能有一個比較好的替代品。

MFC 的興盛期已過,目前餘孽尚存,我很樂見這種不良的 API 逐漸雕零。Bruce Eckel 說得好:「MFC 是我經驗過最糟糕的東西(MFC is the worst thing that I've experienced)」。少說重話的 Bruce Eckel 批評 MFC 其來有自,因爲 Bruce Eckel 是對象導向程序設計的倡導者,而 MFC 正是對象導向設計失敗的絕佳範例。相較於 MFC 的不良設計,AWT 在對象導向方面就好很多了,但是因爲兩者都採用 ripple 形式的 event model,所以兩者在這方面很類似。在 JDK 1.1 版以後,整個 Java(包括 AWT)的 event model 改用較好的 delegation event model。

JDK 1.2 之後,Java 有了另一組 GUI 的 API,叫做 Swing。因爲 Swing 是 lightweight 的 API,所以無所不能,不但有各式各樣先進的組件,而且連組件風格都可抽換。Swing 出現之後,大家很快地就不太使用 AWT 了。我發現 lightweight 組件近年來大行其道,跨 Windows/unix/Linux 平臺的 Qt 也是 lightweight 組件的套件。

不要以爲 Swing 是用來取代 AWT 的,其實 Swing 是架構在 AWT 之上做出來的(Swing 有四個 heavyweight 組件),沒有 AWT,也就不會有 Swing。Swing 的出現只是減少程序員直接使用 AWT 的機會,而不會讓 AWT 消失。

不管你選用 AWT 或 Swing 來開發你的 GUI,最好不要同時使用兩者,因爲:

AWT 或 Swing 的視覺風格差異很大,混用兩者感覺不協調。
Swing 的組件大部分都是 lightweight,而 AWT 的組件一律是 heavyweight,兩者混在一起可能會造成 Z-Order 的錯亂。(請看「探究 Z-Order」一文)
混用 AWT 和 Swing 很可能會造成 Swing 的最佳化無用武之地,結果速度比只用 AWT 或只用 Swing 都來得慢。
雖然 Swing 的組件有諸多優點,但是它有一項致命的缺點 ...「慢」。許多人開發出來的 Swing 程序執行速度很慢,但是問題不見得全都出在 Swing 上面,有可能在於程序員的程序經驗不足,思慮欠周所致。遇到像這樣的情況,我會建議他們把程序的某些地方改寫,通常效能會有明顯地改進。如果這樣還是不夠快,那麼最後一招就是把 GUI 由 Swing 改成 AWT。

最近 AWT 又變得稍微重要起來了。IA(信息家電)產品熱潮逐漸興起,許多 IA 產品上會有 JRE,能夠執行 Java 程序,例如 WinCE、PalmOS、Symbian EPOC 這三大 PDA 的 OS 都有 JRE。比起桌上型計算機,掌上型的 IA 不但內存有限、CPU 不夠快、屏幕小且色彩少。這類 IA 上面的 Java 程序一定要用 AWT 來設計 GUI,因爲這類裝置的 JRE 根本不支持 Swing 這樣耗費資源的龐然大物。

總而言之,如果你:

需要快速的 GUI,或者
需要在 IA 上開發 Java 程序
那麼,你應該多花一點時間把 AWT 學好。否則,你應該直接去學 Swing,會比較實際些。
(轉載文章請保留出處:Java家(www.javajia.com))

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章