JFace
JFace是基于SWT的一套图形工具包,它没有为SWT提供任何新的功能,只是将一些繁琐而且常用的图形操作封装了起来,使得开发工作更加简便。JFace完全使用SWT API进行开发,并没有涉及到SWT中任何平相关的部分,所以JFace没有不同平台版本之分。
JFace的雏形是在Eclipse开发人员编写IDE图形界面时,为了方便而针对一些常见的图形界面开发模式(如对话框等)开发出来的一系列组件。由于JFace只是对SWT的少数常用的部分功能的封装,所以,JFace不能完全代替SWT,通常的开发方式是使用SWT完成大部分的工作,并在适当的时候使用JFace。那么什么是适当的时候呢,这就需要了解JFace到底对哪些常用操作做了封装。
1.Viewer 查看器,使得使用复杂控件进行开发更方便
查看器(Viewer)是使用MVC模式对一些复杂控件做的封装,以方便使用。
目前的查看器有:ListViewer,TableViewer,TreeViewer等。
查看器(如TableViewer)将数据模型从复杂的控件(如Table)中抽象出来,本身作为一个控制器来监听模型的变化和控件的变化,并负责传递这些变化。
开发者不需要具体操作那些复杂的控件,而只需对数据模型进行操作,就可以改变控件显示的内容。当控件的内容在页面上被修改时,查看器收到通知后也会发给数据模型,数据模型接到通知后可以检查这些修改并决定是否接受。查看器并没有将控件隐藏起来,开发者可以通过查看器提供的方法(如TableViewer的getTable方法,TreeViewer的getTree方法等)得到对应的底层控件对象并进行操作。
1)查看器框架
Viewer:所有查看器的父类,在其中包含了MVC的基本概念
ContentViewer:提供对内容提供者和标签提供者的支持,由这两者管理元素在控件中的显示(文字和图标等);
StructureViewer:用来显示结构化(如队列,树)的数据模型,并支持排序、过滤等功能;
需要明确的是,查看器可以做到的事情,直接使用控件也可以做到,查看器只不过是简化了对复杂控件的操作而已。使用查看器,开发者只需要对数据模型进行操作就可以方便的改变控件的显示内容。
查看器的框架有以下几个主要部分组成:
模型和元素:存储着要显示在控件中的数据模型(由开发者编写)
内容提供者和标签提供者:负责将数据模型转换成可以显示的文字和图片(由开发者编写)
控件:显示内容
查看器:负责协调上面各个部分的工作
所有的内容提供者都要实现接口IContentProvider,对应到具体的子类查看器,又有针对它们的数据结构的各种接口,如列表查看器和表格查看器要求内容提供者实现
IStructuredContentProvider接口,而树查看器的内容提供者则需要实现ITreeContentProvider接口。
内容提供者的另一项工作就是监听数据模型的变化,当接收到变化的消息时,要操作查看器以通知它这些变化,查看器会把这些操作转换成针对控件的操作并将变化反映在控件的界面上。
得到元素集合后,下一步就是显示到界面上,那些将元素转换成可以显示的文字和图片的工作由标签提供者(Label Provider)完成。标签提供者需要实现接口IBaseLabelProvider。与内容提供者类似,不同的查看器也需要不同的标签提供者,列表查看器可以使用接口ILabelProvider,而表格查看器则使用接口ITableLabelProvider。
IBaseLabelProvider中提供了一个方法isLabelProperty(Object element,String property),该方法用于判断对应元素element而言,property这个属性是否用于显示。在更新元素的时候,查
看器会通过该方法,如果元素的这个属性不会影响到显示内容,则没有必要更新这个元素的显示。查看器在执行update方法时,就是利用IBaseLabelProvider的这个方法判定该元素是否需要更新。
(1)外部调用Viewer.setInput为查看器指定模型
(2)查看器将新的模型传递给内容提供方
(3)内容提供方在模型上注册监听器,开始监听模型
(4)内容提供方将模型中的元素集合提取出来提供给查看器
(5)查看器将元素交给标签提供方
(6)标签提供方将元素中用于显示的文字、图片信息取出返回给查看器
(7)查看器把信息显示在控件里
(需要一个图示,查看器框架中各对象之间的关系)
2)JFace的列表查看器(ListViewer)、表格查看器(TableViewer)、树查看器(TreeViewer)
可以集合项目具体说一下(待补充。。。)
2.Resource Register 资源注册表,用于管理和自动释放程序中用到的图形系统资源;
使用SWT图形资源的一个原则就是“谁创建谁释放”,然而当程序结构复杂时,释放资源有可能会被遗忘。资源管理注册表就是为了方便图形资源管理而设计的,目前JFace包含了针对字体、颜色和图像资源的注册表。
(这里缺一个图,资源注册表的原理示意图)
JFace在JFaceResource类中为这些注册表提供了以单例(Singleton)模式的实现。使用这些资源注册表,就可以方便地对资源进行创建获取及销毁等操作。
3.Dialog,Wizard Page,Preference Page,包含了一些常用的模式化对话框;
在SWT对话框的基础上JFace实现了许多定制的对话框。如,带有图标的对话框、可以在系统托盘上显示的对话框,供用户输入内容的对话框。向导页(Wizard Page)用来引导用户一步步的完成某项操作的界面;首选项(Preference Page)可以用来设置专业的用户选项卡。JFace的框架帮助开发者完成了页面切换的工作,开发者只需编写每一页的内容并将它们添加到框架中就可以实现向导页或Preference Page的功能。
4.Action & Contribution 操作和贡献,这是用于控制菜单、工具栏等的一套框架;
Action和Contribution是用来定制菜单和工具栏的一套机制。这套机制将菜单、工具栏的按钮和它们所触发的事件分离开来,使得用户操作响应的控制更加灵活。
Action对象封装了一个操作命令。当Action被添加到菜单、工具栏上面时,用户单击这些菜单项或工具栏的按钮就会触发Action对象所代表的命令。为了显示在工具栏和菜单上,Action还包含了图标,ToolTip等信息。
Contribution由Contribution Item和Contribution Manager两部分组成。Action可以用来在工具栏和菜单栏上添加Contribution Item,而利用Action所包含的图标等信息显示工具栏或菜单栏的工作是由Contribution Item来完成的。Contribution Manger是包含了许多Contribution Item的集合。Contribution Item代表了工具栏或菜单栏中的某一项,而Contribution Manger则代表了工具栏或菜单栏。JFace中的Contribution Manger可以用来控制菜单、工具栏和状态栏。Contribution Manger会根据它所包含的Item的信息自动调整这些控件。
(有待完善,源码级别的。。。。)
5.Field Assist,字段帮助,使用它在控件附近县市提示性的标记和内容;
字段帮助(Field Assist)的目的就是为用户提供界面指导。Filed Assist提供两种功能:字段修饰(Decoration Filed),如图片、颜色等作为装饰;内容建议(Content Proposal),允许用户在控件附近弹出一个下拉框,提供用户可以选择的内容。
6.Data Binding,数据绑定,将数据模型与图形界面上的控件绑定起来,减少了程序员为了同步它们的数据而做的复杂工作。
数据绑定功能负责监听界面上所有控件和数据模型的内容,无论哪一方发生变化时都及时通知另一方。使用数据绑定技术,开发者在编写完图形界面并创建绑定后,数据绑定会负责根据变化自动同步数据模型和界面内容显示。当开发者需要获得用户输入时,可以直接访问数据模而不需要每次都编写访问界面控制的代码;当程序需要将数据展示给用户时,也只需更新模型就可以了。