| |
Java高级编程:使用打印服务API |
|
时间: 2005-08-29 来自:matrix |
 |
|
|
通过用户界面的打印机选择
就此观点而言,我认为使用的打印机应该由应用程序计划选择。但操作过程中,打印输出内容时往往会显示一个对话框让用户选择。幸运的是,Java通过使用ServiceUI类(在javax.print包中定义)中的静态printDialog()方法使得这些操作简单化。
在显示的对话框旁边,仅在调用printDialog()时必须指定的参数值如下:
·用户可选用的PrintService实例数组。
·默认的PrintService。
·PrintRequestAttributeSet实例。这用来弹出显示的对话框,并在对话框消失之前返回用户所作的任何更改。
要解释这些如何运作,可使用下列简单的代码段来显示打印对话:
运行时,代码产生如图例3中所示的对话框
 Figure 3. The printer dialog | 随着代码的说明,从printDialog()方法返回的值是一个PrintService实例,识别用户所选的打印机,或在用户取消打印机对话时识别为空。此外,PrintRequestAttributeSet已更新到可通过对话框来反映用户作出的更改,比如要打印的份数。
通过使用printDialog()方法,可让用户选择其输出要发往的打印机,提供用户对于专业应用程序的期望功能。
创建打印任务
这是打印中的一个简单步骤;因为一旦获得PrintService的一个参考,你需要做的就是调用createPrintJob()方法,如:
PrintService service; ... DocPrintJob job = service.createPrintJob(); | 代码中显示,从createPrintJob()返回的值是一个DocPrintJob实例,可让您控制并监控打印操作的状态。要启动打印,您会调用DocPrintJob对象的print()方法,但是,这之前,您需要定义待打印的文档或选用PrintRequestAttributeSe。您已经知道如何构造并弹出AttributeSet,这个步骤不再重复,接下来,您将了解定义待打印的文档。
定义要打印的文档
接下来这一步是定义要打印的文档,用一个在javax.print包里的Doc的接口实例来创建。每一个Doc的实例有两个必须定义的属性和一个可选择的属性:
·Object 代表要打印的内容
·DocFlavor的一个实例描述数据类型
·可选的DocAttributeSet 包含打印时的属性
复习Doc接口的文档可以看出javax.print包里包含了一个叫SimpleDoc 的接口的继承,它的构造函数包含了上面三个参数。要知道如何构建SimpleDoc 的实例,我们假设你要打印两份存在http://www.apress.com/ApressCorporate/supplement/1/421/bcm.gif的gif文件拷贝。 我们要做的就是构建一个SimpleDoc实例来描述这个文档创建了一个URL来指向图片,并且引用了DocFlavor,并把这两个传给SimpleDoc构造函数:
URL url = new URL( "http://www.apress.com/ApressCorporate/supplement/1/421/bcm.gif"); DocFlavor flavor = DocFlavor.URL.GIF; SimpleDoc doc = new SimpleDoc(url, flavor, null); | 启动打印
打印的最后一个步骤就是调用DocPrintJob的 print()方法,传递待打印数据的Doc对象,或选用PrintRequestAttributeSet实例。为简单起见,假设默认打印机支持你所需要的flavor和属性,在此情况下要使用下列代码将上一个例子提及的gif文件打印两份:
PrintService service = PrintServiceLookup.lookupDefaultPrintService(); DocPrintJob job = service.createPrintJob(); URL url = new URL( "http://www.apress.com/ApressCorporate/supplement/1/421/bcm.gif "); DocFlavor flavor = DocFlavor.URL.GIF; Doc doc = new SimpleDoc(url, flavor, null); PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet(); attrs.add(new Copies(2)); job.print(doc, attrs); | 注意,一些情况下,打印不同步执行,这可能会在实际打印完成之前返回对print()的调用。
|
|
|
|
|
|
|
|