
Envoyé par
JamesP
Sinon j'ai un peu de mal a comprendre le fonctionnement des printerJobs et tout ce qui va avec ...
Quand tu fais :
1 2 3 4 5 6
|
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(printable);
if (printJob.printDialog()) {
printJob.print();
} |
Basiquement, en interne, le job va faire quelques chose similaire a ceci :
1 2 3 4
| while (printable.print(graphics, pageFormat, pageIndex) != Printable.NO_SUCH_PAGE) {
// Send page graphics to the printer.
pageIndex ++;
} |
Note : pour etre precis si tu fais des impressions ou met des break points dans le printable tu verras que le printerJob passe en fait 2 fois sur chaque page.
Tu peux envisager ta page comme le montre l'image ci-jointe :
- a priori ta table fera toute la largeur de la zone imprimable.
- a priori ton entete a une hauteur fixe (0 s'il n'y a pas d'entete).
- a priori ton pied de page a une hauteur fixe (0 s'il n'y a pas de pied de page).
-a priori j'imagine que tu veux avoir tes tetes de colonnes sur chaque page et que ces tetes de colonnes ont une hauteur fixe.
- a priori chaque ligne de ta table a une hauteur fixe.
Ton probleme consiste tout simplement a trouver :
- le nombre (entier) de colonnes qui peuvent rentrer dans imageableHeight-(headerHeight + colomnHeaderHeight + footerHeight) pour une page.
- en deduire le nombre de page par rapport au nombre de lignes a imprimer.
- en deduire l'indice de la premiere ligne qui apparaitra en haut de chaque page.
Ensuite cela depend si tu peux dessiner manuellement toi-meme chaque ligne ou si tu ne peux que manipuler la methode paint() globale de la table.
- dans le premier cas, normalement tu devrais savoir alors comment dessiner les tetes de colonnes au bon endroit et les lignes appropriees pour chaque page.
- dans le second cas on peut alors utiliser la methode
paint() ou
print() de la table et jouer avec les methodes
translate() et
setClip() du
graphics avec les valeurs appropriees de maniere a ne dessiner que des "vues" de la table aux bon endroits :
- une vue sur les tete de colonnes sur chaque page.
- une vue sur les lignes rowIndexForPageIndex -> rowIndexForPageIndex + numberOfRowsPerPage pour la page pageIndex donnee.
Quand a l'alignement horizontal (gauche, droite, centre) et vertical (haut, bas, centre) des entete et pieds de page, tu peux connaitre les tailles, hauteur et ligne de base d'un texte via les methode :
- Font.getStringBounds(String str, FontRenderContext frc);
- Font.getLineMetrics(String str, FontRenderContext frc);
- LineMetrics.getAscent();
Qui sans etre 100% precises seront probablement suffisantes pour effectuer les calculs appropries pour un premier affichage.
Le FontRenderContext t'etant fournis par la methode graphics.getFontRenderContext().
Note : dans drawString() les coordonnes x et y a fournir sont celles de la baseline, pas celles du coin superieur gauche.
N'oublie pas egalement que tu peux faire varier la police de maniere a mettre une police plus petite que celle utilisee pour l'affichage a l'ecran.
Partager