目次 | 前の項目 | 次の項目 Java 2D API


7.4 Pageable と Book での印刷

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 を渡します。 setPageablesetPrintable は、一緒には使用できません。 つまり、PrinterJob を準備するときは、どちらか一方だけを呼び出すようにします。


7.4.1 Pageable ジョブの使用方法

次の例では、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;
  	   }
	}

7.4.2 複数のページペインタの使用方法

次の例では、表紙と本文に対して、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;
  	   }
	}



目次 | 前の項目 | 次の項目
Copyright © 1997-1999 Sun Microsystems, Inc. All Rights Reserved.