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


7.4 Pageable と Book での印刷

Pageable ジョブは、ドキュメントの体裁を 1 ページずつ明示的に構成するアプリケーションに適しています。Book クラスは Pageables を手軽に使うための手段ですが、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-1998 Sun Microsystems, Inc. All Rights Reserved.