基于Swing的GUI客戶端
今天還有多少人在使用Java Applet作為客戶端?也許使用基于HTML的UI更安全,但這是最好的選擇嗎?
AT&T的一個業務部門Telecorp PCS曾經開發過一個應用程序,使其商店可以收集希望購買移動電話的用戶的資料,檢查其信用卡,然后立即開通移動電話,除了確認用戶輸入的信息外,應用還必須通過使用排序、選擇和其他的標準數據庫功能處理提交的報告。此外,當一個新的移動電話開通后,這個應用程序還需要顯示一個通知。
你能相像用HTML來完成這一切嗎?也許可能,但它將非常討厭,而且速度很慢,需要不間斷地使用網絡連接。Telecorp PCS決定冒險在交互的Applet中使用Java,那么結果如何呢?完全成功,這一應用程序在開發時采用了Swing,并布署在采用了Java插件的互聯網網站上。通過使用Swing UI類,很簡單地完成了應用所要求的功能。
我相信許多開發人員在早期使用Java時,都使用過applet,并且在解決各種瀏覽器之間的不兼容性、applet下載時間、性能方面花費過大量的時間。對客戶端Java最大的批評來自其對象性,但現在情況已經有了很大的改觀。Sun已經花費了大量的時間來改進其代碼的質量,下面我將向你說明為什么基于Swing的UI是值得一試的。
Swing及其布署模式
我無需對Swing的內部架構以及類和界面的設計、設計模板的實現方面有多少新思想多作敘述了。Swing幾乎是我見過的最徹底的窗體系統,它的容器、組件和UI元素之間的關系非常清晰。Swing的架構是基于Model-View-Controller(MVC)設計模板的,其數據與數據的表達和處理相互獨立。
大多數的Swing模型都是由各種UI元素共享的。例如,JTable使用和JList、JTree相同的模型集,這就使得學習和使用Swing非常簡單,而且Command、Observable和Listener等模板提供了很好的靈活性和良好的面向對象特性。也許Swing架構中唯一的不足之處是所有的事件都被交付到相同的EventDispatch線程中,使整個GUI客戶端應用程序只有一個線程。但我們可以通過使用不同的線程響應用戶的命令而不通過EventDispatch線程來完成所有操作,就可以很簡單地克服Swing這一缺點。
Sun發布的每個JDK版本都對Java和Swing的性能都進行了改進。JDK 1.3中與Swing相關的改進表現在性能、內存消耗和一個輸入確認框架。性能和內存消耗方面的改進相當可觀。我們公司將客戶端的應用程序由JDK 1.2.2升級到1.3后,內存消耗降低了30%,一些應用程序內存占用減少得更多。由于Swing內部的初始化過程被優化了,我們的客戶端應用程序的運行速度和響應速度都更快了。簡而言之,對速度影響最大的是加載其他界面組件時自動產生的大量的類,而這一方案中只包含有一個類。另一個重大的變化是缺省的JVM是HotSpot Client VM,它專門針對GUI繪制和客戶端應用程序執行進行了優化,可以通過在命令行方式下運行java命令得到缺省的JVM。 輸入確認框可以使我們很方便地通過編程實現命令字段或輸入確認。在這以前,如果要在處理下一個字段之前,對前一個用戶輸入進行處理,必須在該部件上添加一個監聽程序,每當該部件不再是焦點后都需要對它進行確認,這種方式非常單調和乏味。使用新的InputVerifier類,可以通過創建InputVerifier子類的一個實例,并將它賦予需要確認的JComponent,就能達到相同的目的。在焦點轉換之前,部件將自動地調用verify()方法。
|