1 引言?
不可否認(rèn),圖形用戶界面(GUI)工具包作為高級編程語言的核心技術(shù)之一,能夠充分地體現(xiàn)一門高級語言的強(qiáng)大功能和先進(jìn)的理念。Java作為一門最受全世界軟件開發(fā)者們歡迎的高級編程語言,其GUI工具包的豐富多樣,一直被人們所津津樂道。無論是早期的AWT,輕量級的Swing,還是時下頗為流行的SWT,都有其值得稱道之處。不過,面對眾多的選擇,也有無法解決的難題。?
首先,從設(shè)計語言來說,可能需要針對不同的要求采用不同的編程語言來開發(fā),即便是采用同一種編程語言,也可能需要使用不同的軟件包來實(shí)現(xiàn)GUI的開發(fā),例如在使用Java編程語言的前提下,可能需要針對不同的運(yùn)行時環(huán)境使用AWT、JFC或SWT等不同的工具包來設(shè)計GUI。即使是在像AWT, Swing和SWT這樣的“孿生”工具包上,大規(guī)模的代碼重用也是不可能的。?
看到問題產(chǎn)生的本質(zhì)就很容易發(fā)現(xiàn)解決問題的辦法。?
工具包實(shí)現(xiàn)之間的差異導(dǎo)致了互相之間的不兼容性,解決之道自然是總結(jié)和概括這些工具包之間的異同,并抽象出一種跟實(shí)現(xiàn)無關(guān)的圖形用戶界面描述方法。采用這種描述方法,開發(fā)者可以節(jié)省很多時間和精力。例如,一個開發(fā)者需要在m種工具包上實(shí)現(xiàn)n個圖形用戶界面。如果采用一般的編程方式,就需要寫共m*n份代碼;如果采用抽象描述方法,只需要針對m種工具包各開發(fā)一個解釋器(解釋器將在本文的第四節(jié)講述),再用描述方法設(shè)計這n個圖形用戶界面,即共需要編寫m+n份“代碼”。這不僅大大減少了開發(fā)者的編碼量,而且這m個解釋器程序完全可以復(fù)用,雖然它們的實(shí)現(xiàn)有點(diǎn)冗長。?
很早開始,就有研究者著手于抽象描述方法的研究,直到XML技術(shù)的廣泛使用,才使得研究者認(rèn)識到XML是用來抽象描述圖形用戶界面的最佳載體。不久前,Micromedia公司針對其獨(dú)有的Flash技術(shù),發(fā)布了一種描述圖形用戶界面的XML語言——MXML,并發(fā)行了基于MXML的開發(fā)環(huán)境Flex;Mirosoft公司也宣稱在其下一代的Windows操作系統(tǒng)Longhorn中將嵌入使用XAML語言的圖形用戶界面引擎Avalon[2];Mozilla開發(fā)小組也專門為Mozilla瀏覽器的開發(fā)定義了一種用于描述用戶界面的語言XUL[3]。在Java環(huán)境下,也有許多相關(guān)成果。例如,在Sun Microsystem公司推出的Java集成編輯環(huán)境NetBeans 3.5以上版本當(dāng)中,圖形用戶界面的編輯器就采用一種自定義的XML格式描述界面開發(fā)中的中間結(jié)果[5]。另外,一種基于AWT工具包的圖形用戶界面描述工具Bambookit已經(jīng)進(jìn)入了商業(yè)化階段[4]。?
經(jīng)過對現(xiàn)有這些描述方法的仔細(xì)研究和比較,發(fā)現(xiàn)它們都只是專門針對一種工具包,而且定義的描述語言不夠抽象。這就使得這些描述方法和語言無法用來描述其他工具集上的圖形界面,也就是說,它們基本上無法“跨平臺”使用。
而本文介紹JUIL(Java User Interface Language)所采用的描述機(jī)制。在對國際現(xiàn)有規(guī)范和技術(shù)標(biāo)準(zhǔn)進(jìn)行調(diào)研的基礎(chǔ)上,從分析圖形用戶界面的基本元素入手,力圖做到多工具包的支持,甚至多編程語言的支持。本文的第二部分分析了圖形用戶界面的基本組成元素;第三部分則詳細(xì)介紹JUIL的描述機(jī)制;第四部分簡單說明JUIL解釋器;最后,給出本文的總結(jié)和對未來工作的展望。?
2 圖形用戶界面的基本元素?
在Java當(dāng)中,編寫一個圖形用戶界面的基本流程是:首先,使用圖形界面工具集預(yù)定義的控件(Control),例如Swing中的JFrame,JButton等,構(gòu)造一個界面所需要的框架;同時,還需要為這些控件的顯示樣式設(shè)置參數(shù),包括要在控件上顯示的文本、圖像等;然后,為每一個用戶可操作的控件編寫事件處理的代碼,并與之關(guān)聯(lián)。粗略的總結(jié)一下,似乎Java中的一個圖形用戶界面只有兩個部分:圖形化的界面和用戶事件處理的邏輯。這個結(jié)論是從編程的角度得出的。但是,稍稍資深的圖形用戶界面開發(fā)者能夠很清楚的告訴你:圖形界面的顯示內(nèi)容實(shí)際上是和界面的框架構(gòu)造沒有必然關(guān)系的。例如一個菜單里的菜單項是顯示中文還是英文,與菜單項的排列順序毫無關(guān)系。而且,在面臨國際化問題時,顯示內(nèi)容和界面框架代碼是否能夠做到互不干擾的修改,是決定開發(fā)投入的重要因素之一。既然如此,顯示內(nèi)容就需要獨(dú)立于界面的框架構(gòu)造,成為定義圖形用戶界面時的另一個重要部分。?
綜合上面的分析,再加以概括和抽象,我們可以得到足夠描述一個圖形用戶界面的三元組:結(jié)構(gòu)(Structure),內(nèi)容(Content),行為(Behavior)。?
結(jié)構(gòu)(Structure):包括界面所需的控件,以及它們的樣式和組織關(guān)系。例如,一個界面的結(jié)構(gòu)描述可以包含如下信息:窗口上在什么位置放置了一個面板,面板的背景色和前景色是什么,以及在它內(nèi)部又放置了幾個何種類型的控件,等等。?
內(nèi)容(Content):界面上需要顯示的文本、圖像、聲音和視頻等資源。就像前面所分析的,例如菜單上所顯示的文字、圖標(biāo),程序運(yùn)行過程中出現(xiàn)的各種提示信息等等,都屬于內(nèi)容。?
行為(Behavior):定義整個界面如何運(yùn)行,以及對用戶操作如何進(jìn)行響應(yīng)。這部分對于Java開發(fā)者來說十分容易接收,即對界面上用戶觸發(fā)的各種事件所需要作出的處理邏輯。?
目前,由表現(xiàn)層、業(yè)務(wù)邏輯層和數(shù)據(jù)層構(gòu)成的MVC三層結(jié)構(gòu)被廣泛認(rèn)為是設(shè)計具有圖形化用戶界面的復(fù)雜應(yīng)用程序最佳的一種設(shè)計模式。對比MVC模式和結(jié)構(gòu)、內(nèi)容和行為三大基本元素的抽象描述方法,可以發(fā)現(xiàn)后者其實(shí)可以算是前者忠實(shí)和完整的應(yīng)用。?
3 JUIL的描述機(jī)制?
下面的圖1給出了JUIL的基本語法結(jié)構(gòu)。為了簡單起見,圖中的矩形均表示元素,元素的屬性沒有給出。?
圖1 JUIL基本語法結(jié)構(gòu)圖?
3.1
jui元素是JUIL文檔的根元素,定義很簡單:
??
?
>?
3.2
?
?
?? name NMTOKEN #REQUIRED?
?? content CDATA #REQUIRED >?
這個定義非常簡單。元素有name和content兩個屬性,分別給出一條元信息的名字和內(nèi)容。下面就是一個簡單的例子:?
?? ?
?? ?
?? ?
?? ?
?
3.3
由圖中可以很容易看出,
?
?? kit “Swing | SWT | AWT” #IMPLIED?
?? id CDATA #IMPLIED?
?? link-path CDATA #IMPLIED>?
kit屬性可以指定構(gòu)造界面所使用的工具集。?
前面介紹part元素定義的時候,介紹到它的屬性class和子元素