JFace 视图

[url]http://blog.itpub.net/post/5050/23410[/url]


基本的部件平台SWT仅仅提供了一些直接的接口,这些接口实现仅限于对一些简单数据类型的应用,比如基本的字符串类型,数值类型已及图片等。针对大多数应用程序也许这些实现已经足够了,但是如果需要在列表框、表格、树状结构、文本处理中来处理一些要求比较严格的对象时,这些小控件的使用受到了挑战。那么在SWT小控件基础之上进行更高一级的面向对象的封装便产生了JFace 视图框架。


象ListViewer、TableViewer以及TreeViewer这些JFace列表视图允许用户可以直接使用自己定义的数据模型,而没有必要手动地把一些基本的字符、数字、图像元素分开来组织处理。这些视图类通过提供一些适配器接口来组织上述元素,还可以直接访问列表视图中某一个项目的子结点(比如树型试图),这些适配器接口同时提供了列表视图项目的选择、排序、过滤以及转换一些输入到底层SWT部件所能匹配的列表中(见图5-1)。
[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_1.jpg[/img]


Figure 5-1 视图和适配器之间的关系


5.1.1. 标签提供接口适配器


在列表视图中,标签提供器是一种最常见的适配器类型。标签提供器用来把一个数据模型对象在视图列表中映射成一个或者多个可显示的文本字符串或者图形元素。其中两个最常见的标签提供器是IlabelProvider(见图 5-2)和ITableLabelProvider (见图 5-3) , IlabelProvider用在列表框和树型结构视图中而ItableLabelProvider 多用在表格试图中,前者主要是为列表项提供单一的图像和文本内容而后者为可以提供多个图像以及文本标签(针对表格中的每一列提供一套图形和文本元素)。通过视图接口方法setLabelProvider()可以使得一个标签提供器与之关联。


ILabelProvider提供了如下常用方法:


getImage(Object) -为指定的元素标签提供图像元素。


getText(Object) -为指定的元素提供文本描述。

[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_2.jpg[/img]
图5-2 标签提供器集成结构


getColumnImage(Object, int) - 为表格视图中某一行元素指定的列提供图像元素。


getColumnText(Object, int) - 为表格视图某一行元素指定的列提供文本描述。

[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_3.jpg[/img]
图5-3 Table标签提供器


标签提供器的例子可以参考5.1.6节。


5.1.2. 内容提供接口适配器


内容提供器同样也是所有列表视图集合中一种重要的适配器。内容提供器主要用来使得一个数据模型对象或多个数据模型对象组成的一个集合作为视图的数据输入或者为结构化视图的集合列表提供主要的数据输入。使用在列表和表格中的IstructuredContentProvider和使用在树形结构中的ItreeContentProvider是两种常见的内容提供器(见图 5-4)。IstructuredContentProvider通常将一个数据模型对象映射成一个数组而后者为树形结构视图项目分别提供其获得父结点元素和孩子结点元素的支持。同样setContentProvider()可以使得内容提供器和某个视图相关联。数据的输入可以通过方法setInput()与视图相关联。

[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_4.jpg[/img]
图 5-4 内容提供器继承层次结构


IStructuredContentProvider提供的常用方法:

getElements (Object) -返回显示在视图中的某一个输入元素的所有元素。

inputChanged(Viewer, Object, Object) -通知内容提供器视图中的某一个输入对象被转换到另外一个不同的元素。


ITreeContentProvider提供的常用方法:

Object[] getChildren(Object) -为指定的结点元素获得其所有孩子结点对象。这个方法和上面提到的getElements(Object)方法的不同之处是getElements(Object)


用来获得一个树形视图的根结点元素,而getChildren(Object)用来对给定的父结点元素获得其所有的下层孩子结点(包括根结点)。

getParent(Object) -返回给定结点元素所属的父结点,如果不存在返回null.

hasChildren(Object) -给定的结点是否拥有孩子结点。


关于内容提供器的例子可以参考5.1.6章节。


5.1.3. 视图排序适配器


排序适配器(见图5-5 ViewerSorter继承层次结构)主要用来对内容适配器所提供的元素进行排序(见图5-1)。如果没有为视图提供排序适配器,元素的排列顺序将和内容提供适配器返回的顺序一致。通过setSorter()方法可以将一个排序适配器与一个视图关联。


默认排序策略分为两步。首先将元素分组(从0到n级),然后再基于这个分组之上根据标签适配器提供的标签文本排序。默认情况下,所有的项目均属于同一个分组,因此所有的项目也就通过他们的文本标签进行排序。作为您的应用程序您可以覆盖默认的分组侧略作为排序规则而不是使用基本的标签文本排序逻辑。

[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_5.jpg[/img]

图5-5 视图排序适配器继承层次结构


ViewerSorter提供的常用方法:

category(Object) -返回指定元素所属的组。

返回前后两个对象的比较结果,前者大于后者返回正数、等于返回0、小于返回负数。

getCollator()-为排序文本返回校对器。

isSorterProperty(Object, String) - 当一个指定的元素的属性发生变化时试图的排序适配器是否受到影响。

sort(Viewer viewer, Object[]) -排序给定的数组对象。


关于视图排序适配器的例子可参见5.1.6章节


5.1.4. 视图过滤适配器


视图过滤适配器接口提供了一种过滤方法(见图5-6 ViewerFilter视图继承结构),通过应用该过滤方法,该视图可以显示内容提供适配器接口提供内容的一个子集(见图5-1)。如果没有为一个视图提供过滤适配器,则所有的元素将显示在视图中。通过调用视图的setFilter()方法将一个视图过滤适配器的实现与之关联。

[img]http://blog.itpub.net/resserver.php?blogId=5050&resource=ClaybergRubelFig5_6.jpg[/img]

图5-6 视图过滤适配器继承层次结构


下面是ViewerFilter一些常用方法。一些简单的View Filters仅仅需要覆盖方法select(Viewer, Object, Object) 来决定某一个元素是否显示在Viewer中。

filter(Viewer, Object, Object[]) - 过滤视图中的元素。这个方法的默认实现是调用下面的select(Viewer, Object, Object) 方法。

isFilterProperty(Object, String) - 判断某一个给定的viewer元素的属性发生变化时是否产生过滤效果,这个方法的默认实现将返回false。

select(Viewer, Object, Object) - 判断某一个给定Viewer元素在这个过滤器中是否被选中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值