| 目次 | 前の項目 | 次の項目 | 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;
}
}