如何打印文本

原文: https://docs.oracle.com/javase/tutorial/uiswing/misc/printtext.html

JTextComponent类为打印文本文档提供支持。 JTextComponent API 包含允许您实现基本和高级打印任务的方法。支持的格式包括 HTML,RTF 和纯文本。对于常见的打印任务,例如简单地打印文本文档,请直接使用print方法。 print方法有多种形式,带有各种参数集。此方法准备文本文档,获取相应的Printable对象,并将其发送到打印机。

如果Printable对象的默认实现不符合您的需要,您可以通过覆盖getPrintable方法来自定义打印布局以包装默认Printable,甚至完全替换它。

打印文本组件的最简单方法是调用不带参数的print方法。请参阅下面的代码示例。

  1. try {
  2. boolean complete = textComponent.print();
  3. if (complete) {
  4. /* show a success message */
  5. ...
  6. } else {
  7. /*show a message indicating that printing was cancelled */
  8. ...
  9. }
  10. } catch (PrinterException pe) {
  11. /* Printing failed, report to the user */
  12. ...
  13. }

当您在没有参数的情况下调用print方法时,会显示一个打印对话框,然后以交互方式打印文本组件而不显示页眉或页脚。下面的代码示例显示了带有完整参数集的print方法签名。

  1. boolean complete = textComponent.print(MessageFormat headerFormat,
  2. MessageFormat footerFormat,
  3. boolean showPrintDialog,
  4. PrintService service
  5. PrintRequestAttributeSet attributes,
  6. boolean interactive);

当您使用所有参数调用print方法时,您明确选择打印功能,如页眉和页脚文本,打印属性,目标打印服务,以及是否显示打印对话框,以及是交互式打印还是非打印-interactively。要确定哪种参数最适合您的需求,请参阅下面的可用功能说明。

JTextComponent打印 API 提供以下功能:

在交互模式下,在打印期间会显示带有中止选项的进度对话框。以下是进度对话框的示例。

A screenshot of a printing progress dialog

该对话框允许用户跟踪打印进度。当在事件调度线程上调用print方法时,进度对话框是模态的,否则是非模态的。在打印时保持文档保持不变非常重要,否则打印行为是不确定的。 print方法可确保您的文档不会被更改,并在打印期间禁用该组件。

如果在非交互模式下调用事件调度线程上的print方法,则将阻止包括重新绘制在内的所有事件。这就是为什么仅在具有不可见 GUI 的应用程序上推荐在 EDT 上非交互式打印的原因。

您可以显示标准打印对话框,允许用户执行以下操作:

  • 选择一台打印机
  • 指定份数
  • 更改打印属性
  • 在开始之前取消打印
  • 开始打印

A screenshot of a printing dialog

您可能会注意到打印对话框未指定打印输出中的总页数。这是因为文本打印实现使用Printable API,并且在打印时间之前不知道总页数。

页眉和页脚由 MessageFormat 参数提供。这些参数允许页眉和页脚本地化。阅读 MessageFormat 类的文档,因为单引号等字符是特殊的,需要避免。页眉和页脚都居中。您可以使用{0}插入页码。

MessageFormat footer = new MessageFormat("Page - {0}");

由于在打印时间之前未知输出中的总页数,因此无法指定“第 1 页,共 5 页”之类的编号格式。

TextAreaPrintingDemo.java 中找到。该演示的丰富 GUI 是在 NetBeans IDE GUI 构建器中构建的。这是TextAreaPrintingDemo应用程序的图片。

A screenshot of TextAreaPrintingDemo


Try this:

  1. 单击“启动”按钮以使用 Java™Web Start下载 JDK 7 或更高版本)运行 TextAreaPrintingDemo。或者,要自己编译并运行示例,请参考示例索引Launches the TextAreaPrintingDemo Application

  2. 编辑页眉或页脚复选框中的文本或两者以提供不同的页眉或页脚。

  3. 如果要在不显示进度对话框的情况下进行打印,请清除“显示进度对话框”复选框,这意味着以非交互方式进行打印。请注意,一旦启动,您将无法取消打印。
  4. 清除“在后台打印”复选框以选择在事件派发线程上打印。请注意,在 EDT 上以非交互方式打印将使您的应用程序无响应 - 在打印过程中将阻止与您的应用程序的交互。
  5. 单击“打印”按钮,根据所选选项打印文本区域的内容。

每当 Web 启动的应用程序尝试打印时,Java Web Start 都会打开一个安全对话框,询问用户是否允许打印,除非已在系统设置中授予此权限。要继续打印,用户必须接受请求。

为“打印”按钮注册了一个动作监听器。当用户单击“打印”按钮时,actionPerformed方法调用print方法,该方法启动打印任务。打印任务是SwingWorker对象。下面的代码示例显示了如何实现PrintingTask类。

  1. private class PrintingTask extends SwingWorker<Object, Object> {
  2. private final MessageFormat headerFormat;
  3. private final MessageFormat footerFormat;
  4. private final boolean interactive;
  5. private volatile boolean complete = false;
  6. private volatile String message;
  7. public PrintingTask(MessageFormat header, MessageFormat footer,
  8. boolean interactive) {
  9. this.headerFormat = header;
  10. this.footerFormat = footer;
  11. this.interactive = interactive;
  12. }
  13. @Override
  14. protected Object doInBackground() {
  15. try {
  16. complete = text.print(headerFormat, footerFormat,
  17. true, null, null, interactive);
  18. message = "Printing " + (complete ? "complete" : "canceled");
  19. } catch (PrinterException ex) {
  20. message = "Sorry, a printer error occurred";
  21. } catch (SecurityException ex) {
  22. message =
  23. "Sorry, cannot access the printer due to security reasons";
  24. }
  25. return null;
  26. }
  27. @Override
  28. protected void done() {
  29. message(!complete, message);
  30. }
  31. }

