2011-07-04 11 views
4

私は、印刷可能を実装私のクラスにSwingで印刷の進捗状況を表示するにはどうすればいいですか?

PrinterJob job = PrinterJob.getPrinterJob(); 
job.setJobName(/* some name */); 
Book book = new Book(); 
book.append(this, new PageFormat()); 
job.setPageable(book); 
boolean ok = job.printDialog(); 
if (ok) { 
    try { 
     job.print(); 
    } 
    catch (PrinterException ex) { 
     ex.printStackTrace(); 
    } 
} 

これを行う場合、それは動作しますが、私の印刷可能なクラスが二度呼ばれるprint()を取得します。 (おそらくプリンタドライバによるリソース割り当ての目的のため)

どのようにしてプログレスバーを正しく表示できますか?私のケースでは、実行する必要があるサブ印刷タスクの数はわかりますが、表示しようとすると、プログレスバーは最初から最後まで2回進みます。これはユーザーにとって恐ろしいフィードバックです。そして、私はむしろ不確定なプログレスバーを表示したくないでしょう...

どうすればいいですか?


説明:ページにたくさんのプロットを印刷しています。それらは多少複雑で印刷に時間がかかるので、レンダリングするオブジェクトが10個あることがわかるかもしれないので、10個のオブジェクトのそれぞれをレンダリングした後に、プログレスバーを0から10にしてインクリメントしたい。

+0

http://download.oracle.com/javase/tutorial/2d/printing/index.htmlとhttp://www.java2s.com/Tutorial/Java/0261__2D-Graphics/ Catalog0261__2D-Graphics.htm – mKorbel

+1

このダイアログは、実際の印刷(システムによって処理される)ではなく、印刷可能な印刷をプリンタの内部形式に変換するプロセスを出力することを理解していますか? –

+0

@Penkov:はい。システムによって実際に処理される印刷は、プリンタドライバに応じて他の方法でフィードバックを与えるためです。私のページは印刷に1〜3秒かかります。なぜなら、私のプログラムが何かしていることを何らかのフィードバックを与える必要があるからです。 –

答えて

1

私は、print()の呼び出し回数を予測または区別しようとする考えをあきらめました。

@Atreys'答えは有望だったが、私は/反射Oまたはプライベートsun.*クラスをインポートwが使用できる唯一の違いは、sun.awt.windows.WPathGraphicsがないのに対しsun.print.PeekGraphicsは、java.awt.image.ImageObserver実装していることでした。 (getClass()。getName()は私の本でリフレクションとしてカウントされます)

最後に、Printable.print()への個々のコールにプログレスバーを使用しました。進捗状況を最初にリセットし、印刷の各サブステップごとに進めます。

進捗バーに進捗が2回表示されることをユーザーに知らせないために、print()が呼び出されるたびに「Pass#{k}」に変更されるラベルがあります。{k}はインクリメントされるカウンタです毎回。


p.s. Printable.print()の中から印刷ジョブを取り消すにはちょっと難しいです。 Printableオブジェクトが印刷を中断した場合

Printable javadocがこれを言うという事実にもかかわらず、それは(印刷するコールを終了)が、プリンタドライバがいっているようPrintAbortExceptionを投げることは、正常に動作するようには思えませんPrinterExceptionをスローします。

代わりに、print()メソッドのGraphicsパラメーターをPrintGraphicsオブジェクトとしてキャストし、PrintGraphics.getPrinterJob()を呼び出す必要があります。キャンセル():

if (graphics instanceof PrinterGraphics) 
{ 
    PrinterGraphics pg = (PrinterGraphics) graphics; 
    pg.getPrinterJob().cancel(); 
} 
else 
{ 
    // this is kind of an unexpected circumstance 
    // not sure if we should do this or throw IllegalStateException() 
    PrinterAbortException pae = new PrinterAbortException(); 
    pae.initCause(/* something */); 
    throw pae; 
} 
3

printメソッドに提供された引数を見ると、少なくとも呼び出されたときに(少なくとも私にとっては)グラフィックスはPeekGraphicsオブジェクトであり、2回目はWPathGraphicsオブジェクトです。私のシステムでは、RasterPrinterJobはPeekGraphicsを作成して、実際の印刷ジョブのグラフィックスを設定する前に印刷ジョブに関する情報を取得しています。

プログレスバーをどのように更新しているかによって、グラフィックスの引数がPeekGraphicsではないことを確認してから、チェックすることができます。

+0

面白いアイデア.... –

+0

1+邪悪のために - 働くかもしれない:-) – kleopatra

関連する問題