UNPKG

epubjs

Version:

Render ePub documents in the browser, across many devices

73 lines (69 loc) 9.38 kB
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><head><title>Printing</title><link rel="stylesheet" href="core.css" type="text/css"/><meta name="generator" content="DocBook XSL Stylesheets V1.74.0"/></head><body><div class="sect1" title="Printing"><div class="titlepage"><div><div><h1 class="title"><a id="learnjava3-CHP-20-SECT-9"/>Printing</h1></div></div></div><p><a id="idx11093" class="indexterm"/> <a id="idx11107" class="indexterm"/>Earlier in this chapter, we hinted at the possibility that you could draw the same stuff on the screen and the printer. It’s true; all you really need to do is get a <code class="literal">Graphics2D</code> object that represents a printer rather than an area of the screen. Java’s printing API provides the necessary plumbing. There isn’t room here to describe the whole Printing API, but we will provide you with a short example that will let you get your feet wet (and your paper flowing).</p><p>The printing classes are tucked away in the <a id="I_indexterm20_id815065" class="indexterm"/><code class="literal">java.awt.print</code> package. You can print anything that implements the <a id="I_indexterm20_id815076" class="indexterm"/><code class="literal">Printable</code> interface. This interface has only one method—you guessed it, <code class="literal">print()</code>—which is like the <code class="literal">paint()</code> methods we’ve already worked with. It accepts a <code class="literal">Graphics</code> object that represents the drawing surface of the printer’s page. It also accepts a <code class="literal">PageFormat</code> object that encapsulates information about the paper on which you’re printing. Finally, <a id="I_indexterm20_id815119" class="indexterm"/><code class="literal">print()</code> is passed the number of the page that is being rendered. All Swing components implement a <code class="literal">print()</code> method, which you can use or override to customize their printed appearance.</p><p>Your <code class="literal">print()</code> implementation should either render the requested page or state that it doesn’t exist. You can do this by returning special values from <code class="literal">print()</code>, either <code class="literal">Printable.PAGE_EXISTS</code> or <code class="literal">Printable.NO_SUCH_PAGE</code>.</p><p>You can control a print job, including showing print and page setup dialogs, using the <code class="literal">PrinterJob</code> class. The following class enables you to get something on paper. In this example, we work both sides of the printing equation: implementing a simple <code class="literal">Printable</code> interface to generate our data and printing it with the <code class="literal">PrinterJob</code> API.</p><a id="I_20_tt1173"/><pre class="programlisting"> <code class="c1">//file: UnbelievablySimplePrint.java</code> <code class="kn">import</code> <code class="nn">java.awt.*</code><code class="o">;</code> <code class="kn">import</code> <code class="nn">java.awt.print.*</code><code class="o">;</code> <code class="kd">public</code> <code class="kd">class</code> <code class="nc">UnbelievablySimplePrint</code> <code class="kd">implements</code> <code class="n">Printable</code> <code class="o">{</code> <code class="kd">private</code> <code class="kd">static</code> <code class="n">Font</code> <code class="n">sFont</code> <code class="o">=</code> <code class="k">new</code> <code class="n">Font</code><code class="o">(</code><code class="s">"Serif"</code><code class="o">,</code> <code class="n">Font</code><code class="o">.</code><code class="na">PLAIN</code> <code class="o">,</code> <code class="mi">64</code><code class="o">);</code> <code class="kd">public</code> <code class="kt">int</code> <code class="nf">print</code><code class="o">(</code><code class="n">Graphics</code> <code class="n">g</code><code class="o">,</code> <code class="n">PageFormat</code> <code class="n">Pf</code><code class="o">,</code> <code class="kt">int</code> <code class="n">pageIndex</code><code class="o">)</code> <code class="kd">throws</code> <code class="n">PrinterException</code> <code class="o">{</code> <code class="k">if</code> <code class="o">(</code><code class="n">pageIndex</code> <code class="o">&gt;</code> <code class="mi">0</code><code class="o">)</code> <code class="k">return</code> <code class="n">NO_SUCH_PAGE</code><code class="o">;</code> <code class="n">Graphics2D</code> <code class="n">g2</code> <code class="o">=</code> <code class="o">(</code><code class="n">Graphics2D</code><code class="o">)</code><code class="n">g</code><code class="o">;</code> <code class="n">g2</code><code class="o">.</code><code class="na">setFont</code><code class="o">(</code><code class="n">sFont</code><code class="o">);</code> <code class="n">g2</code><code class="o">.</code><code class="na">setPaint</code><code class="o">(</code><code class="n">Color</code><code class="o">.</code><code class="na">black</code><code class="o">);</code> <code class="n">g2</code><code class="o">.</code><code class="na">drawString</code><code class="o">(</code><code class="s">"Save a tree!"</code><code class="o">,</code> <code class="mi">96</code><code class="o">,</code> <code class="mi">144</code><code class="o">);</code> <code class="k">return</code> <code class="n">PAGE_EXISTS</code><code class="o">;</code> <code class="o">}</code> <code class="kd">public</code> <code class="kd">static</code> <code class="kt">void</code> <code class="nf">main</code><code class="o">(</code><code class="n">String</code><code class="o">[]</code> <code class="n">args</code><code class="o">)</code> <code class="o">{</code> <code class="n">PrinterJob</code> <code class="n">job</code> <code class="o">=</code> <code class="n">PrinterJob</code><code class="o">.</code><code class="na">getPrinterJob</code><code class="o">();</code> <code class="n">job</code><code class="o">.</code><code class="na">setPrintable</code><code class="o">(</code><code class="k">new</code> <code class="n">UnbelievablySimplePrint</code><code class="o">());</code> <code class="k">if</code> <code class="o">(</code><code class="n">job</code><code class="o">.</code><code class="na">printDialog</code><code class="o">())</code> <code class="o">{</code> <code class="k">try</code> <code class="o">{</code> <code class="n">job</code><code class="o">.</code><code class="na">print</code><code class="o">();</code> <code class="o">}</code> <code class="k">catch</code> <code class="o">(</code><code class="n">PrinterException</code> <code class="n">e</code><code class="o">)</code> <code class="o">{}</code> <code class="o">}</code> <code class="n">System</code><code class="o">.</code><code class="na">exit</code><code class="o">(</code><code class="mi">0</code><code class="o">);</code> <code class="o">}</code> <code class="o">}</code></pre><p>There’s not much to this example. We’ve created an implementation of <code class="literal">Printable</code>, called <code class="literal">UnbelievablySimplePrint</code>. It has a very simple <code class="literal">print()</code> method that draws some text.</p><p>The rest of the work, in the <code class="literal">main()</code> method, has to do with setting up the print job. First, we create a new <code class="literal">PrinterJob</code> and tell it what we want to print:</p><a id="I_20_tt1174"/><pre class="programlisting"> <code class="n">PrinterJob</code> <code class="n">job</code> <code class="o">=</code> <code class="n">PrinterJob</code><code class="o">.</code><code class="na">getPrinterJob</code><code class="o">();</code> <code class="n">job</code><code class="o">.</code><code class="na">setPrintable</code><code class="o">(</code><code class="k">new</code> <code class="n">UnbelievablySimplePrint</code><code class="o">());</code></pre><p>Then, we use the <a id="I_indexterm20_id815258" class="indexterm"/><code class="literal">printDialog()</code> method to show the standard print dialog. If the user presses the OK button, <code class="literal">printDialog()</code> returns <code class="literal">true</code> and <code class="literal">main()</code> goes ahead with the printing.</p><p>Notice that in the <code class="literal">print()</code> method, we perform the familiar cast from <code class="literal">Graphics</code> to <code class="literal">Graphics2D</code>. The full power of the 2D API is available for printing. In a real application, you’d probably have some subclass of <code class="literal">Component</code> that was also a <code class="literal">Printable</code>. The <code class="literal">print()</code> method could simply call the component’s <code class="literal">paint()</code> method to create a component that performs the same rendering to both the screen and the printer.<a id="I_indexterm20_id815329" class="indexterm"/><a id="I_indexterm20_id815336" class="indexterm"/></p></div></body></html>