Bonjour à tous,
voila plusieurs jours que je me prends la tetes à trouver une façon d'imprimer un tableau, avec un jPanel à sa gauche.
Ce jPanel a la même taille que le tableau y comprise l'en-tête.
J'utilise PDF995 pour avoir un aperçu de ce que ça donnerait en vrai.
Et le résultat est comme l'image ci-dessous :

Ce qui se passe, c'est que le jPanel n'est pas peint jusqu'à la meme position Y que le tableau et deborde alors sur la marge de bas de page.
Mon tableau qui s'imprime correctement sur 3 pages a donc le jPanel qui lui apparait à chaque fois plus grand que le tableau.
Voici le code de ma fonction print :
public int print(Graphics g, PageFormat pageFormat,
int pageIndex) throws PrinterException {
// Declaration du graphe
Graphics2D g2 = (Graphics2D) g;
// definition de la couleur du graphe
g2.setColor(Color.black);
int fontHeight = g2.getFontMetrics().getHeight();
int fontDesent = g2.getFontMetrics().getDescent();
//leave room for page number
// DIMENSION DE LA PAGE
// Hauteur de la page
double pageHeight =
pageFormat.getImageableHeight() - fontHeight;
// Largeur de la page
double pageWidth =
pageFormat.getImageableWidth();
// Largeur des dates
double panelDateWidth = pere.jPanelDate.getWidth();
// Largeur des heures
double panelHourWidth = pere.jPanelDate.getWidth();
// Largeur du tableau
double tableWidth = (double)
pere.tableMois.jTableMois.getColumnModel().getTotalColumnWidth();
// Rapport entre la taille reelle et la taille sur la feuille
double scale = 1;
if ( (tableWidth + panelDateWidth + panelHourWidth) >= pageWidth) {
scale = pageWidth / (tableWidth + panelDateWidth + panelHourWidth);
}
// Largeur des dates sur la page
double panelDateWidthOnPage = panelDateWidth * scale;
// Largeur des heures sur la page
double panelHourWidthOnPage = panelHourWidth * scale;
// Hauteur des en-tetes sur la page
double headerHeightOnPage =
pere.tableMois.jTableMois.getTableHeader().getHeight() * scale;
// Largeur du tableau sur la page
double tableWidthOnPage = tableWidth * scale;
// Hauteur d'une cellule
double oneRowHeight = (pere.tableMois.jTableMois.getRowHeight() +
pere.tableMois.jTableMois.getRowMargin()) * scale;
// Nombre de lignes sur une page
int numRowsOnAPage =
(int) ( (pageHeight - headerHeightOnPage) /
oneRowHeight);
// Hauteur de la page pour le tableau
double pageHeightForTable = oneRowHeight * numRowsOnAPage;
// Nombre total de pages
int totalNumPages =
(int) Math.ceil( (
(double) pere.tableMois.jTableMois.getRowCount()) /
numRowsOnAPage);
if (pageIndex >= totalNumPages) {
return NO_SUCH_PAGE;
}
// Positionnement en haut à gauche de la zone imprimable
g2.translate(pageFormat.getImageableX(), // coordonnée x du coin haut gauche de la zone imprimable de la page
pageFormat.getImageableY()); // coordonnée y du coin haut gauche de la zone imprimable de la page
//bottom center
g2.drawString("Page: " + (pageIndex + 1),
(int) pageWidth / 2 - 35, (int) (pageHeight
+ fontHeight - fontDesent));
/**
* On peint le panel des dates
**/
g2.translate(0f, -pageIndex * pageHeightForTable);
//If this piece of the table is smaller
//than the size available,
//clip to the appropriate bounds.
if (pageIndex + 1 == totalNumPages) {
int lastRowPrinted =
numRowsOnAPage * pageIndex;
int numRowsLeft =
pere.tableMois.jTableMois.getRowCount() - lastRowPrinted;
g2.setClip(0,
(int) (pageHeightForTable * pageIndex),
(int) Math.ceil(panelDateWidthOnPage),
(int) Math.ceil(oneRowHeight * numRowsLeft));
}
//else clip to the entire area available.
else {
g2.setClip(0,
(int) (pageHeightForTable * pageIndex),
(int) Math.ceil(panelDateWidthOnPage),
(int) Math.ceil(pageHeightForTable));
}
g2.scale(scale, scale);
pere.jPanelDate.paint(g2);
/**
* On peint le tableau
**/
g2.scale(1 / scale, 1 / scale);
g2.translate(panelHourWidthOnPage, headerHeightOnPage);
//If this piece of the table is smaller
//than the size available,
//clip to the appropriate bounds.
if (pageIndex + 1 == totalNumPages) {
int lastRowPrinted =
numRowsOnAPage * pageIndex;
int numRowsLeft =
pere.tableMois.jTableMois.getRowCount() - lastRowPrinted;
g2.setClip(0,
(int) (pageHeightForTable * pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(oneRowHeight * numRowsLeft));
}
//else clip to the entire area available.
else {
g2.setClip(0,
(int) (pageHeightForTable * pageIndex),
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(pageHeightForTable));
}
/*
scale(xratio, yratio) : Redimensionne le contexte graphique 2D par le ratio en
paramètre. Un ratio de 1 maintient la taille actuelle, et inférieur à 1, va réduire le
contexte graphique.
*/
g2.scale(scale, scale);
pere.tableMois.jTableMois.paint(g2);
/**
* On peint les en-tetes en haut du tableau
**/
g2.scale(1 / scale, 1 / scale);
g2.translate(0f, pageIndex * pageHeightForTable);
g2.translate(0f, -headerHeightOnPage);
g2.setClip(0, 0,
(int) Math.ceil(tableWidthOnPage),
(int) Math.ceil(headerHeightOnPage));
g2.scale(scale, scale);
pere.tableMois.jTableMois.getTableHeader().paint(g2);
//paint header at top
return Printable.PAGE_EXISTS;
}
Voila.
Donc si qu'elqu'un peut m'eclaircir les impressions en java, ça m'aiderait bien.
Kobee12
