目次 | 前の項目 | 次の項目 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-2001 Sun Microsystems, Inc. All Rights Reserved.