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()

ページ付け

プログラムがページ付けを担当します。getGraphics() への各呼び出しは、単一のページに対する印刷グラフィックスコンテキストを返します。プログラムが印刷グラフィックスコンテキストの dispose() を呼び出すとき、そのページがプリンタにフラッシュされます。プログラムは、指定したページの大きさと解像度を与えられ、適切なページ内容と改ページとを判別する必要があります。

これらの印刷属性は java.awt.PrintJob の次のメソッドによって得られます。

Dimension getPageDimension()
int getPageResolution()

コンポーネントの印刷階層

プログラムで AWT コンポーネントの包含階層全体 (すなわち、Panel とその内部のネストしたすべてのコントロールおよびコンテナ) を印刷する必要がある場合、包含階層のルート上の次の java.awt.Component メソッドを呼び出す必要があります (適切な印刷グラフィックスコンテキストを渡して)。
public void printAll(Graphics g)

このメソッドを呼び出すと、包含階層を完全に横断する結果となり、print() メソッドがすべての子孫コンポーネントに呼び出されます。print() メソッドのデフォルト実装は単に paint() を呼び出し、プログラムが paint() メソッドで自分自身をレンダリングするコンポーネントを作成する場合、印刷は「自動的に」行われる必要があります。すべての基本 AWT コンポーネント (Button、Scrollbar など) は、自分の printAll() メソッドが呼び出されたとき、自分自身を印刷できるということに注意してください (これらのレンダリングが paint() メソッド内では起こらない場合も同様)。

印刷ダイアログ

プログラムによっては、自分自身の印刷ダイアログを拡張または作成する必要がありますが、現在のところ、この機能は AWT 印刷からも 2D 印刷からも利用できません。

セキュリティ

信頼されない可能性のあるアプレットの印刷ジョブ要求の開始 (および、そのアプレットが要求するプリンタに対しての不正なやり方での印刷) を許すことは危険であると考えられるため、PrintJob の開始 (Toolkit.getPrintJob 経由) は、SecurityManager メソッドに実装されるアプレットセキュリティ制限によって拘束される操作であると定義されます。また、印刷は許可されても、ファイルシステムへのアクセスは許可されないこともあります。そのような場合、プログラムによるファイルへの印刷要求により例外がスローされるため、ユーザはファイルへの出力を選択できません。

この制限は、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);
    }
}



コメントの送付先:java-awt@java.sun.com
Copyright © 1996, 1997, 1999 Sun Microsystems, Inc. All rights reserved.