Drucken einer Swing Componente

Andreas Schmied

Grünschnabel
Hallo zusammen, ich häng im Moment an folgendem Problem.

Ich verwende JDK 1.3.1 und will unter NT eine SwingComponente ausdrucken.

Das Problem dabei ist die größe der Componente, meist wesentlich länger und breiter als eine Seite. Daher muß der Druck aufgeteilt werden, sowohl in der Länge als auch breite. Das ganze hab ich nun mit Rendering des Graphics2D hinzubekommen, aber ich komm damit nicht zurecht, vielleicht kennt jemand das Problem oder weiss woran es liegt.

Der Ausdruck selbst passt einfach nicht, Page 1-1 wird noch entsprechend angezeigt. Auf Page 1-2/1-... ist die Tabelle nicht mehr zu sehen und der Header verschoben. Wahrscheinlich ein Fehler im Clip und Translate - aber ich hab noch nie damit gearbeitet und seh nichts was falsch sein könnte (hab mich am Sun Advanced-Printing Beispiel orientiert). Page 2-1 geht dann wieder

Hier nochmal der Quellcode, vielleicht sieht ja jemand von euch auf einen kurzen Blick was nicht stimmt. Eventuell stimmt was mit dem pageIndex nicht, zumindest gibt es dort etwas was ich mir nicht erklären kann. Statt 0-1-2-3... hochzuzählen passiert jede Index das ganze 2mal (also 0-0-1-1-2-2...)

Bin im Moment mit meinem Latein am Ende und sehr dankbar für jeden Tip und Hinweise.

Danke im Vorraus

public int print(Graphics g, PageFormat pageFormat, int page)
throws PrinterException {
return printTable(g, pageFormat, page);
}

private int printTable(Graphics g, PageFormat pageFormat, int pageIndex)
throws PrinterException {

JTable tableView = table;
pageFormat.setOrientation(PageFormat.LANDSCAPE);
Graphics2D g2 = (Graphics2D) g;

g2.setColor(Color.black);
int fontHeight = g2.getFontMetrics().getHeight();
int fontDesent = g2.getFontMetrics().getDescent();

double pageHeight = pageFormat.getImageableHeight() - fontHeight;
double pageWidth = pageFormat.getImageableWidth();
double tableWidth = (double)tableView.getColumnModel().getTotalColumnWidth();
double tableHight = (double)tableView.getHeight();
double scale = 1;

//if (tableWidth >= pageWidth)
// scale = pageWidth / tableWidth;
//System.out.println("Scale: "+ scale);

double headerHeightOnPage = tableView.getTableHeader().getHeight() * scale;
double tableWidthOnPage = tableWidth * scale;
double oneRowHeight = (tableView.getRowHeight() + tableView.getRowMargin()) * scale;
int numRowsOnAPage = (int) ((pageHeight - headerHeightOnPage) / oneRowHeight);
double pageHeightForTable = oneRowHeight * numRowsOnAPage;
int pagesWidth = (int) Math.ceil(tableView.getTableHeader().getWidth() / pageWidth);
int pagesHeight = (int) Math.ceil(((double) tableView.getRowCount()) / numRowsOnAPage);
int totalNumPages = pagesWidth * pagesHeight;

if (pageIndex >= totalNumPages){
return NO_SUCH_PAGE;
}

disableDoubleBuffering(this);

int pageX = (pageIndex - ((pageIndex/pagesWidth) * pagesWidth));
int pageY = pageIndex / pagesWidth;

g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
String footerString = new String("Page: " + (pageY + 1) + " - " + (pageX + 1));

g2.drawString(
footerString,
(int) pageWidth / 2 - 35,
(int) (pageHeight + fontHeight - fontDesent)
);

g2.translate(0f, headerHeightOnPage);
int translateX = pageX * (int) Math.ceil(pageWidth);
int translateY = -(pageY * (int) Math.ceil(pageHeight));
g2.translate(translateX, translateY);

if ((pageIndex + pagesWidth) >= totalNumPages){
int lastRowPrinted = numRowsOnAPage * pageY;
int numRowsLeft = tableView.getRowCount() - lastRowPrinted;
g2.setClip(
pageX * (int)Math.ceil(pageWidth),
pageY * (int)Math.ceil(pageHeightForTable),
(pageX + 1)* (int)Math.ceil(pageWidth),
(int) Math.ceil(oneRowHeight * numRowsLeft)
);
}
else {
g2.setClip(
pageX * (int)Math.ceil(pageWidth),
pageY * (int)Math.ceil(pageHeightForTable),
(pageX+1)*(int)Math.ceil(pageWidth),
(pageY+1)*(int)Math.ceil(pageHeightForTable)
);
}
tableView.paint(g2);

g2.translate(0f, -headerHeightOnPage);
translateX = -(pageX * (int) Math.ceil(pageWidth));
translateY = (pageY * (int) Math.ceil(pageHeight));
g2.translate(translateX, translateY);

g2.setClip(
pageX * (int) Math.ceil(pageWidth),
0,
(pageX + 1 ) *(int) Math.ceil(pageWidth),
(int) Math.ceil(headerHeightOnPage)
);
tableView.getTableHeader().paint(g2);
enableDoubleBuffering(this);
return Printable.PAGE_EXISTS;
}
 
Servus!

Code:
public class Printer implements Printable
{
  public static final int PORTRAIT=PageFormat.PORTRAIT;
  public static final int LANDSCAPE=PageFormat.LANDSCAPE;
  public static final int REVERSE_LANDSCAPE=PageFormat.REVERSE_LANDSCAPE;

  public static void print(final Component component, final int orientation)
  {
    new Thread()
    {
      public void run()
      {
        try
        {          
          Printable printable=new Printer(component);
          PrinterJob job=PrinterJob.getPrinterJob();
          PageFormat format=job.defaultPage();
          if(orientation>=0) format.setOrientation(orientation);
          job.setPrintable(printable,format);
          if(job.printDialog())
          {
            component.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            job.print();
            component.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
          }
        }
        catch (Exception e)
        {
          System.err.println(e);
        }
      }
    }.start();    
  }

  private Component myComponent;
  
  protected Printer(Component component)
  {
    myComponent=component;
  }

  public int print(Graphics gr, PageFormat pageFormat, int pageIndex)
    throws PrinterException
  {
    if(pageIndex!=0) return NO_SUCH_PAGE;
    
    Graphics2D g=(Graphics2D)gr;
    
    double x = pageFormat.getImageableX();
    double y = pageFormat.getImageableY();
    double w = pageFormat.getImageableWidth();
    double h = pageFormat.getImageableHeight();

    double sx= w/myComponent.getWidth();
    double sy= h/myComponent.getHeight();

    g.translate(x,y);
    g.scale(sx, sy);

    myComponent.printAll(g);

    return PAGE_EXISTS;
  }
}

Zum Drucken: Printer.print(component); aufrufen, fertig.

Aus de.comp.lang.java ... leider nicht bei google.groups Archiviert ...

Gruß tom
 
Zurück