Как отобразить диалог прогресса печати в Swing? - PullRequest
4 голосов
/ 04 июля 2011

Если я делаю это в своем классе, который реализует Printable,

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

это работает, но мой класс Printable получает print(), вызываемый дважды. (предположительно для целей выделения ресурсов драйвером принтера)

Как правильно отобразить индикатор выполнения? В моем случае я знаю, сколько задач подпечатки нужно выполнить, но если я попытаюсь отобразить его, индикатор выполнения будет переходить от начала к концу дважды, что является ужасной обратной связью для пользователя. И я бы предпочел не отображать неопределенный индикатор выполнения ...

Что мне делать?


уточнение: я печатаю кучу графиков на странице. Они несколько сложны и требуют много времени для печати, поэтому я могу знать, что для рендеринга есть 10 объектов, поэтому я бы хотел, чтобы индикатор выполнения менялся с 0 до 10 и увеличивал его после рендеринга каждого из 10 объектов. , (Или, что еще лучше, перейдите от 0 до 20, если предположить, что я каким-то образом знаю, что страница отображается дважды.)

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Если посмотреть на аргументы, предоставленные методу печати, то при первом его вызове (по крайней мере, для меня) графика является объектом PeekGraphics, а второй - объектом WPathGraphics. В моей системе RasterPrinterJob создает PeekGraphics для получения информации о задании на печать перед настройкой графики для реального задания на печать.

В зависимости от того, как вы обновляете индикатор выполнения, вы можете просто проверить, что графический аргумент не является PeekGraphics, прежде чем ставить галочку.

1 голос
/ 07 июля 2011

Я отказался от идеи пытаться предсказать или различить количество вызовов 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...