下面的代码示例显示了print方法如何从 GUI 组件获取所选选项集,然后创建PrintingTask类的实例,并执行打印。

  1. private void print(java.awt.event.ActionEvent evt) {
  2. MessageFormat header = createFormat(headerField);
  3. MessageFormat footer = createFormat(footerField);
  4. boolean interactive = interactiveCheck.isSelected();
  5. boolean background = backgroundCheck.isSelected();
  6. PrintingTask task = new PrintingTask(header, footer, interactive);
  7. if (background) {
  8. task.execute();
  9. } else {
  10. task.run()
  11. }
  12. }

粗体代码说明了如何根据background参数的值调用PrintingTask的方法。每当用户喜欢在后台线程上打印时,都会调用execute方法,该方法会调度打印任务以便在后台线程上执行。否则,run方法在 EDT 上执行打印任务。

由于打印大型文档是一项耗时的任务,因此建议在后台线程上执行打印。

TextBatchPrintingDemo.java 中找到。这是TextBatchPrintingDemo应用程序的图片。

A screenshot of TextBatchPrintingDemo


Try this:

  1. 单击“启动”按钮以使用 Java™Web Start下载 JDK 7 或更高版本)运行 TextBatchPrintingDemo。或者,要自己编译并运行示例,请参考示例索引Launches the TextBatchPrintingDemo Application

  2. 单击任何链接以查看相应的 HTML 页面。

  3. 按 ALT + A 或选择文件>添加页面菜单项以将显示的页面添加到右侧显示的打印列表中。
  4. 按 ALT + H 或选择文件>主页菜单项返回到演示的主页。
  5. 根据需要将多个页面添加到打印列表中。
  6. 按 ALT + C 或选择文件>如果您需要清除打印列表并再次构建,请清除所选菜单项。
  7. 按 ALT + P 或选择文件>打印所选菜单项以打印所选页面。
  8. 按 ALT + Q 或选择文件>退出菜单项以退出应用程序。

您可以在printSelectedPages方法中找到打印代码。调用时,此方法首先获取选择用于打印的页面数量。下面的代码示例显示了printSelectedPages方法如何为每个页面创建Runnable对象,然后在单独的线程上打印当前页面。

  1. for (int i = 0; i < n; i++) {
  2. final PageItem item = (PageItem) pages.getElementAt(i);
  3. // This method is called from EDT. Printing is a time-consuming
  4. // task, so it should be done outside EDT, in a separate thread.
  5. Runnable printTask = new Runnable() {
  6. public void run() {
  7. try {
  8. item.print(
  9. // Two "false" args mean "no print dialog" and
  10. // "non-interactive" (ie, batch-mode printing).
  11. null, null, false, printService, null, false);
  12. } catch (PrinterException pe) {
  13. JOptionPane.showMessageDialog(null,
  14. "Error printing " + item.getPage() + "\n" + pe,
  15. "Print Error", JOptionPane.WARNING_MESSAGE);
  16. }
  17. }
  18. };
  19. new Thread(printTask).start();

文本打印 API

本节列出了JTextComponent类中定义的允许您打印文本文档的方法。

方法 目的
boolean print()

boolean print(MessageFormat,MessageFormat) boolean print(MessageFormat,MessageFormat,boolean,PrintRequestAttributeSet,boolean,PrintService) | 在不带参数的情况下调用时,显示打印对话框,然后以交互方式打印此文本组件,而不显示页眉或页脚文本。如果用户继续打印,则返回true,如果用户取消打印,则返回false。 使用两个MessageFormat参数调用时,显示打印对话框,然后使用指定的页眉和页脚文本以交互方式打印此文本组件。 使用完整的参数集调用时,根据指定的参数打印此文本组件。两个MessageFormat参数指定页眉和页脚文本。第一个布尔参数定义是否显示打印对话框。另一个布尔参数指定是否以交互方式打印。使用另外两个参数,您可以指定打印属性和打印服务。 每当省略PrintService参数时,将使用默认打印机。 | | 可打印的 getPrintable(MessageFormat,MessageFormat) | 返回用于打印文本组件的Printable对象。重写此方法以获取自定义的 Printable 对象。您可以将一个 Printable 对象包装到另一个对象中,以获取复杂的报表和文档。 |

此表列出了使用文本打印的示例,并指出了描述这些示例的位置。

在哪里描述 笔记
TextAreaPrintingDemo 这一页 演示文本打印的基础知识,并提供丰富的 GUI。允许用户指定页眉或页脚文本,打开或关闭打印对话框,以交互方式或非交互方式选择打印,然后根据所选选项进行打印。
TextBatchPrintingDemo 这一页 此演示显示带有 URL 列表的文本组件,允许用户查看 HTML 页面,将它们添加到打印列表,并在后台线程上一次打印所有选定的页面。

« PreviousTrailNext »


关于 Oracle | 联系我们 | 法律声明 | 使用条款 | 您的隐私权

版权所有©1995,2017 Oracle 和/或其附属公司。版权所有。

Previous page: How to Print Tables Next page: How to Create a Splash Screen