# Drucken eines Panels



## Skully (4. Jan 2005)

Habe folgende Methode, die den Inhalt meines Panels ausdrucken soll

```
public void print(){
        if (gui.getTabs().getTabCount() == 0)
            return;
        panel = gui.getCurrentPanel();
        Toolkit tk = Toolkit.getDefaultToolkit();
        int hight, width;
        width = panel.getWidth();
        hight = panel.getHeight();
        BufferedImage doubleBuffer = new BufferedImage(width, hight, BufferedImage.TYPE_INT_RGB);
        PrintJob prjob = tk.getPrintJob( new Frame(), "Drucken", null );
        if ( prjob != null ) {
            Graphics g = prjob.getGraphics(); 
            g.drawImage(doubleBuffer,0,0,width,hight,null); 
            g.dispose(); 
            prjob.end();
        }
    }
```

da druckt er halt nur ne schwarze Seite aus.
Mach ich so:


```
Graphics g = doubleBuffer.getGraphics();
panel.print(g); 
g.dispose(); 
prjob.end();
```
passiert nichts.
Jemand ne Idee?


----------



## hannes68 (13. Feb 2005)

Also bei mir wird der Panel gedruckt nur ohne beachtung der Hintergrundfarbe

```
Toolkit tk = Toolkit.getDefaultToolkit();
PrintJob pj = tk.getPrintJob( new Frame(), "", null );
if ( pj != null ) {
Graphics g = pj.getGraphics();
getJPanel3().printComponents( g );
g.dispose();
pj.end();
```

Kann man da was machen??

Edit:Und den Boarder sollte man auch mit ausdrucken können  :wink:


----------



## JamesDean (14. Feb 2005)

```
Nimmst du folgende Klasse und übergibst Ihr die Componente die du drucken möchstest. Du musst die [i]sendMessage[/i] Anweisungen entfernen oder auskommentieren oder mit [i]System.out.println[/i] ersetzten natürliche dann nur den String angeben ohne das this.

Und natürlich noch die ganzen Imports hinzufügen

Beispiel:

sendMessage(this, "\n****** drucken auslösen******"); mit System.ou.println( sendMessage( "\n****** drucken auslösen******");



public class PrintUtilities implements Printable, MessageSource {
    private Component componentToBePrinted;

    private Vector listenerList;

    double gBreite;

    double gHoehe;

    double b;

    double h;

    double skalierungb = 1.0;

    double skalierungh = 1.0;

    BigDecimal bigDecimal;

    public static void printComponent(Component c) {
        new PrintUtilities(c).print();
    }

    //Dem Konstruktor einfach den Panel übergeben den Du drucken möchtest ******************
    public PrintUtilities(Component componentToBePrinted) {
        this.componentToBePrinted = componentToBePrinted;
    }

    public void print() {
        PrinterJob printerJob = PrinterJob.getPrinterJob();
        PageFormat pageFormat = printerJob.defaultPage();

        try {
            pageFormat.setOrientation(PageFormat.LANDSCAPE);
            printerJob.setJobName("Viewer Printing");
            //sendMessage(this,"clear");
            sendMessage(this, "\n****** drucken auslösen******");
            sendMessage(this, "Landscape(Querformat)");
            //Skalierung*******************************
            bigDecimal = new BigDecimal(pageFormat.getImageableWidth());
            gBreite = bigDecimal.setScale(4, BigDecimal.ROUND_HALF_DOWN)
                    .doubleValue();

            bigDecimal = new BigDecimal(pageFormat.getImageableHeight());
            gHoehe = bigDecimal.setScale(4, BigDecimal.ROUND_HALF_DOWN)
                    .doubleValue();

            b = componentToBePrinted.getWidth();
            h = componentToBePrinted.getHeight();

            if (b > gBreite) {
                bigDecimal = new BigDecimal(gBreite / b);
                skalierungb = bigDecimal
                        .setScale(4, BigDecimal.ROUND_HALF_DOWN).doubleValue();
                sendMessage(this, "Papierbr.: " + gBreite + " * Fensterbr.: "
                        + b + " * Skal.-F. Breite : " + skalierungb);
            }

            if (h > gHoehe) {
                bigDecimal = new BigDecimal(gHoehe / h);
                skalierungh = bigDecimal
                        .setScale(4, BigDecimal.ROUND_HALF_DOWN).doubleValue();
                sendMessage(this, "Papierhö.: " + gHoehe + " * Fensterhö.: "
                        + h + " * Skal.-F. Höhe   : " + skalierungh);
            }
            //Ende Skalierung***************************

        } catch (java.lang.IllegalStateException ise) {
            System.out.println("Druck Fehler...:o(\n" + ise);
        }
        sendMessage(this, "Druckauftraggeber: " + printerJob.getUserName()
                + "\n" + "Jobname: " + printerJob.getJobName() + "\nDrucker: "
                + printerJob.getPrintService());

        printerJob.setPrintable(this, pageFormat);
        if (printerJob.printDialog()) {
            try {
                printerJob.print();
                sendMessage(this, "****** drucken erfolgreich :-) ******");
            } catch (PrinterException pe) {
                System.out.println("**** Druck Fehler :o(  : " + pe);
            }
        } else {
            sendMessage(this, "****** drucken abgebrochen !!!! :o( ******");
        }
    }

    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
        if (pageIndex > 0) {
            return (NO_SUCH_PAGE);
        } else {
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(pageFormat.getImageableX(), pageFormat
                    .getImageableY());
            g2d.scale(skalierungb, skalierungh);
            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);
    }
}
```


----------



## Grizzly (14. Feb 2005)

@Skully: Das Problem mit dem Drucken hatte ich auch. Liegt daran, dass in Java 1.4 ein Bug in der Druck-Bibliothekl ist. Netterweise bringt es auch nichts, die gewünschte Komponente in ein BufferedImage zu zeichnen und dann zu drucken. Ich habe das ganze dann so gelöst, dass ich erst die Komponente in ein BufferedImage gezeichnet habe, dann in eine PNG Datei gespeichert, dann wieder geladen und dann gedruckt. Klingt zwar _etwas_ umständlich, aber anders hat es nicht funktioniert. Und ich hab' wirklich viel probiert...

In Java 1.5 bzw. Java 5 sollte das Problem behoben sein. Hoffe ich...


----------

