查看器

我们已经知道可以利用 SWT 小窗口来直接实现工作台用户界面添加项(例如,视图、编辑器、向导和对话框),为什么您还要使用查看器?

查看器允许您在创建小窗口时仍然可以使用模型对象。如果直接使用 SWT 小窗口,则需要将对象转换成 SWT 期望的字符串和图像。查看器充当 SWT 小窗口上的适配器,处理用于处理小窗口事件的常见代码,否则,将需要由您自己来实现。

我们首先在 ReadmeSectionsView 的自述文件工具的视图添加项中看到查看器。

public void createPartControl(Composite parent) {
      viewer = new ListViewer(parent);
      ...
   }
注意:可以使用查看器来同时为工作台视图和编辑器提供实现。术语“查看器”并不意味着它们只能用于实现视图。例如,TextViewer 用于实现许多工作台和插件编辑器。

标准查看器

JFace 为 SWT 中的大多数重要的小窗口提供查看器。查看器通常用于列表、树、表和文本小窗口。

每个查看器都有相关联的 SWT 小窗口。可以通过在方便的查看器构造函数中提供父组合体来隐式地创建此小窗口,或者通过首先创建它,然后将它提供给它的构造函数中的查看器,从而显式地创建它。

面向列表的查看器

列表、树和表共享许多从用户的观点来说较为常见的一些功能,例如,填充对象、选择、排序和过滤。

这些查看器保存域对象(称为元素)的列表,并将这些列表显示在其相应的 SWT 小窗口中。列表查看器知道如何从列表中的任何元素中获取文本标号。它从可以在查看器上设置的 ILabelProvider 中获取标号。列表查看器知道如何从小窗口回叫映射回到查看器客户所知道的元素中。

使用平面 SWT 小窗口的客户需要在这样一个 SWT 级别上运行 — 在该级别中,项是字符串,而事件通常与字符串列表中的索引相关。查看器提供了更高级的语义。对于客户,是使用它们提供给查看器的元素来通知对列表的选择和更改的。查看器处理下列各项事务中的所有繁琐工作:将索引映射回至元素、调整对象的过滤视图以及在必要时重新排序。

过滤和排序功能是通过为查看器指定查看器排序器 (ViewerSorter) 和/或查看器过滤器(ViewerFilter)来处理的。(除了列表查看器之外,还可以为树查看器和表查看器指定这些。) 客户只需要提供可以比较或过滤列表中的对象的类。查看器根据指定次序和过滤器来处理填充列表的详细信息,并在添加和除去元素时维护次序和过滤器。

查看器并不是由客户扩展的。要定制查看器,可以用您自己的内容和标号提供程序来配置它。

ListViewer 将列表中的元素映射至 SWT 列表控件。

TreeViewer 显示 SWT 小窗口中的分层对象。它处理关于展开和折叠各项的详细信息。不同 SWT 树控件(普通树、表树和复选框树)具有几种不同类型的树查看器。

TableViewer 非常类似于列表查看器,但是它可以查看表中每个元素的多列信息。表查看器通过引入编辑单元这一概念显著地扩展了 SWT 表小窗口的功能。可以使用特殊单元编辑器来允许用户通过使用组合框、对话框或文本小窗口来编辑表单元。当用户编辑需要时,表查看器会处理这些小窗口的创建和替换。这是通过使用 CellEditor 类来完成的,例如,TextCellEditorCheckboxCellEditor

文本查看器

文本小窗口具有许多常见语义,例如,双击行为、撤销、着色以及按索引或者行来导航。TextViewer 是 SWT StyledText 小窗口的适配器。文本查看器为客户提供了文档模型,并管理从文档至由文本小窗口提供的样式文本信息的转换。

工作台编辑器中更详细地描述了文本查看器。

查看器体系结构

要了解查看器,您必须熟悉查看器的输入元素、它的内容、它的选项以及在它正在处理的小窗口中实际显示的信息之间的关系。

输入元素

输入元素是查看器正在显示(或编辑)的主要对象。从查看器的角度来看,输入元素可以是任何对象。不建议由输入元素来实现任何特定接口。(我们将在讨论内容提供程序时了解一下原因。)

查看器必须能够处理输入元素的更改。如果在查看器中设置了新的输入元素,则它必须根据新元素来重新填充它的小窗口,并取消它自己与前一输入元素的关联。对于每种类型的查看器,注册为输入元素上的侦听器的语义和根据元素填充小窗口的语义是不同的。

内容查看器

内容查看器是这样一种查看器:具有严格定义的协议,用来获取来自于它的输入元素的信息。内容查看器使用两个专门的 helper 类 IContentProviderILabelProvider 来填充它们的小窗口和显示关于输入元素的信息。

IContentProvider 提供了基本的有效期协议,以将内容提供程序与输入元素相关联以及处理输入元素的更改。为不同类型的查看器实现了多个专门的内容提供程序。最常用的内容提供程序是 IStructuredContentProvider,它可以提供给定输入元素的对象列表。它用于类似列表的查看器,例如,列表、表或树。通常,内容提供程序知道如何在输入元素和期望的查看器内容之间进行映射。

ILabelProvider 更加深入。给定查看器的内容(派生自输入元素和内容提供程序),它可以生成在查看器中显示内容所需的特定用户界面元素,例如,名称和图标。标号提供程序可以帮助保存图标资源,因为它们可以确保图标的相同实例用于查看器中所有相似类型。

注意:特定内容和标号提供程序的实例并不会在多个查看器之间共享。即使所有查看器都使用相同类型的内容或标号提供程序,也应该利用每个查看器自己的提供程序类的实例来进行初始化。提供程序有效期协议用于提供程序与它的查看器之间的“一对一”关系。

输入元素、内容提供程序和标号提供程序允许查看器隐藏有关填充小窗口的实现的大部分详细信息。查看器的客户只需要关心是否使用了正确类型的输入和内容提供程序来填充查看器。标号提供程序必须知道如何从查看器内容中派生出用户界面信息。

查看器和工作台

可以通过观察工作台如何使用查看器、内容提供程序和标号提供程序来体现它们的灵活性。

WorkbenchContentProvider 是一个结构化内容提供程序,它通过询问输入元素的子代来获取输入元素的内容。再次使用适配器的概念以实现一般功能。当从它的输入元素中请求元素列表时,WorkbenchContentProvider 将获取输入元素的 IWorkbenchAdapter。如果已经为输入元素注册了 IWorkbenchAdapter,则内容提供程序可以放心地假定可对元素的子代来查询该元素。WorkbenchContentProvider 在工作区更改时还执行必需的工作来保持它的查看器是最新的。

WorkbenchLabelProvider 是一个标号提供程序,它从对象中获取 IWorkbenchAdapter,以查找它的文本和图像。标号提供程序的概念对于工作台对象特别有帮助,因为它允许单个标号提供程序高速缓存查看器中常用的图像。例如,一旦 WorkbenchLabelProvider 获取要用于 IProject 的图像,则它可以高速缓存该图像,并将它用于查看器中显示的所有 IProject 对象。

通过定义常见适配器 IWorkbenchAdapter,并将它向许多平台类型注册,就可以在许多常见查看器和包含它们的工作台视图中正确地表示这些类型。

Copyright IBM Corporation and others 2000, 2003.