目次 | 前の項目 | 次の項目 | Java 2D API |
Pageable ジョブは、ドキュメントの体裁を 1 ページずつ明示的に構成するアプリケーションに適しています。 Book クラスは Pageable を手軽に使うための手段ですが、Book が目的に合わない場合は、Pageable の構造を独自に作ることもできます。 ここでは、Book の使用方法を説明します。いくぶん複雑にはなりますが、印刷システムの柔軟性が増すので、Printable ジョブより Pageable ジョブのほうが実用に適しています。 Pageables の大きな利点は、ドキュメントのページ数がわかり、印刷ダイアログボックスでユーザに対して表示できることです。 ユーザは、ジョブが正しく指定されているか確認したり、印刷するページの範囲を選択したりするときに、この情報を参考にできます。
Book は、ページの集合を表します。 Book の中のページは、同じサイズや向き、または同じページペインタを共有する必要はありません。 たとえば、1 つの Book で、2 ページは縦方向のレターサイズ、1 ページは横方向のレターサイズであってもかまいません。
最初に作成したときの Book は、空の状態になっています。 Book にページを追加するには、append メソッドを使います。 このメソッドは、ページのサイズ、印刷可能領域、向きを定義する PageFormat オブジェクトと、Printable インタフェースを実装するページペインタを受け取ります。
Book の複数のページで、同じページ書式とページペインタを共有できます。 append メソッドの 3 番目のパラメータでページ数を指定すると、append はオーバーロードされて、同じ属性の一連のページを追加できるようになります。
Book の総ページ数がわからない場合は、append メソッドに UNKNOWN_NUMBER_OF_PAGES を渡すことができます。 このようにすると、印刷システムは、NO_SUCH_PAGE が返るまで、ページのインデックスを増やしながらページペインタを呼び出します。
setPage メソッドを使うと、ページのページ書式またはページペインタを変更できます。 変更するページの識別には、Book でのそのページの位置を示すページインデックスを使います。
印刷ジョブを準備するには、setPageable を呼び出して Book を渡します。 setPageable と setPrintable は、一緒には使用できません。 つまり、PrinterJob を準備するときは、どちらか一方だけを呼び出すようにします。
次の例では、Book を使って、最初の簡単な印刷例と同じものを生成しています。 この例はごく単純なものなので、Printable ジョブの代わりに Pageable ジョブを使うことにそれほど利点はありませんが、Book の基本的な使用法の理解には役立ちます。 この場合も、Printable インタフェースを実装し、ページペインタの print メソッドでページをレンダリングする必要があることに注意してください。
import java.awt.*; import java.awt.print.*; public class SimplePrintBook implements Printable { private static Font fnt = new Font("Helvetica",Font.PLAIN,24); public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Set up a book Book bk = new Book(); bk.append(new SimplePrintBook(), job.defaultPage(), 5); // Pass the book to the PrinterJob job.setPageable(bk); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { g.setFont(fnt); g.setColor(Color.green); g.drawString("Page " + (pageIndex+1), 100, 100); return Printable.PAGE_EXISTS; } }
次の例では、表紙と本文に対して、2 つの異なるページペインタが使われています。 表紙は横置きモードで印刷し、本文は縦置きモードで印刷しています。
import java.awt.*; import java.awt.print.*; public class PrintBook { public static void main(String[] args) { // Get a PrinterJob PrinterJob job = PrinterJob.getPrinterJob(); // Create a landscape page format PageFormat pfl = job.defaultPage(); pfl.setOrientation(PageFormat.LANDSCAPE); // Set up a book Book bk = new Book(); bk.append(new PaintCover(), pfl); bk.append(new PaintContent(), job.defaultPage(), 2); // Pass the book to the PrinterJob job.setPageable(bk); // Put up the dialog box if (job.printDialog()) { // Print the job if the user didn't cancel printing try { job.print(); } catch (Exception e) { /* handle exception */ } } System.exit(0); } } class PaintCover implements Printable { Font fnt = new Font("Helvetica-Bold", Font.PLAIN, 72); public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { g.setFont(fnt); g.setColor(Color.black); int yc = (int) (pf.getImageableY() + pf.getImageableHeight()/2); g.drawString("Widgets, Inc.", 72, yc+36); return Printable.PAGE_EXISTS; } } class PaintContent implements Printable { public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { Graphics2D g2 = (Graphics2D) g; int useRed = 0; int xo = (int) pf.getImageableX(); int yo = (int) pf.getImageableY(); // Fill page with circles or squares, alternating red & green for (int x = 0; x+28 < pf.getImageableWidth(); x += 36) for (int y = 0; y+28 < pf.getImageableHeight(); y += 36){ if (useRed == 0) g.setColor(Color.red); else g.setColor(Color.green); useRed = 1 - useRed; if (pageIndex % 2 == 0) g.drawRect(xo+x+4, yo+y+4, 28, 28); else g.drawOval(xo+x+4, yo+y+4, 28, 28); } return Printable.PAGE_EXISTS; } }