Hi,
ich möchte ein JFrame ausdrucken. Auf diesem ist eine Tabelle, die 0 bis n Einträge haben kann. Jetzt kann es natürlich passieren, dass die Tabelle nicht mehr auf eine Seite passt und ich daher mehrere Seiten drucken müsste.
Für das Drucken der Komponente habe ich eine Service Klasse erstellt.
Das Problem ist, dass er so zwar zB 2 Seiten druckt aber immer nur den oberen Teil der Komponente. Ich denke das Problem ist die Zeile
Hier müsste ich ja irgendwie sagen ab wo (x Koordinate) die Komponentenoberfläche in das Graphics Object geschrieben wird. Geht das irgendwie bzw. kann man vielleicht das Graphics Object im Nachgang "zuschneiden"?
Oder wird das so überhaupt nichts?
ich möchte ein JFrame ausdrucken. Auf diesem ist eine Tabelle, die 0 bis n Einträge haben kann. Jetzt kann es natürlich passieren, dass die Tabelle nicht mehr auf eine Seite passt und ich daher mehrere Seiten drucken müsste.
Für das Drucken der Komponente habe ich eine Service Klasse erstellt.
Java:
package temp;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.RepaintManager;
public class ComponentPrinter implements Printable
{
private Component comp;
/**
* querformat
*/
private boolean landscape = false;
public ComponentPrinter(Component comp)
{
this(comp, false);
}
public ComponentPrinter(Component comp, boolean landscape)
{
if(comp == null)
{
throw new NullPointerException("comp may not be null");
}
this.comp = comp;
this.landscape = landscape;
}
/**
* (non-Javadoc)
* @see java.awt.print.Printable#print(java.awt.Graphics, java.awt.print.PageFormat, int)
*/
public int print(Graphics g, PageFormat pF, int pageIndex)
throws PrinterException
{
double paperHeight = pF.getHeight();
int compHeight = comp.getHeight();
// Pruefen obs auf der Seite noch etwas zu drucken gibt
if( (((pageIndex+1) * paperHeight) - compHeight) < paperHeight == false)
{
return (NO_SUCH_PAGE);
}
RepaintManager currentManager = RepaintManager.currentManager(comp);
try
{
currentManager.setDoubleBufferingEnabled(false);
comp.paint(g);
return PAGE_EXISTS;
}
finally
{
currentManager.setDoubleBufferingEnabled(true);
}
}
public void doPrint() throws PrinterException
{
PrinterJob printJob = PrinterJob.getPrinterJob();
// Querformat
if(landscape)
{
PageFormat pF = new PageFormat();
pF.setOrientation(PageFormat.LANDSCAPE);
printJob.setPrintable(this, pF);
}
else
{
printJob.setPrintable(this);
}
if (printJob.printDialog())
{
printJob.print();
}
}
public static void doPrint(Component comp, boolean landscape) throws PrinterException
{
new ComponentPrinter(comp, landscape).doPrint();
}
public static void doPrint(Component comp) throws PrinterException
{
new ComponentPrinter(comp).doPrint();
}
}
Das Problem ist, dass er so zwar zB 2 Seiten druckt aber immer nur den oberen Teil der Komponente. Ich denke das Problem ist die Zeile
Java:
comp.paint(g);
Hier müsste ich ja irgendwie sagen ab wo (x Koordinate) die Komponentenoberfläche in das Graphics Object geschrieben wird. Geht das irgendwie bzw. kann man vielleicht das Graphics Object im Nachgang "zuschneiden"?
Oder wird das so überhaupt nichts?