Swing和SWT背後的故事

Swing和SWT背後的故事

在現在的Java開發過程中,Swing使用的比較廣,而SWT像是被人遺忘,用的人也越來越少。

本文節選自一篇關於Swing和SWT的帖子。

Swing和SWT是採用不同的機制的,AWT是Swing的前身,實際上是調用本地操作系統的控件。由於在不同的操作系統下,提供的控件是不一樣的, AWT採用最小公約數的辦法,只提供所有操作系統都有的控件。但後來SUN改變了做法,在Swing裏除了JFrame,JWinodows, JDialog(記不太清了,好像是這幾個)是調用本地操作系統的控件,其它JPanel,JButton之類的都是繪出來的,所以Swing在所有平臺 看起來都是一樣的外觀。這樣保持了外觀一致性,但犧牲了性能。
IBM 更喜歡AWT的實現機制,做出了SWT,SWT採用的是最大公倍數的做法。SWT大部分都是用的本地操作系統的控件,一些在windows裏有的控件可能 在linux下沒有,對這種控件才採用自己繪製的方式。SWT採用類似JAVA虛擬機的方式,在不同的平臺,有不同的開發包,我們寫的java代碼是一樣 的,但不同平臺下看起來外觀是不一樣的,但性能提升很高,據說和C++做的界面速度差不多:)
也許你會問哪種更好,引一名話:this is equivalent to asking whether a harmmer is better than a screw driver,of course ,a hammer wieldded with sufficient force can probably drive a screw into a wall ,and the butt of a screw can be used in a pinch to knock in a nail. However, a good carpenter keeps both harmer and screw drivers in her tool box and will use the tool that is appropriate for the job at hand.
個人感覺以前Java做界面完全沒有優勢,從外觀到性能(我很喜歡Swing的look and feel,可以改變風格),SWT的出現改變了性能上的缺點,再加上JFace,及Eclipse的RCP,我還是傾向於用SWT。


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

要想弄清楚爲什麼一切都被弄得如此混亂,要從幾年前只存在AWT的 時候說起。SUN當時已經建立了一套基本的可移植控件類,這些類映射到不同操作系統上的原生窗口組件(native widget),顯然下一步應該繼續增強這套模型,除了初始的CUA 92組件(文字、按鈕等等),再繼續加上表格、樹、記事本、滑塊等等……當時的AWT還滿是漏洞,遠不能稱爲可靠,還需要SUN的coder們去修補。 SUN的developer們如Graham和Otto總是習慣於公開把他們的bug歸咎爲操作系統的差異,比如“Windows和OS/2的焦點次序不 同”或者“在……之間Ctrl-X的行爲不一樣”,以及其他蒼白的託辭,好讓批評的火力從SUN太早釋出代碼這個問題的真相上移開。然後Amy Fowler來到了SUN。不是我大男子主義,Amy是個聰明的美女,大多數呆頭呆腦只懂技術的開發人員都要被她捏在手裏。

Amy來自一 家Smalltalk公司,叫做Objectshare,在那裏她負責搞UI類庫。跟Java相比Smalltalk的歷史有些悲慘,曾幾何時有3家龐大 的Smalltalk公司——IBM、Parc-Place和Digitalk。在90年代初期3家公司的市場份額大致相等,生活是美好的。Parc- Place採用仿窗口部件(emulated widgets)的設計(即Swing的設計),IBM和Digitalk則採用原生窗口部件(native widgets)。後來IBM壓倒了另外兩家,因此他們打算合併成一家,假設叫做Parc-Place Digitalk。隨後當他們試圖將他們的產品融合到一個叫做Jigsaw的計劃中時爆發了一場大戰,計劃由於政治原因失敗了(開發人員實際上已經能讓它 運轉起來),就因爲原生和仿造兩派的死戰。Amy贏得了精神上的勝利,不過在IBM我們贏得了他們所有的生意,因爲這兩家公司在一整年裏除了吵架什麼都沒 做。當塵埃落定之後PPD(Parc-Place Digitalk當時已改名爲Objectshare,跟Windscale改名爲Sellafield的原因相同——讓人們淡忘之前發生的災難)的股票 價格從60美元掉到了低於1美元1股。他們因爲僞報收入被NASDAQ摘牌,從此消失。此時SUN正走上與PPD類似的技術方向,於是PDD的技術人員都 把他們的簡歷投到了SUN。Amy被僱傭了,她承諾通過輕量級方案解決所有窗口組件的問題,因此說服SUN管理層讓她當了GUI開發部門的頭頭。她是拿着 “這裏原來的人都搞砸了,我是來解決的”的鑰匙進來的。隨後Amy僱傭了所有她過去在Parc-Place的舊朋友,讓他們來開發Swing。

