Pourquoi la méthode d’impression de java Printable est-elle appelée plusieurs fois avec le même numéro de page?

De la documentation du soleil

“Le système d’impression peut demander qu’une page soit rendue plusieurs fois avant de passer à la page suivante.”

Les exemples montrent toujours quelque chose comme ceci:

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

Si vous suivez ce modèle, votre code fonctionne normalement car il est explicite et basé sur le numéro de page. Ne pas suivre ce schéma m’a fait très mal jusqu’à ce que je réalise que l’appel a été appelé plusieurs fois avec le même numéro de page et que les pages ont été mises en cache.

Pourquoi la méthode d’impression de java Printable est-elle appelée plusieurs fois avec le même numéro de page?

Le système d’impression Java est à la merci du système d’impression sous-jacent du système d’exploitation et ce système peut demander le rendu d’une seule page plusieurs fois.

L’ impression par bande est une des raisons – si l’imprimante n’a pas assez de mémoire pour restituer la page entière en une fois -, dans ce cas, le système d’exploitation demandera de nouveau la page à Java afin de pouvoir imprimer la page par bandes (“bandes”). ). C’est le cas spécifique mentionné dans le Guide du programmeur Java 2D, au chapitre ” Concepts d’impression “.

Il peut y avoir d’autres raisons; cela dépend vraiment du système d’impression du système d’exploitation.

Cela peut être dû à un certain nombre de raisons.

Selon le système d’impression sous-jacent, il peut vouloir calculer certaines propriétés “à l’avance” (par exemple: étendue de la page, utilisation de l’encre, etc.) sans avoir à mettre en mémoire tampon le document entier.

De plus, certains systèmes d’impression sont «basés sur des bandes» plutôt que sur des pages. Les imprimantes à jet d’encre, par exemple, imprimeront une bande horizontale de données raster à la fois. Plutôt que de mettre en mémoire tampon les données raster d’une page (environ 100 Mo pour une page de lettre US de 600 dpi), le système d’impression Java ne peut mettre en mémoire tampon que quelques bandes (voire une seule bande) à la fois.