熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java GUI的發展和演化簡史

2013-11-23 19:21:05  來源: Java核心技術 

  當Java在年的春天第一次發布的時候它包含了一個叫AWT(Abstract Windowing Toolkit)的庫用來構建圖形用戶界面應用程序Java很有雄心的宣言--write once run anywhere許諾一個具有下拉菜單命令按鈕滾動條以及其他常見的GUI控件的應用程序將能夠在各種操作系統上運行而不必重新編譯成針對某一平台的二進制代碼包括Microsoft Windows Suns own Solaris Apples Mac OS以及Linux

  雖然最初Java是支持操作系統獨立的應用程序開發在Java提出write once run anywhere宣言那段時間的革命導致了Java applet和主導桌面應用程序計劃的產生

  盡管從那以後大部分構建桌面應用程序的成就都慢慢衰退Java構建圖形用戶界面的能力反倒增強了跟蹤Java GUI的發展和演化我們將發現個主要的構建窗口程序庫:AWTSwing和SWT(Standard Widget Toolkit)在這一章裡我們將查看和分析這個庫中的每一個庫並且我們將一起來看一看第個庫--JFace其實JFace不算一個真正的構建窗口程序庫而是在基於SWT之上的一個抽象層

  AWT

  很多圍繞著介紹Java技術的令人激動的地方都基於applets--一個可以讓程序通過Internet發布並在浏覽器內執行的新技術用戶和開發人員都熱衷於斯因為applets許諾將簡化跨平台應用程序的開發維護和發布而這是商業軟件開發中幾個最富挑戰性的話題

  為了方便用Java構建圖形用戶界面Sun最初提供了一個在所有平台下具有的獨特Java外觀的圖形界面庫Sun在applet技術策略方面的首要伙伴Netscape提出applets應該維持和運行時平台一樣的外觀他們希望applets在某一平台下在顯示和行為上能夠像其他應用程序一樣

  為了實現Netscape的本地外觀的目標在JDK的第一個發布版中包含了AWT這個庫AWT的缺省實現使用了對等機制即每一個Java GUI窗口部件都在底層的窗口系統中有一個對應的組件

  例如每一個javaawtButton對象將在底層窗口系統中創建一個唯一對應的button當用戶點擊那個按鈕的時候事件將從本地實現庫傳送到Java虛擬機裡並且最終傳送到與javaawtButton對象相關聯的邏輯對等系統的實現以及Java組件與對等組件之間的交流的實現都隱藏在底層JVM實現中Java語言級的代碼仍然跨平台

  盡管如此為了保持write once run anywhere的許諾Java不得不妥協和折衷特別的Java采用了最小公分母的方法即AWT僅僅提供所有本地窗口系統都提供的特性這就需要開發人員為更多高級特性開發他們自己的高級窗口部件然後提供給用戶不同的使用體驗

  其他的問題也減緩了人們對applets的接受和承認Applets運行在一個安全的沙箱裡面並且能夠阻止惡意的applets對文件系統網絡連接等資源的濫用盡管沙箱提供了安全性但它閹割了應用程序畢竟一個應用程序不能運用一個網絡連接來保存一個文件是不好的Java GUI應用程序也不能像本地程序一樣響應靈敏這是在當前硬件平台和Java的解釋性天性下預期結果

  所以用AWT開發的應用程序既缺少流行GUI程序的許多特性又不能達到在顯示和行為上像用本地窗口構建庫開發的程序一樣的目標應該有一個更好的庫來讓Java GUI取得成功

  Swing

  於年JavaOne大會上提出並在月發布的JFC(Java Foundation Classes)包含了一個新的使用Java窗口開發包這個新的GUI組件叫做Swing感覺到它是對AWT的升級並且看起來對Java占據計算機世界很有幫助對Java來說已經萬事具備了:可下載的applets將是未來的軟件人們將從其他操作系統轉向JavaOS從傳統的計算機轉向叫做JavaStation的瘦客戶端網絡計算機Microsoft將最終因為不能在桌面程序領域與之想抗衡而被廢黜雖然這些景象從來沒有實現Swing作為Java applets和applications的GUI庫倒確實十分繁榮

  Swing架構

  盡管Swing僅僅是這個新組件的指代名稱它一直持續使用到今天可能是因為這個名稱太貼切了Swing嘗試著以以下幾種方式改變公認的觀點:

  AWT依賴對等架構用Java代碼包裝本地窗口部件Swing卻根本不使用本地代碼和本地窗口部件

  AWT把繪制屏幕交給本地窗口部件Swing自己的組件繪制自己

  因為Swing不依賴本地窗口部件它可以拋棄AWT的最小公分母的方法並在每個平台下實現每個窗口部件從而創建一個比AWT更強大的開發工具包

  Swring缺省情況下采用本地平台的顯示外觀然而它並不僅僅限於此而是還可以采用插件式的顯示外觀因此Swing應用程序可以看起來想Windows應用程序Motif應用程序Mac應用程序甚至它自己的顯示外觀--金屬所以Swing應用程序可以完全忽略它運行時所在的操作系統環境並且僅僅看起來像自己這是單調一致的桌面應用程序外觀的一大挑釁想象一下Swing有多傲慢!

  盡管如此Swing組件超越了簡單的窗口部件它體現了正不斷出現的設計模式以及一些最佳實踐采用Swing你不僅僅得到GUI窗口部件的句柄和它所包含的數據而是定義一個模型去保存數據定義一個視圖去顯示數據定義一個控制器去響應用戶輸入事實上大部分Swing組件的構建是基於MVC(modelviewcontroller)模式的MVC使應用程序開發變得更清晰更易維護和管理

  Swing的缺點

  盡管Swing在AWT的基礎上做出了巨大的改進它仍然沒能使Java作為構建桌面應用程序的工具也許Swing的擁護者會立即舉出Swing的成功應用案例例如開源文本編輯器jEdit或者Borland的UML(Unified Modeling Language)建模工具Together但是Swing應用程序仍然在桌面應用方面顯得很少Sun提出了一個記錄可得到的Swing應用程序的列表Swing Sightings來證明Swing應用是值得注目的然而我們也看到了C++ SightingsVisual Basic Sightings的網頁

  為什麼Swing沒有履行它的諾言?原因可能歸結為下面兩點:

  速度的缺乏

  界面外觀

  Swing的狂熱者可能會對Swing速度慢這一點感到忿忿不平不可否認JIT(justintime)編譯器Java虛擬機以及Java語言本身就使得Swing應用程序和本地程序拉開了一定差距盡管如此Swing仍顯得比本地應用程序行動緩慢和響應不積極由於桌面計算變得越來越快用戶的速度期望值也隨之增加任何可感知的遲緩都將是無法忍受的

  對Swing的顯示外觀的問題的抱怨也引起了Swing的開發者的憤怒畢竟他麼宣稱Swing擁有各種可插入式的外觀並且事實上可以顯示成任何樣子JSE 甚至添加了對Windows XP和GTK+的支持以致於在這些平台下運行的Swing應用程序會自動采用該平台的外觀

  盡管如此問題仍然存在:Swing將一直處於最新的圖形用戶界面的後面因為必需在Java庫裡明確地添加對最新GUI的支持當使用JSE 或更早的版本時在Windows XP上運行的Swing應用程序將顯現為Windows 的外觀而且當使用XP themes或WindowBlinds等軟件來改變皮膚或圖形外觀時用戶日益銘記他們自己的特征和個性而Swing不僅不理會操作系統甚至連用戶參數選擇也不理會

  簡短的說Swing應用程序不像本地應用程序一樣執行外觀也不一樣Java要想擺脫常年以來處於不斷學習中的地位並掌握桌面應用程序開發中的眾多角色它的GUI仍需要改進

  SWT

  當社區人員開始構建Eclipse時他們意識到Swing和AWT都不足以用來構建真實世界的商業程序結果他們決定構建一套新的GUI開發工具包用來顯示Eclipse界面這個工具包借用了VisualAge SmallTalk中的大量的庫他們把這個新的工具包命名為SWT(Standard Widget Toolkit)意識到本地行為需要本地窗口部件SWT的設計者們采用了AWT的對等架構而僅僅當本地組件不存在時(例如Motif下的樹形組件)才求助於Java實現這樣SWT吸收了AWT和Swing實現的最好的部分:當可以得到本地組件時使用本地實現當不能得到本地組件時使用Java實現這就同時保證了與本地窗口部件相當的外觀和響應度

  SWT於年與Eclipse IDE(Integrated Development Environment)一起集成發布在這個最初發布版之後SWT發展和演化為一個獨立的版本它可以使用與眾多操作系統包括Microsoft WindowsMac OS X以及幾種不同風格的Unix等寫作本書的這個時候當前官方發布版本為版為beta版現在也可以下載本系列文章采用SWT

  另一個重要的優勢為SWT的源代碼是在一個開源許可下免費可得並無病毒的這就意味著你可以在你的應用程序中使用SWT並且在任何許可認證下發布它源代碼對理解SWT庫的低級別功能性和調試應用程序都是很有幫助的開源軟件也意味著比商業發布軟件更新的更加頻繁

  JFace

  JFace的構建基於SWT它提供了SWT的功能和更簡易的MVC模式SWT使用直接的API提供了原生的窗口部件例如你創建一個table部件並且插入你想顯示的行和列的數據JFace則提供了在SWT基礎之上的抽象層所以你可以對抽象層編程然後抽象層與SWT API交互來替代直接對SWT API編程考慮一下對本地C窗口部件接口編程同使用C++GUI類庫的區別或是使用AWT與Swing的區別這些類比將有助於闡述SWT與JFace的區別例如為了使用JFace中的table你仍舊創建table窗口部件但是你不向裡面插入數據反而你將你的content(或model) provider類和你的display(或 view) provider類提供給它接著table調用你提供的類來決定數據內容和怎樣顯示數據內容 JFace沒有徹底地抽象SWT即使在用JFace寫的程序中也會常常出現SWT及它的低級API在本文第二部分帶領您構建正確的SWT基礎之後我們將在第三部分探究JFace的力量

  總結

  從最開始Java就提供了構建跨平台的窗口GUI應用程序庫從AWTSwing到現在的SWT和JFace最初的工具包能力微弱但是後來提供的工具包認識到之前工具包的缺點並取得了巨大的進步SWT和JFace不僅使Java成為一個構建桌面應用程序的可行的選擇也使之成為一個具有優勢的開發平台盡管過去對得到輕便和強大的Java系統的嘗試必然意味著接受它在GUI方面的缺點如今這個不足已經不存在了Java終於可以統領它在桌面計算應用方面的位置了


From:http://tw.wingwit.com/Article/program/Java/hx/201311/26708.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.