Java AWT: 印刷
最終更新: 1997 年 2 月 3 日
目的
AWT 印刷 API の目標は、ネイティブプラットフォームの機能を使用して AWT コンポーネントを印刷するための簡単な機構を、開発者に提供することです。この API は、現在の AWT グラフィックモデルと共に使用するために設計されています。
印刷 API
印刷 API は非常に簡単で、java.awt.Toolkit クラスの次の 1 つのメソッドから主に構成されています:
PrintJob getPrintJob(Frame f, String jobtitle, Properties props)
そして、印刷要求に関連したすべての情報をカプセル化する責任のある、次の新しいクラスから構成されます:
java.awt.PrintJob
ツールキットの getPrintJob() メソッドは、プラットフォーム固有の印刷ダイアログすべてのポストを行い、PrintJob オブジェクトは戻るとき既にユーザ要求に合うように構成されています。「プロパティ」パラメータは、すべてのプラットフォーム依存デフォルトプロパティ値を、印刷ジョブに渡す機能を提供します(すなわち、「プリンタ名」、「最終ページを最初に」など)。これで、特定のプログラムに適したアプリケーション固有印刷構成プロパティを格納し、個別の状況に適用できるようになります。ユーザが印刷ダイアログ内のデフォルト印刷設定を変更した場合、これらの変更はパラメータとして渡され、 Properties オブジェクトに保存されます(そのため、希望する場合は、プログラムがこの新しいデフォルトを格納するように選択できます)。
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() メソッド内では起こらない場合も同様です)。
この制限が、印刷ジョブから返される 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);
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);
}
}