Почему метод печати java Printable вызывается несколько раз с тем же номером страницы?
Из документация по солнцу
"Система печати может потребовать многократную визуализацию страницы перед переходом на следующую страницу".
В примерах всегда есть что-то вроде этого:
Printable print(Graphics g, PageFormat pageFormat, int page) {
if (page == 0)
do...
else if(page == blah...)
}
Если вы следуете этому шаблону, ваш код обычно отлично работает, потому что он явно основан на номере страницы. Не следование этой схеме вызвало у меня сильную боль, пока я не понял, что ее вызывали несколько раз с тем же номером страницы и начали кэшировать страницы.
Почему метод печати java Printable вызывается несколько раз с тем же номером страницы?
Ответы
Ответ 1
Система печати на Java находится во власти базовой системы печати ОС, и эта система может потребовать многократную визуализацию одной страницы.
Одной из причин является групповая печать - если на принтере недостаточно памяти для отображения всей страницы сразу - в этом случае ОС снова спросит Java для страницы, чтобы она могла распечатать страницу в полосах ( "группы" ). Это конкретный случай, упомянутый в Руководстве Java 2D Programmer, в разделе "" Концепции печати".
Могут быть и другие причины; это действительно до системы печати ОС.
Ответ 2
Есть несколько причин, по которым он может это сделать.
В зависимости от базовой системы печати может потребоваться вычислить определенные свойства "вверх" (например, экстенты страниц, использование чернил и т.д.) без необходимости буферизации всего документа.
Кроме того, некоторые системы печати основаны на полосах, а не на основе страниц. Например, струйные принтеры будут печатать одну горизонтальную полосу растровых данных за раз. Вместо того, чтобы буферизировать страницу с растровыми данными (около 100 МБ для страницы с буквенным обозначением на 600 точек на дюйм), система печати на Java может задерживать только несколько полос (или, возможно, даже одну полосу) за раз.