Java图形用户界面的XML描述方法
2009-01-08
作者:张鹏 徐鹏
1 引言
不可否认,图形用户界面(GUI)工具包作为高级编程语言的核心技术之一,能够充分地体现一门高级语言的强大功能和先进的理念。Java作为一门最受全世界软件开发者们欢迎的高级编程语言,其GUI工具包的丰富多样,一直被人们所津津乐道。无论是早期的AWT,轻量级的Swing,还是时下颇为流行的SWT,都有其值得称道之处。不过,面对众多的选择,也有无法解决的难题。
首先,从设计语言来说,可能需要针对不同的要求采用不同的编程语言来开发,即便是采用同一种编程语言,也可能需要使用不同的软件包来实现GUI的开发,例如在使用Java编程语言的前提下,可能需要针对不同的运行时环境使用AWT、JFC或SWT等不同的工具包来设计GUI。即使是在像AWT, Swing和SWT这样的“孪生”工具包上,大规模的代码重用也是不可能的。
看到问题产生的本质就很容易发现解决问题的办法。
工具包实现之间的差异导致了互相之间的不兼容性,解决之道自然是总结和概括这些工具包之间的异同,并抽象出一种跟实现无关的图形用户界面描述方法。采用这种描述方法,开发者可以节省很多时间和精力。例如,一个开发者需要在m种工具包上实现n个图形用户界面。如果采用一般的编程方式,就需要写共m*n份代码;如果采用抽象描述方法,只需要针对m种工具包各开发一个解释器(解释器将在本文的第四节讲述),再用描述方法设计这n个图形用户界面,即共需要编写m+n份“代码”。这不仅大大减少了开发者的编码量,而且这m个解释器程序完全可以复用,虽然它们的实现有点冗长。
很早开始,就有研究者着手于抽象描述方法的研究,直到XML技术的广泛使用,才使得研究者认识到XML是用来抽象描述图形用户界面的最佳载体。不久前,Micromedia公司针对其独有的Flash技术,发布了一种描述图形用户界面的XML语言——MXML,并发行了基于MXML的开发环境Flex;Mirosoft公司也宣称在其下一代的Windows操作系统Longhorn中将嵌入使用XAML语言的图形用户界面引擎Avalon[2];Mozilla开发小组也专门为Mozilla浏览器的开发定义了一种用于描述用户界面的语言XUL[3]。在Java环境下,也有许多相关成果。例如,在Sun Microsystem公司推出的Java集成编辑环境NetBeans 3.5以上版本当中,图形用户界面的编辑器就采用一种自定义的XML格式描述界面开发中的中间结果[5]。另外,一种基于AWT工具包的图形用户界面描述工具Bambookit已经进入了商业化阶段[4]。
经过对现有这些描述方法的仔细研究和比较,发现它们都只是专门针对一种工具包,而且定义的描述语言不够抽象。这就使得这些描述方法和语言无法用来描述其他工具集上的图形界面,也就是说,它们基本上无法“跨平台”使用。
而本文介绍JUIL(Java User Interface Language)所采用的描述机制。在对国际现有规范和技术标准进行调研的基础上,从分析图形用户界面的基本元素入手,力图做到多工具包的支持,甚至多编程语言的支持。本文的第二部分分析了图形用户界面的基本组成元素;第三部分则详细介绍JUIL的描述机制;第四部分简单说明JUIL解释器;最后,给出本文的总结和对未来工作的展望。
2 图形用户界面的基本元素
在Java当中,编写一个图形用户界面的基本流程是:首先,使用图形界面工具集预定义的控件(Control),例如Swing中的JFrame,JButton等,构造一个界面所需要的框架;同时,还需要为这些控件的显示样式设置参数,包括要在控件上显示的文本、图像等;然后,为每一个用户可操作的控件编写事件处理的代码,并与之关联。粗略的总结一下,似乎Java中的一个图形用户界面只有两个部分:图形化的界面和用户事件处理的逻辑。这个结论是从编程的角度得出的。但是,稍稍资深的图形用户界面开发者能够很清楚的告诉你:图形界面的显示内容实际上是和界面的框架构造没有必然关系的。例如一个菜单里的菜单项是显示中文还是英文,与菜单项的排列顺序毫无关系。而且,在面临国际化问题时,显示内容和界面框架代码是否能够做到互不干扰的修改,是决定开发投入的重要因素之一。既然如此,显示内容就需要独立于界面的框架构造,成为定义图形用户界面时的另一个重要部分。
综合上面的分析,再加以概括和抽象,我们可以得到足够描述一个图形用户界面的三元组:结构(Structure),内容(Content),行为(Behavior)。
结构(Structure):包括界面所需的控件,以及它们的样式和组织关系。例如,一个界面的结构描述可以包含如下信息:窗口上在什么位置放置了一个面板,面板的背景色和前景色是什么,以及在它内部又放置了几个何种类型的控件,等等。
内容(Content):界面上需要显示的文本、图像、声音和视频等资源。就像前面所分析的,例如菜单上所显示的文字、图标,程序运行过程中出现的各种提示信息等等,都属于内容。
行为(Behavior):定义整个界面如何运行,以及对用户操作如何进行响应。这部分对于Java开发者来说十分容易接收,即对界面上用户触发的各种事件所需要作出的处理逻辑。
目前,由表现层、业务逻辑层和数据层构成的MVC三层结构被广泛认为是设计具有图形化用户界面的复杂应用程序最佳的一种设计模式。对比MVC模式和结构、内容和行为三大基本元素的抽象描述方法,可以发现后者其实可以算是前者忠实和完整的应用。
3 JUIL的描述机制
下面的图1给出了JUIL的基本语法结构。为了简单起见,图中的矩形均表示元素,元素的属性没有给出。

图1 JUIL基本语法结构图
3.1
jui元素是JUIL文档的根元素,定义很简单:
>
3.2
name NMTOKEN #REQUIRED
content CDATA #REQUIRED >
这个定义非常简单。元素有name和content两个属性,分别给出一条元信息的名字和内容。下面就是一个简单的例子:
3.3
由图中可以很容易看出,
kit “Swing | SWT | AWT” #IMPLIED
id CDATA #IMPLIED
link-path CDATA #IMPLIED>
kit属性可以指定构造界面所使用的工具集。
前面介绍part元素定义的时候,介绍到它的属性class和子元素
