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