1.2.2 新貴:SWT/JFace
Eclipse的設計者注意到了Swing的靈活性和其執行問題。他們想要一個套件可以確保Java的用戶可以象使用操作系統一樣運行一個桌面程序。在實際上,他們是如此之迫切需要,以至于他們編制了他們自己的類庫:SWT 和JFace。
無論Swing和SWT/JFace都會產生一個基于Java的平臺無關的GUI,但他們的實現方法又是迥異的。
SWT和JFace的最顯著的特征是其介入了直接調取操作系統,使用底層平臺的重量級組件,而不是自己重建。這一決策使得SWT和JFace的表征和運行速度接近于地層平臺,在下一章我們會就此展開更為深入的討論。當然在此的短暫描述也是有所裨益的。
由于當初Java的初創者一開始就意識到Java應用程序最總會需要使用到傳統代碼或是操作系統,所以他們提供了從Java類內部去調取其他語言(如C或Fortran)調取過程的類庫。
SWT/JFace依靠JNI來管理操作系統的渲染而不是由其自己來實施。
SWT/JFace的資源管理
SWT/JFace的另一個重要特性就是其不依賴于垃圾自動回收機制。一開始,這很容易讓人以為這會產生錯誤代碼。然而,你只需在接觸到操作系統資源是加以小心,一般不會出現重大問題。Eclipse決定將AGC從SWT/JFace中移走主要有兩方面的原因:
1) 內存自動分配的過程在程序運行時是不可預測的,沒有任何征兆說明資源何時被釋放(可得),當處于分配過程中時,如果異常情況發生,則過程就可能無法關閉。如果你僅是在處理一些簡單數據結構時,可能這是小事一件。但,如果是在處理一些大型的圖形程序時,內存的分配和回收就是不得不要小心謹慎對待的重大問題了。
2)對操作系統資源使用AGC是困難的,由于Swing在高端層次建立了其輕量級的組件,所以這還不成為一個問題。然而,如果在低端層次如SWT小部件同樣去使用自動回收機制,那么在跨平臺環境下錯誤的易發性和不確定性將會是個災難。如果要花費太多的時間去清理對象,那么內存泄漏問題就會拖垮程序;或者如果這些資源是以一種錯誤的方式來釋放資源的,那么整個操作系統也要跟著倒霉(宕機)了。
為了預防此類與對象自動回收機制相關聯的錯誤的發生,SWT/JFace讓你自己來自主決定何時釋放資源。這一工具套件通過其組件類中內置的dispose()方法來簡化這一處理過程。同時,一旦你釋放了某一父(上級)資源,其子(下級)資源也會被自動釋放。
在以后的章節中,你將看到這意味著在大部分的應用程序中幾乎不需要直接的內存釋放的必要。你也可以以半自動方式來調取SWT/JFace來管理內存。
設計和開發的簡化
在swing中GUI是以模型代理架構產生的,由此會對GUI的每一個組件產生不同的對象以表征其不同的特性。但這一復雜方法不是任何情況下都適用。對于那些剛開始起步學習構建按鈕、標簽的新手來說不需要如此復雜。而在其他的極端情況下,程序員在構建復雜的圖形編輯器和計算機輔助設計工具是,需要與GUI功能更多地分離,以取得不同的試圖和設計模式。?
SWT和JFace對其組件的設計架構沒有強加任何規則,這意味著你可以隨心所欲地極端復雜化地或是極端簡化地構筑你的GUIs。因為Eclipse極易擴展,同時其源代碼又是開放的,你可以隨你所愿地添加工具或作修改。事實上,已經有大量的插件為SWT和JFace組件的MVC封裝而開發出來了。
1.2.3 SWT/Swing之爭
隨意在網上搜索一下SWT和Swing,都會看到關于這兩者孰優孰劣的熱烈爭論。這一論戰是毫無必要也是沒有實際意義的。SWT是作為Swing之外的另一選擇而產生的,而不是為了去替代Swing。我們撰寫本節的目的并不在于褒揚某一工具較另一工具有優勢,而是為了解釋說明如何運作,為何運作的一種機理。在Java開發者中的這種爭斗只會傷害到為構建自由的平臺無關的應用程序的熱忱。這世界給予了SWT和Swing同樣廣闊的天地,我們希望這兩大陣營求同存異,共創Java社區的大同世界。
1.3 SWT/JFace的許可證和支持平臺
在正是開始編寫代碼之前,我們很樂意談及SWT和JFace開發應用程序的兩個要點:第一、如同在通用公共許可協議中概要的那樣,Eclipse和其開發庫的條件(?)太缺乏,當你在考慮開發商業應用程序時很重要;第二、需要關注Eclipse和SWT/JFace當前所支持的平臺。
1.3.1 CPL通用許可協議
Eclipse軟件基金會是在CPL框架下向公眾發布Eclipse的。這一許可協議和開放源代碼組織的許可協議方案是完全兼容的,并且通過授權免特許權使用費的代碼允許作完全的商業使用并可以在全球范圍內再發布。這意味著任何人可以使用源代碼,修改源代碼并且銷售其最終產品。
雖然某些平臺部件是在特殊許可條件下發布的,但是由于整個SWT和JFace是在CPL框架范圍內的,所以這使得在全部可支持平臺內開發商業SWT和JFace應用程序成為了可能。
1.3.2 支持平臺
在撰寫本書時,在不少平臺上都已經開始支持SWT和JFace開發了。因為其依賴于特殊的窗體功能,因此在某些平臺需要多個SWT應用實施。表1.1列舉了支持SWT和JFace的操作系統和用戶界面。
在linux操作系統中,尚不能支持KDE,然而但是如果在KDE系統內安裝有GTK的運行庫,那么SWT/JFace應用程序同樣可以運行在KDE桌面。由于KDE是構建在Trolltech Qt套件基礎之上的,而Qt套件的發布許可協議比CPL有著更多的限制。如果在將來開發了一個KDE版本的SWT類庫,那么現存的所有的SWT/JFace應用程序就可以支持它,并繼承獲得KDE的原生的外觀。
SWT還有一個秘密武器就是其對微軟Pocket PC 2002系統的支持。SWT發行版提供了對于基于StrongARM體系處理器的Pocket PC 2002和Smartphone 2002設備的支持。正是由于SWT的極大靈活性,使得Pocket Pc版本的SWT可以運行于大家熟知的J2SE(標準Java)和J2SE連接首先設備配置的嵌入式設備上。關于和IBM J9虛擬機相聯系的如何在CLDC上構建SWT庫的問題不在本書討論范圍之內。詳情可見Eclipse基金會新聞組的網址:news://news.eclipse.org/eclipse.platform.swt
對于Windows平臺的支持還有一個預想不到的好處:你可以在SWT容器小部件內直接嵌入ActiveX控制。Eclipse平臺使用這一工具方式嵌入微軟網頁瀏覽器控制來獲得嵌入的網頁瀏覽功能。你可以在附錄B的“在SWT/JFace中OLE和ActiveX”中獲得更多的關于ActiveX的技術細節。
Table 1.1 SWT/JFace支持的平臺
Operating system User interface
Windows XP, 2000, NT, 98, ME Windows
Windows PocketPC 2002 Strong ARM Windows
Windows PocketPC 2002 Strong ARM (J2ME) Windows
Red Hat Linux 9 x86 Motif, GTK 2.0
SUSE Linux 8.2 x86 Motif, GTK 2.0
Other Linux x86 Motif, GTK 2.0
Sun Solaris 8 SPARC Motif
IBM PowerPC Motif
HP-UX 11i hp9000 PA-RISC Motif
QNX x86 Photon
Mac OS Carbon
1.4 The WidgetWindow
學習SWT/JFace工具套件的最佳途徑就是通過使用器類來構建GUIs。有了這種傾向性的意識,我們將努力以一個擴張性的項目來觸及SWT/JFace開發的各個不同方面。最先,我們需要構建一些激動人心的東西,如一個web驅動的數據庫顯示。
但細一考慮我們又覺得不妥,因為這樣一來我牽涉到太多無關的代碼,這無形之中給了讀者一個不小的負擔。
因此,我們選擇了一個簡單的應用程序來合成盡可能奪得GUI元素,以此來減少代碼數量。我們認為選項卡折疊器對象(在第三章我們會詳細討論)是在本書中演示用的最簡潔的方式。然后在書中接下來的每一章,然后我們就可以一個新的添加含有該章的主題內容選項卡。圖1.4展示了一個設計好的程序的全部,我們稱其為小部件窗口。
小部件窗口的開發有著諸多功效。當然,表面上看它僅是一個簡單的應用程序集成有SWT和JFace類庫不同的組件。另一方面,它事實上是給了你一個可重用的SWT和JFace代碼的知識庫。由于它是一個多類單一項目,相對于單一類多庫,小部件窗口可以確保你可以在你自己的用戶界面中重用它的每一個部份。
圖1.4 小部件窗口應用程需這一擴張性的項目將會集成本書中談到的每一個GUI和圖形組件。
1.5 小結
SWT和JFace類庫對于構建用戶界面是高效的,但對于它們自己而言,它們并不能作任意簡化。就像在其他工具套間中一樣,還是需要定位和操控諸如按鈕、容器、標簽和菜單等。好在,這一工具套件背后蘊涵的哲學使得其具有革命性。
SWT和JFace或許并不完全遵循Java意識形態的各項規則,但通過其假疏絲組織的發展,它比Java在更大程度上貫徹和實踐了開放源代碼軟件的宗旨與目標。
SWT/JFace不僅無需要任何的許可證或是授權,還允許你程序員可以基于它作開發并收取費用。如果你開發了一個新的操作系統并且需要一套開發工具來吸引程序員到你的平臺上來,那么你所需作的就是為你的系統適當裁減SWT和JFace。如果你正在構建一個新的編程語言,并且不滿足于簡單的行命令或是連接,那么帶有SWT和JFace的Eclipse平臺對于你的任務來說是相當合適的。
當java開發者們在爭論相較與其他套件SWT/JFace的優點時,他們事實上僅考慮到當前或者時接下來6個月的能力。這一思維定式忽視了SWT和JFace的這么一個事實,就是:象Eclipse一樣,因為有著來自全球的公司的、個人的貢獻,Eclipse,SWT/JFace的發展幾近于一個流行市場。如果在將來繼續積聚開發人員的大量時間,
SWT和JFace就可以象它正在進行的革新一樣,唾手可得取得勝利。
歷史上,軟件開發始終未能成為IBM的強項,但我們對于IBM的這種通過向開放源代碼貢獻力量來提升IBM硬件價值的理念心存感激。
Eclipse和SWT/JFace的自由和靈活性以及其開發人員的激情,使得我們有理由相信這一工具套件會在今后數年內不斷助益開放源代碼開發社區。
閑語少說,我們開始我們的編程吧!