顯 然Swing應該做的是僅僅成爲一個繪製框架,給那些希望創建地圖軟件或者繪圖軟件的人們使用,無論如何,應該圍繞AWT類庫來建造它,按鈕之類的東西仍 然交給AWT來管。SUN的人比如Philip和Mark已經讓AWT能夠處理表格、樹和記事本(notebook,?),所以Swing的方向應該說很 明顯了。但那些毀了PDD的人不幹,他們非要把一切都弄成輕量級的。由於SUN管理層的無知,再加上Amy無情的政治手段,造成了我們今天所見的混亂局 面。Amy還使SUN相信Swing是作爲Mozilla項目的一部分與Netscape聯合開發的,事實上這只是她的宣傳伎倆。

在IBM, 我們從第一天起就憎惡Swing。龐大、滿是錯誤,而且難看至極。原先我們的工具如VisualAge for Java都是用Smalltalk(用的是原生窗口組件)寫的,所以當我們將這些工具向Java代碼庫遷移時,我們需要一套窗口組件。IBM這邊的開發人 員都是原來搞Smalltalk的那一批人,我們對管理層要求用Swing來構建WebSphere Studio工具都非常不情願。Swing是個可怕的充滿缺陷的怪獸。在WebSphere Studio最初的預覽中,當與Microsoft Visual Studio作對比演示的時候,我們所有的客戶都討厭它,就因爲它的外觀,而不管它的功能有多強。大多數消費者都不會買一輛讓人覺得難看的車,哪怕這車有 一臺出色的引擎。因此我們開始了一個項目,是把我們的Smalltalk原生窗口組件移植到Java上去。這個項目是加拿大的Object Technology International小組做的。這個項目獲得了成功,被運用在在我們發佈的VisualAge Micro Edition產品中,VisualAge Micro Edition後來成爲J2ME開發方面一個非常成功的IDE。但是OTI的人發現,Swing在讀取Windows事件方面有極嚴重的缺陷,我們甚至無 法進行SWT(S開始是Simple的縮寫,不過後來變成了Standard的縮寫)和Swing間的互操作。他們在讀事件隊列的時候用了一種可能留下內 存漏洞的方式,所以我們不得不採用我們自己的查詢Windows事件隊列的循環,以糾正這個錯誤。我們試了一次又一次讓SUN修復這個錯誤,但Amy就是 聽不進去,所以我們才決定SWT和AWT/Swing不能共存。我們甚至在SWT中定義了自己的Point和Rectangle類——整個工具包對AWT 或Swing都沒有任何依賴。我們把這個工具包放到了Eclipse中,這是一個工具平臺,它的總體設計目標就是要戰勝Micrsoft和Visual Studio。Eclipse是開源的,所以任何人都可以在上面構建自己的東西,我們已經有像TogetherSoft和Rational這樣的公司移植 到了上面。我們的競爭者是Microsoft,所以我們所有努力和注意力都是從正面針對Microsoft。

不管怎麼說SUN對此非常不 滿。他們的Netbeans跟Eclipse做的是相同的事,因此他們向IBM高層抱怨。他們認爲SWT是要將你綁到Windows上,這純粹是胡說,因 爲SWT能通過GTK在Mac/Linux上運行,以及一大堆嵌入式平臺。他們拒絕讓Eclipse獲得Java認證,因爲裏面有原生代碼,所以 Eclipse產品必須很小心地使用單詞“Java”這個SUN的商標。Eclipse甚至不能把自己稱爲一個Java IDE,SUN已經威脅過要採取法律行動來制止IBM在任何時候把Eclipse稱作一個Java IDE。結果之一就是IBM在Eclipse上創建的GUI設計工具,允許你構建Swing/AWT GUI,卻不讓你往裏面拖放SWT窗口控件。

將SWT 從Eclipse中分離出來是完全可能的,只需要把DLL摳出來放到路徑中,並使用窗口組件工具包來給你的銀行或者保險或者其他什麼應用程序開發GUI。 再次說明,我們無法更進一步,因爲SUN把我們的雙手綁上了。雖然作爲Eclipse開放源碼協議的一部分,CPL允許我們提供這樣的解決方案,但SUN 已經很清楚地表明他們不希望我們這樣做。

對於用戶社區來說,無論IBM和SUN的最終動機是什麼,我發現有一點總是很有趣:喜愛 Swing的人總會說“一旦你花上幾年時間去掌握它,你就能正確地使用它”,這基本上是他們在試圖證明和維護他們辛苦得來的用途有限的專門技術;而SWT 的擁護者們說的是“哇,這真快,這跟原生的一樣,還可以用XP皮膚……它還又輕又小”。有一句話是我喜歡的,我們的一個用戶說,Swing就像Java決 定不通過操作系統來實現原生的IO,而是通過磁頭馬達API自己來讀磁盤的扇區。Swing基本上就是這樣的,它拿着個底層的“paint (Graphics)”方法,自己來繪製所有的窗口組件。
--------------------------------

後記:現在的情況已經有所不同,SWT到底還是單獨發佈了,VE也承諾在1.0版的時候支持SWT的GUI設計。

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