2009-12-22 3 views
10

De sun's documentationPourquoi la méthode d'impression de java Printable est appelée plusieurs fois avec le même numéro de page?

"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 généralement bien, car il est explicite en fonction du numéro de page. Ne pas suivre ce modèle m'a causé une grande douleur jusqu'à ce que je me rende compte qu'il était appelé plusieurs fois avec le même numéro de page et a commencé à mettre en cache les pages.

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

Répondre

13

Le système d'impression Java est à la merci du système d'impression OS sous-jacent, et ce système peut demander qu'une seule page soit rendue plusieurs fois. L'une des raisons est impression par bandes - si l'imprimante ne dispose pas de suffisamment de mémoire pour restituer la totalité de la page en une seule fois - dans ce cas, le système d'exploitation demande de nouveau la page Java pour imprimer la page en bandes ("bandes"). C'est le cas spécifique mentionné dans le Guide du programmeur Java 2D, dans la section "Printing Concepts".

Il peut y avoir d'autres raisons; c'est vraiment à la hauteur du système d'impression du système d'exploitation.

+0

Je devrais noter que je ne me souviens pas avoir vu ce comportement quand je travaillais sur un système de rapport basé sur Java il y a quelques années. C'est peut-être parce que nous étions sur Linux à l'époque. – ZoogieZork

+0

Les systèmes d'impression sous Linux convertissent généralement l'ensemble du document en PostScript (si ce n'est déjà le cas) en tant que langage intermédiaire, même lorsque vous travaillez avec des imprimantes à bande, de sorte que le système d'impression effectue la mise en mémoire tampon. –

+0

Ah, je le soupçonnais comme tel. Bon à savoir, merci! – ZoogieZork

2

Il y a plusieurs raisons à cela. En fonction du système d'impression sous-jacent, il peut vouloir calculer certaines propriétés «à l'avance» (par exemple: étendue de page, utilisation d'encre, etc.) sans avoir à mettre en tampon le document entier.

En outre, certains systèmes d'impression sont basés sur des bandes plutôt que sur des pages. Les jets 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 600 pages US), le système d'impression Java peut mettre en mémoire tampon seulement quelques bandes (ou même seulement une bande) à la fois.

Questions connexes