C
Camino
Gast
Hallo,
ich hab in meiner Anwendung eine Klasse zusammengefrickelt, mit der ich Components (z.B. JPanel) ausdrucken kann:
Aufgerufen wird das dann so:
Das klappt auch so einigermassen. Nach Ausführung der Methode printPanel (durch Klick auf Button) öffnet sich der Druckerdialog und ich kann da noch Sachen auswählen. Jetzt hab ich aber noch Fragen.
1.) Ist die Klasse PrintUtilities denn so ok? Oder gibt es da noch Fehler oder Verbesserungsmöglichkeiten?
2.) Ich möchte manchmal auch 2 unterschiedliche JPanel gleichzeitig ausdrucken. Im Moment rufe ich dann mit 1 Buttonklick die Methode printPanel auch zweimal auf, wobei sich dann aber auch der Druckerdialog zweimal öffnet und ich zweimal bestätigen muss. Gibt es die Möglichkeit, dass ich dann nur einmal auf den Button klicke, und beide JPanel ausgedruckt werden? Also, dass die dann wie ein zweiseitiges Dokument gehandhabt werden?
3.) Im Druckerdialog hab ich bei "Druckbereich" die Auswahlmöglichkeiten "Alles" oder "Seiten ... von ... bis ...", wobei dort "von 1 bis 9999" eingetragen ist. Kann ich dort reinschreiben, wieviele Seiten das Dokument hat? Also, bei 1 JPanel "von 1 bis 1" und wenn es 2 JPanel sind "von 1 bis 2"?
ich hab in meiner Anwendung eine Klasse zusammengefrickelt, mit der ich Components (z.B. JPanel) ausdrucken kann:
Java:
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.RepaintManager;
public class PrintUtilities implements Printable {
private Component componentToBePrinted;
public static void printComponent( Component c ) {
new PrintUtilities(c).print();
}
public PrintUtilities( Component componentToBePrinted ) {
this.componentToBePrinted = componentToBePrinted;
}
public void print() {
PrinterJob printJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = printJob.defaultPage(); //new PageFormat();
//pageFormat.setOrientation( PageFormat.LANDSCAPE ); //Längs- oder Querformat (Standard: längs)
Paper a4PortraitPaper = new Paper();
final double cm2inch = 0.3937; // 1in = 2.54cm
double paperHeight = 29.7 * cm2inch;
double paperWidth = 21.0 * cm2inch;
double margin = 1.5 * cm2inch;
a4PortraitPaper.setSize( paperWidth * 72.0, paperHeight * 72.0 );
a4PortraitPaper.setImageableArea( margin * 72.0, margin * 72.0,
( paperWidth - 2 * margin ) * 72.0,
( paperHeight - 2 * margin ) * 72.0 );
pageFormat.setPaper( a4PortraitPaper );
printJob.setPrintable( this, pageFormat );
if ( printJob.printDialog() )
try {
printJob.print();
} catch( PrinterException pe ) {
System.out.println( "Error printing: " + pe );
System.out.println( "Error printing (Message): " + pe.getMessage() );
System.out.println( "Error printing (Localized Message): " + pe.getLocalizedMessage() );
System.out.println( "Error printing (Cause): " + pe.getCause() );
}
}
public int print( Graphics g, PageFormat pageFormat, int pageIndex ) {
double gBreite, gHoehe;
int b, h;
double skalierung = 0.0;
if ( pageIndex > 0 ) {
return( NO_SUCH_PAGE );
} else {
//Skalierung*******************************
gBreite = pageFormat.getImageableWidth();
gHoehe = pageFormat.getImageableHeight();
b = componentToBePrinted.getWidth();
h = componentToBePrinted.getHeight();
skalierung = gBreite / b;
System.out.println(gBreite +" " + b + " " + gHoehe + " " + h + " " + skalierung);
//Ende Skalierung***************************
Graphics2D g2d = (Graphics2D)g;
g2d.translate( pageFormat.getImageableX(), pageFormat.getImageableY() );
g2d.scale( skalierung, skalierung );
disableDoubleBuffering( componentToBePrinted );
componentToBePrinted.paint( g2d );
enableDoubleBuffering( componentToBePrinted );
return( PAGE_EXISTS );
}
}
public static void disableDoubleBuffering( Component c ) {
RepaintManager currentManager = RepaintManager.currentManager( c );
currentManager.setDoubleBufferingEnabled( false );
}
public static void enableDoubleBuffering( Component c ) {
RepaintManager currentManager = RepaintManager.currentManager( c );
currentManager.setDoubleBufferingEnabled( true );
}
}
Aufgerufen wird das dann so:
Java:
...
public void printPanel( Component comp ) {
PrintUtilities myPrintJob = new PrintUtilities( comp );
myPrintJob.print();
}
...
Das klappt auch so einigermassen. Nach Ausführung der Methode printPanel (durch Klick auf Button) öffnet sich der Druckerdialog und ich kann da noch Sachen auswählen. Jetzt hab ich aber noch Fragen.
1.) Ist die Klasse PrintUtilities denn so ok? Oder gibt es da noch Fehler oder Verbesserungsmöglichkeiten?
2.) Ich möchte manchmal auch 2 unterschiedliche JPanel gleichzeitig ausdrucken. Im Moment rufe ich dann mit 1 Buttonklick die Methode printPanel auch zweimal auf, wobei sich dann aber auch der Druckerdialog zweimal öffnet und ich zweimal bestätigen muss. Gibt es die Möglichkeit, dass ich dann nur einmal auf den Button klicke, und beide JPanel ausgedruckt werden? Also, dass die dann wie ein zweiseitiges Dokument gehandhabt werden?
3.) Im Druckerdialog hab ich bei "Druckbereich" die Auswahlmöglichkeiten "Alles" oder "Seiten ... von ... bis ...", wobei dort "von 1 bis 9999" eingetragen ist. Kann ich dort reinschreiben, wieviele Seiten das Dokument hat? Also, bei 1 JPanel "von 1 bis 1" und wenn es 2 JPanel sind "von 1 bis 2"?