Почему метод печати java Printable вызывается несколько раз с одним и тем же номером страницы? - PullRequest
11 голосов
/ 22 декабря 2009

С солнечная документация

"Система печати может запросить, чтобы страница отображалась несколько раз, прежде чем перейти на следующую страницу."

Примеры всегда показывают что-то вроде этого:

Printable print(Graphics g, PageFormat pageFormat, int page) {
    if (page == 0)
      do...
    else if(page == blah...)
}

Если вы следуете этому шаблону, ваш код обычно работает нормально, потому что он явный в зависимости от номера страницы. Отказ от этого паттерна причинял мне большую боль, пока я не осознал, что он вызывался несколько раз с одним и тем же номером страницы и начал кэшировать страницы.

Почему метод печати java Printable вызывается несколько раз с одним и тем же номером страницы?

Ответы [ 2 ]

13 голосов
/ 22 декабря 2009

Система печати Java находится во власти базовой системы печати ОС, и эта система может запросить, чтобы одна страница отображалась несколько раз.

Одной из причин является полосатая печать - если у принтера недостаточно памяти для одновременной визуализации всей страницы - в этом случае ОС снова запросит у Java страницу, чтобы она могла распечатать страницу полосами («полосами»). Это особый случай, упомянутый в Руководстве по программированию на Java 2D, в разделе " Принципы печати ".

Могут быть и другие причины; это действительно зависит от системы печати ОС.

2 голосов
/ 22 декабря 2009

Существует ряд причин, по которым это может быть сделано.

В зависимости от базовой системы печати может потребоваться вычислить определенные свойства «заранее» (например, экстенты страницы, использование чернил и т. Д.) Без необходимости буферизации всего документа.

Кроме того, некоторые системы печати основаны на полосах, а не на страницах. Например, струйные принтеры будут распечатывать одну горизонтальную полосу растровых данных за раз. Вместо того, чтобы буферизовать растровые данные на странице (около 100 МБ для 600-дюймовой буквенной страницы США), система печати Java может одновременно буферизовать только несколько полос (или, возможно, даже одну полосу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...