JTable drucken - Problem mit der Seitenhöhe

Lipo83

Grünschnabel
Hallo,

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
 
Hallo Erdal,

danke für den Link, ich les mir das mal genau durch. Trotzdem noch eine Frage:

Ich verwende noch das jdk1.4 kann es sein das diese Problem mit dem jdk 5.0 nicht mehr auftritt, ist das richtig?

MfG Lipo
 
Hallo Lipo,

bei Java 1.5 besitzt das JTable die Methode getPrintable(), welche bei der Version 1.4.2 noch nicht dabei ist. Dieser übernimmt vieles was man vorher selbst alles implementieren müsste.

Nimm einfach meinen letzen Beispielcode aus dem jeweiligen Thread und drucke mal deine Tabelle damit aus. Habe auch eine einfache GUI darin integriert, sodass du auch einige Einstellungen vornehmen kannst. Nicht vergessen erst das SDK 1.5 zu installieren.


Vg Erdal
 
Hey,

also das hat soweit alles prima funktioniert.

Jetzt schaffe ich es aber nicht die Seitenzahl herraus zu bekommen...

Kannst du mir da weiterhelfen?

gruß der Lipo

Edit: gibts da allgemein ne info zu? Ich möchte auch die fonts von Header und Footer ändern... THX
 
Zuletzt bearbeitet:
Hallo Lipo,

nach einer kurzen Recherche, würde ich folgendes vorschlagen:
-> HTML Tags

Habs nicht ausprobiert, keine Gewähr.


Vg Erdal
 
flashray hat gesagt.:
...
-> HTML Tags
...
Vg Erdal

Hm, also damit gehts noch nicht. Ist auch nicht soo wichtig.

Was aber momentan sehr wichtig ist, wäre die Seitenzahl rauszubekommen. Ich finde da einfach passendes zu.

Hast Du / oder jemand anders mir dazu einen Tipp?

MfG Lipo
 
Zurück