Я отказался от идеи пытаться предсказать или различить количество вызовов print ().
@ Ответ Атрейса был многообещающим, но единственное отличие, которое я мог использовать без отражения илиимпорт частных sun.*
классов состоял в том, что sun.print.PeekGraphics
реализует java.awt.image.ImageObserver
, тогда как sun.awt.windows.WPathGraphics
- нет.(getClass (). getName () считается отражением в моей книге)
Я закончил тем, что использовал свой индикатор выполнения для каждого отдельного вызова на Printable.print()
, например, сбросил прогресс до начала и продвиженияэто для каждого шага печати.
Чтобы пользователи не жаловались, что индикатор выполнения показывает прогресс дважды, у меня есть метка, которая меняется на «Pass # {k}» всякий раз, когда вызывается print (), где{k} - это счетчик, который увеличивается каждый раз.
ps Правильный способ отменить задание печати из Printable.print()
немного сложнее.Бросок PrintAbortException, кажется, не работает правильно, так как он завершает вызов print (), но драйвер принтера продолжает работать, несмотря на то, что Printable
javadoc говорит это:
Если объект Printable прерывает задание печати, он генерирует исключение PrinterException.
Вместо этого вам необходимо привести параметр Graphics метода print () в качестве объекта PrintGraphics, а затем вызвать PrintGraphics.getPrinterJob (). Cancel ():
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;
}