Java AWT:印刷
 最終更新日:1999 年 12 月 6 日
 
目的
 AWT 印刷 API の目標は、ネイティブプラットフォームの機能を使用して AWT コンポーネントを印刷するための簡単な機構を、開発者に提供することです。この API は、AWT グラフィックモデルとともに使用するために設計されています。Graphics2D を使って開発を行う場合は、java.awt.print パッケージの 2D 印刷を使用してください。
印刷 API
  印刷 API は非常に単純で、java.awt.Toolkit クラスの次の 1 つのメソッドから主に構成されます。
PrintJob getPrintJob(Frame f, String jobtitle, JobAttributes jobAttributes, PageAttributes pageAttributes)
また、印刷要求に関連したすべての情報のカプセル化を担当する、次のクラスから構成されます。
	java.awt.PrintJob
ツールキットの getPrintJob() メソッドは、プラットフォーム固有の印刷ダイアログの後処理を行うので、PrintJob オブジェクトは、メソッドが戻ってきたときにはすでにユーザ要求に合うよう構成されています。JobAttributes および PageAttributes パラメータに、印刷ジョブのデフォルト属性値を渡すことができます。これで、特定のアプリケーションに適した印刷属性を格納し、個別の状況に適用できるようになります。ユーザが印刷ダイアログ内のデフォルト属性を変更した場合、これらの変更は、メソッドに渡された JobAttributes および PageAttributes インスタンスに保存されます。そのため、必要に応じて、プログラムがこの新しいデフォルトを格納するように選択できます。
PrintJob オブジェクトは、印刷デバイスに透過的にレンダリングするために使用される印刷グラフィックスコンテキストだけでなく、ユーザが選択した関連の印刷プロパティ (ページサイズなど) へのアクセスを提供します。
 
印刷グラフィックスコンテキスト
 印刷グラフィックスコンテキストは、次のインタフェースによって提供されます。
java.awt.PrintGraphics
PrintJob オブジェクトは、Graphics のサブクラスであり、同時に PrintGraphics インタフェースを実装するオブジェクトに対するハンドルを得るためのメソッドを提供します。
Graphics getGraphics()
このオブジェクトは Graphics クラスのサブクラスであるため、簡単に既存の paint() または print() メソッド (標準の Graphics 描画メソッドを使用する) に渡すことができ、基となる AWT 実装がこれらの呼び出しを適切な印刷デバイスに翻訳します。これはグラフィック印刷デバイスをサポートする Mac や Windows 上では直接的に行われます。Solaris 上では、適切な PostScript を生成するために PostScript グラフィックスオブジェクトを必要とします。
paint() または print() メソッドの内部から、プログラムが画面にレンダリングしているのか、あるいは印刷デバイスにレンダリングしているのかを検出したい場合がよくあります (たとえば、ユーザが選択した「強調表示」テキストを必ずしも印刷したくない場合)。PrintJob.getGraphics() メソッドから返されたグラフィックスオブジェクトが PrintGraphics インタフェースを実装するため、次のテストで簡単にこれを検出できます。
	public void paint(Graphics g) {
		if (g instanceof PrintGraphics) 
			// printing is occurring
			...
PrintGraphics インタフェースの主要なメソッドは、関連する PrintJob オブジェクトのハンドルを得るメソッドです。
PrintJob getPrintJob()
これらの印刷属性は java.awt.PrintJob の次のメソッドによって得られます。
Dimension getPageDimension()
int getPageResolution()
public void printAll(Graphics g)
このメソッドを呼び出すと、包含階層を完全に横断する結果となり、print() メソッドがすべての子孫コンポーネントに呼び出されます。print() メソッドのデフォルト実装は単に paint() を呼び出し、プログラムが paint() メソッドで自分自身をレンダリングするコンポーネントを作成する場合、印刷は「自動的に」行われる必要があります。すべての基本 AWT コンポーネント (Button、Scrollbar など) は、自分の printAll() メソッドが呼び出されたとき、自分自身を印刷できるということに注意してください (これらのレンダリングが paint() メソッド内では起こらない場合も同様)。
 この制限は、PrintJob から返される PrintGraphics オブジェクトを使用してアプレットがレンダリングする機能を制約せず、信頼されないアプレットが印刷ジョブを開始できないようにしているだけであるということに注意してください。Java セキュリティアーキテクチャによって多くのカスタマイズが可能になれば、さらに合理的な原則が提供されます。 
サンプルコード
 AWT コンポーネントを印刷するために印刷ジョブを開始する方法を示す簡単な例を、次に示します。 
	
import java.awt.*;
import java.awt.event.*;
public class PrintingTest extends Frame implements ActionListener {
    PrintCanvas canvas;
    public PrintingTest() {
        super("Printing Test"); 
        canvas = new PrintCanvas();
        add("Center", canvas);
        
        Button b = new Button("Print");
        b.setActionCommand("print");
        b.addActionListener(this);
        add("South", b);
        pack();
    }
    public void actionPerformed(ActionEvent e) {
        String cmd = e.getActionCommand();
        if (cmd.equals("print")) {
            PrintJob pjob = getToolkit().getPrintJob(this,
                               "Printing Test", null, null);
            if (pjob != null) {          
                Graphics pg = pjob.getGraphics();
                if (pg != null) {
                    canvas.printAll(pg);
                    pg.dispose(); // flush page
                }
                pjob.end();
            }
        }
    }
    public static void main(String args[]) {
        PrintingTest test = new PrintingTest();
        test.show();
    }
}
class PrintCanvas extends Canvas {
    public Dimension getPreferredSize() {
        return new Dimension(100, 100);
    }
  
    public void paint(Graphics g) {
        Rectangle r = getBounds();
        g.setColor(Color.yellow);
        g.fillRect(0, 0, r.width, r.height);
        g.setColor(Color.blue);
        g.drawLine(0, 0, r.width, r.height);
        g.setColor(Color.red);
        g.drawLine(0, r.height, r.width, 0);
    }
}