Hallo,
Ich verwende folgenden Code um ein JTable zu drucken...
...Aber es wir die verwendete Seitenhöhe nicht richtig erkannt und die letzte Zeile auf einer Seite einfach abgeschnitten und der Rest der Zeile auf die neue Seite gedruckt.
Ich habe den Verdacht das es an der Höhe des Headers liegt, da der eine ganz andere Auflösung hat und möglicherweise dadurch ein falscher Wert verwendet wird...
Hat mir da jemand einen Tip dazu wie ich das Problem lösen kann? Oder wie ich den Header anders auflösen / darstellen kann?
DANKE !
MfG Lipo
Ich verwende folgenden Code um ein JTable zu drucken...
Code:
public int print(Graphics g, PageFormat pageFormat, int pageIndex)
throws PrinterException {
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.black);
int fontHeight = g2.getFontMetrics().getHeight();
int fontDesent = g2.getFontMetrics().getDescent();
//leave room for page number
double pageHeight =
pageFormat.getImageableHeight() - fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth =
(double) table.getColumnModel().getTotalColumnWidth();
double scale = 1;
if (tableWidth >= pageWidth) {
scale = pageWidth / tableWidth;
}
double headerHeightOnPage =
table.getTableHeader().getHeight() * scale;
double tableWidthOnPage = tableWidth * scale;
double oneRowHeight =
(table.getRowHeight() + table.getRowMargin()) * scale;
int numRowsOnAPage =
(int) ((pageHeight - headerHeightOnPage) / oneRowHeight);
double pageHeightForTable = oneRowHeight * numRowsOnAPage;
int totalNumPages =
(int) Math.ceil(((double) table.getRowCount()) / numRowsOnAPage);
if (pageIndex >= totalNumPages) {
return NO_SUCH_PAGE;
}
g2.translate(pageFormat.getImageableX(),
pageFormat.getImageableY());
//bottom center
g2.setFont(new Font("Arial", Font.PLAIN, 8));
g2.drawString( "Seite: " + (pageIndex + 1),
(int) pageWidth - 40,
(int) (pageHeight + fontHeight - fontDesent));
g2.drawString( title + ": Stand: " + datum, 0,
(int) (pageHeight + fontHeight - fontDesent));
g2.translate(0f, headerHeightOnPage);
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 = table.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));
}
g2.scale(scale, scale);
table.paint(g2);
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);
table.getTableHeader().paint(g2);
//paint header at top
return Printable.PAGE_EXISTS;
}
...Aber es wir die verwendete Seitenhöhe nicht richtig erkannt und die letzte Zeile auf einer Seite einfach abgeschnitten und der Rest der Zeile auf die neue Seite gedruckt.
Ich habe den Verdacht das es an der Höhe des Headers liegt, da der eine ganz andere Auflösung hat und möglicherweise dadurch ein falscher Wert verwendet wird...
Hat mir da jemand einen Tip dazu wie ich das Problem lösen kann? Oder wie ich den Header anders auflösen / darstellen kann?
DANKE !
MfG Lipo