在Java中轻松打印文档(二)

2014-11-23 20:27:47 · 作者: · 浏览: 13
Text Package提供了一个View类,它能使你将文档分成单一的、适于绘制的部分。你可以将JEditorPane想象成是由几个视图部分组成的;现在你就可以完全基于这些小部分的大小和位置来打印文档了。

View类的子类用于处理可视性组件(visual component)中的显示和打印文本的任务。然而,处理打印文本的许多程序员没有意识到的是视图可以在显示到纸上时提供这些相同的功能。尽管对视图问题进行详细讨论是本文以外的话题,但在讨论文档打印时对它有一个大致的了解还是很有必要的。

在Swing中,视图被当作处理文本显示的容器。在树型目录中一个根视图可以有多个视图分支。在这些分支的端部会显示代表真实文本的叶视图(leaf view)。

将这个视图的树型结构当作一个由单一的、大的、包含整个文本的视图来考虑。这个文档视图被分成几个段落视图,它被依次分成几个单独的行。尽管真实工作中的视图情况要比这个简单的描述复杂的多,但该例子中显示了如何通过视图来将一个文档分成契合于打印纸的小的部分。通过查看每一行,你可以测定它是否完全契合于打印纸而不会在底部被分开。如果行数契合,就执行打印,如果不契合,则将它记录下来以便在下一页中执行打印。

包含在JEditorPane中的视图采取了一种和在JPanel中的组件行为相类似的操作。一个主要区别在于视图不要求布局管理器(layout managers)来进行位置处理;它们会自己参与布局。这样一来,在JEditorPane中的视图就会象一个真实的组件和布局管理器一样进行操作。视图知道如何查看、如何绘制自己以及在哪里显示其子文档。

视图并不是被直接建立的。更确切地说,它们是由ViewFactory子类的工厂(factory)来生成的。一个ViewFactory生成一个文档并将它们分成根视图以及所需的分支视图和叶视图。工厂会按照这种方式来处理这些乏味的解析文档和计算布局的工作。

你很少能够直接和这些工厂打交道。对很多部分来说,它们是被自动调用的。在JEditorPane中设置文档并调用JEditorPane.validate()方法来将文档发送的适合的工厂中,该工厂则会返回所需的视图。然后这些视图会被用在组件的布局上。

打印视图
DocumentRenderer类能够将需要打印的文档放入jeditorPane中,它是JEditorPane的一个实例。jeditorPane的宽度决定了打印页面的大小而且它会调用一个验证方法来执行布局。DocumentRenderer不会显示这个JEditorPane,因此屏幕显示不会生效。需要被打印的根视图是通过一个有点复杂的jeditorPane用户界面调用来获得的:View rootView =
jeditorPane.getUI().getRootView(jeditorPane);

这个rootView及其子视图可能会对所需信息进行查询以便对打印文档进行布局。这些视图在每部分文本的绘制环境(graphical context)中提供了坐标和大小。通过这些信息你就能够测定这部分文本是否和打印页面相契合。如果契合,则DocumentRenderer将执行打印;如果不契合,该类将对这个用来打印这部分文本而不将其分开的分页符进行测定。

由于视图知道如何自行绘制,因此你无需自己设置字体或颜色。DocumentRenderer以多种字体和颜色通过调用一个简单视图的paint方法来处理式样文本(styled text)。

然而这个视图的树型结构也存