Swing界面設計工具的基本思想和技術

轉載:http://blog.sina.com.cn/s/blog_4b6047bc01000be9.html 
 
對於未知技術的原理,我總喜歡本身想像它是如何實現的。我上學時互聯網搜索技術尚未怎麼流行。你們學習新技術的方法,老是第一去查教科書,第二去找論文,第三去問師兄。而我想知道的技術每每都是教科書上找不到,論文中不多說起的,師兄們不多去想的事情。因而不少時候就本身想像它們是如何實現的。
    圖形界面設計技術對我來講就是這樣。我很早之前就對這種技術很感興趣,可是可以查找到的資源不多。我經常本身冥想圖形設計界面是如何畫出來的;描述界面的元數據和代碼是如何解析和映射的;界面組件屬性是如何設置和查看的。後來隨着對於Swing原理和技術的深刻了解,使得我對實現界面設計工具愈來愈胸有成主,終於在2002年某個時候,大膽動手,一鼓作氣。後來又分別在2003年和2005年分別作過一個,對於其中具體實現技術又有了更深入的理解。
    言歸正傳,前文提到的三個問題也是Swing界面設計工具首先要解決三個問題。
    Swing圖形設計工具界面的繪製通常使用Swing的Renderer思想實現。Renderer思想在前面許多文章中都有說起,其基本原理是將渲染組件的圖形對象傳遞給其餘組件諸如paint、paintAll、paintChildren、paintComponent等渲染方法,讓該組件代理完成具體界面的繪製。這種技術常常在JTable、JList、JTree和JComboBox等複雜Swing組件中使用。Renderer思想是代碼複用和動態綁定思想在Swing架構中的具體體現。它包含的一個深層含義是,對於具體組件外觀的繪製,負責渲染的宿主組件不須要知道被繪製組件的繪製是如何進行的,只要將本身的圖形設備對象傳遞給被繪製組件的渲染方法就能夠了。固然現實中的圖形界面設計工具還須要渲染其餘輔助圖形,如當前選定組件的邊框等。而這些都不會是什麼問題了。
    所以Swing界面設計工具通常首先要在內存中構建被設計界面的組件樹,當要繪製設計工具的界面時,只需將其Graphics對象傳遞給組件樹頂層容器的paint方法就能夠了。
    如何構建被設計界面組件樹呢?這個界面組件樹的數據結構由描述界面的元數據,甚至是界面源代碼碼解析生成。界面元數據或源代碼的解析生成是界面設計工具中最關鍵的技術之一。目前主要有三種解決方法。第一種是Delphi、VB爲表明的資源文件方式,第二種是NetBeans Mattise爲表明的xml界面描述文件方式,第三種是Eclipse VE爲表明的代碼解析和生成技術。Java界面設計工具通常採用後兩種方式。
    界面描述文件方法相對比較簡單。其核心思想是將界面組件樹採用xml文件(或其它格式)的方式保存起來,之後或者預先生成靜態界面源代碼代碼,或者在運行時根據它動態生成界面。因爲xml的解析要比java代碼的解析簡單得多,因此採用這種方式實現比較簡單,並且界面設計動做容易控制。缺點是必須維持描述文件和源代碼文件的同步,另外這種xml配置文件語法結構每每是非公開的,使得它設計的界面文件不能被其餘界面設計工具所複用。另外程序員不能隨意修改生成代碼,描述文件和源代碼之間生成關係是單方向的。
    第三種直接將Java界面源代碼解析成組件數。這種方法也有兩種作法,一種是對代碼進行語法語義分析,並構建出要設計的界面組件樹來;一種是使用Java編譯器將源文件編譯成最終class,使用類加載器動態加載並反射生成最終組件樹。前者缺點是很是複雜,須要豐富編譯知識;優勢是不須要將源代碼編譯經過。後者優勢是解析很是簡單,所有交給了編譯器完成;缺點是若是源碼存在編譯錯誤,就沒法最終生成設計界面。
    第三個基本技術,即組件屬性的反射通常使用Java Beans技術實現。Java平臺提供瞭解決界面設計工具組件反射的工具,如BeanIntrospector、BeanDescriptor等類,它們創建在Java反射技術的基礎上,提供解析和設置JavaBean(主要是組件對象)屬性的機制。用來查看和設置組件屬性的控件一般稱做屬性頁,在Swing能夠經過表格JTable結合Renderer/Editor思想實現。
    今天的文章先就Swing界面設計工具的基本思想和技術作一個簡單的概述,後面將就這三個方面的技術在圖形界面設計工具的應用進行詳細地描述。
相關文章
相關標籤/搜索