在Java中轻松打印文档 - 编程入门网
而不会在底部被分开。如果行数契合,就执行打印,如果 不契合,则将它记录下来以便在下一页中执行打印。
包含在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)。 然而这个视图的树型结构也存在一个问题。你不能确定在一个代表打印文本 的叶视图结束之前分支视图从根视图中被分出了几次。你可以通过使用 DocumentRenderer 类中的一个简单的循环方法来解决这个问题。 printView方法循环经过视图的分支结构来查找可打印的叶视图。这种方法将 一个视图作为其中一个参数。它从根视图开始对每个视图进行检查以测定它是否 有相关的子视图。如果有,则printView会依次调用每个子视图将其作为其视图 参数。这样一来,这个方法最终会运行至整个树型结构。当该方法发现一个不带 子视图的叶视图时,它会在用于打印的绘制环境中检测它的位置。这个方法只用 于绘制那些完全契合于该环境的可打印部分的叶视图。当一个叶视图分跨 (straddle)页面的底部时,这个方法就会记录该页面上沿的位置以便使下一页 从这个位置开始。因此分页符就不会从文本的行当中断开了。 如果你想要更深入地了解打印视图的用法,你可以查找DocumentRenderer类 的源代码。我们对它进行了注释讲解。由于它只有不到200行的代码,因此我们 有充足的时间来给它加上注释。 该类的局限 我们在Java SDK 1.3和1.4版本中对DocumentRenderer进行过测试,尽管它应 该是适用于实现Swing的所有Java版本的。DocumentRenderer是通过标准的Java 技术来运行的,因此它不能实现比Java本身更好或更糟的文本绘制。在 JEditorPane中不能显示的字符也将无法显示在纸上。 Java在Windows环境下对文本进行测定时有一个小问题。由于文本没有被精确 地测定,一些位置可能有些偏离。由于这些错误很小所以通常不是什么大问题, 但它会在对文本右对齐(right-justified |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |