# Das aktuelle Fenster drucken



## Guest (10. Okt 2006)

Guden, ihr könnt mir sicherlich helfen. 
So und zwar :
Ich habe ein Java-Programm, und will, dass das Programm das aktuelle Fenster druckt. Also wenn ich zum Beispiel Kundendaten anzeigen lasse, will ich dieses Fenster mit Klick auf "Drucken" in der Menüleiste (besteht bereits) ausdrucken können.
Habe bis her nur das gefunden :

```
package kundenverwaltung;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.print.*;
public class PrintStuff
{
  public static void main( String[] args ) throws PrinterException
  {
    PrinterJob pjob = PrinterJob.getPrinterJob();
    if ( pjob.printDialog() == false )
      return;
    pjob.setPrintable( new TextPrintable() );
    pjob.print();
  }
  
    static class TextPrintable implements Printable
  {
    static Font font = new Font( "Times", Font.PLAIN, 20 );
    public int print( Graphics g, PageFormat pageFormat, int pageIndex )
    {
      if ( pageIndex >= 2 )
      return Printable.NO_SUCH_PAGE;
      g.setFont( font );
      g.drawString( "Ich bin der King " + pageIndex, 100, 100 );
      return Printable.PAGE_EXISTS;
    }
  }
}
```

Allerdings will ich nicht den String ausdrucken, sondern das aktuelle Frame ! Könnt ihr den Quelltext so verändern, dass mein Traum in Erfüllung geht ? Das wäre echt nett !!


----------



## André Uhres (10. Okt 2006)

Vielleicht hilft dir dieses Beispiel weiter:

```
package print;
/*
 * PrintTest.java
 */
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import javax.swing.*;
public class PrintTest {
    public static void main(String[] args) {
        PrintFrame prfr = new PrintFrame();
        prfr.setVisible(true);
    }
}
 
/*
 * PrintFrame
 */
class PrintFrame extends JFrame implements ActionListener{
    private PrintPanel pp;
    public PrintFrame() {
        super("Printing Swing");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pp = new PrintPanel();
        getContentPane().add(pp);
        JMenuBar menuBar = new JMenuBar();
        JMenu menu = new JMenu("File");
        JMenuItem printItem = new JMenuItem("Print...");
        menuBar.add(menu);
        menu.add(printItem);
        printItem.addActionListener(this);
        setJMenuBar(menuBar);
        pack();
        setLocationRelativeTo(null);
    }
    public void actionPerformed(ActionEvent evt){
        String command = evt.getActionCommand();
        if(command.equals("Print...")) {
            PrinterJob printJob = PrinterJob.getPrinterJob();
            PageFormat pageFormat = new PageFormat();
            pageFormat.setOrientation(PageFormat.LANDSCAPE);
            printJob.setPrintable(pp, pageFormat);
            if (printJob.printDialog())
                try {
                    printJob.print();
                } catch(PrinterException pe) {
                    System.out.println("Error printing: " + pe);
                }
        }
    }
}
 
/*
 * PrintPanel
 */
class PrintPanel extends JPanel implements Printable {
    public PrintPanel() {
        setBackground(Color.white);
        setPreferredSize(new Dimension(300, 200));
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.black);
        g.drawRect(20,20,100,50);
        g.fillOval(80,80,60,30);
        g.drawString("Printing Swing is simple",100,150);
        g.setColor(Color.red);
        g.drawRect(0,0,299,199);
    }
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
        if (pageIndex > 0) {
            return(NO_SUCH_PAGE);
        } else {
            int x = (int)pageFormat.getImageableX() + 1;
            int y = (int)pageFormat.getImageableY() + 1;
            g.translate(x,y);
            RepaintManager currentManager = RepaintManager.currentManager(this);
            currentManager.setDoubleBufferingEnabled(false);
            paint(g);
            currentManager.setDoubleBufferingEnabled(true);
            return(PAGE_EXISTS);
        }
    }
}
```


----------



## Guest (11. Okt 2006)

Danke !
Wie rufe ich das auf ?

In der Klasse "VerwaltungGUI" :

if(e.getSource()==Drucken)
	  {
           ?????
          }

Versteh ihr was ich meine ?

Eine Menübar habe ich ja bereits, die Klasse "Drucken" habe ich in die package eingebunden, jetzt muss ich die Klasse Drucken noch aufrufen können.
Kann jemand den obigen Code vervollständigen ?


----------



## André Uhres (11. Okt 2006)

Anonymous hat gesagt.:
			
		

> ..Wie rufe ich das auf ?..


Das zu druckend JPanel implementiert Printable, mit der angegebenen "print" Methode:

```
class PrintPanel extends JPanel implements Printable {...}
```
Das Panel übergibst du dann dem PrinterJob (siehe "actionPerformed"):

```
printJob.setPrintable(pp, pageFormat);
```


----------



## Guest (13. Okt 2006)

Danke soweit, aber es geht immernoch nix. So langsam geht das richtig in die Nerven..

Also, die Klassen für das Drucken sieht so aus :

```
package kundenverwaltung;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.print.*;
public class PrintStuff
{
  public static void main( String[] args ) throws PrinterException
  {
    PrinterJob pjob = PrinterJob.getPrinterJob();
    if ( pjob.printDialog() == false )
      return;
//      pjob.setPrintable( new TextPrintable() );
      pjob.print();
  }
  
  public void actionPerformed(ActionEvent evt){
      String command = evt.getActionCommand();
      if(command.equals("Drucken")) {
          PrinterJob printJob = PrinterJob.getPrinterJob();
          if (printJob.printDialog())
              try {
                  printJob.print();
              } catch(PrinterException pe) {
                  System.out.println("Error printing: " + pe);
              }
        }      
     } 
 }
```

Im Hauptprogramm steht folgendes :

```
if(e.getSource()==Drucken)
	    {
		 PrintStuff pjob = new PrintStuff ();
          }
```

Fehler werden keine angezeigt, aber wenn ich das Programm starte, und in der Menüleiste auf Drucken gehe, geschieht nix..
Woran liegt das ????????


----------



## André Uhres (13. Okt 2006)

Du hast das hier vergessen:


```
printJob.setPrintable(pp, pageFormat);
```

pp ist ganz einfach ne Referenz auf das zu druckende JPanel das Printable implementiert 
und die "print"-Methode enthält die ich dir oben angegeben hab  :wink:


----------



## Gast (13. Okt 2006)

sag mal. als format hast du dort ja panorama ausgewählt. wenn ich das jetzt einfach mal drucke, dann kommt nur ungefähr 1/4 einer anwendung auf eine din a 4 seite. mehr druckt der auch nicht. kann man das nicht auf eine din a 4 seite packen?


----------



## André Uhres (13. Okt 2006)

Gast hat gesagt.:
			
		

> ..kann man das nicht auf eine din a 4 seite packen?


In der "print" Methode kannste skalieren  

```
Graphics2D g2d = (Graphics2D)g;
            g2d.scale(0.5d, 0.5d);
```
Um die ganze Papierfläche (oder fast die ganze) zu nutzen:

```
Paper paper = new Paper();
            // Set to A4 size.
            paper.setSize(594.936, 841.536);
            // Set the margins.
            paper.setImageableArea(0, 0, 594.936, 841.536);
            pageFormat.setPaper(paper);
```
In der "print" Methode kannste nochmal x/y korrigieren:

```
int x = (int)pageFormat.getImageableX() + 20;
            int y = (int)pageFormat.getImageableY() + 20;
            g.translate(x,y);
            Graphics2D g2d = (Graphics2D)g;
            g2d.scale(0.75d, 0.75d);
```


----------



## Guest (13. Okt 2006)

André Uhres hat gesagt.:
			
		

> Du hast das hier vergessen:
> 
> 
> ```
> ...



Da bekomm ich die Fehlermeldungen : printjob cannot be resolved und pageformat cannot be resolved.
Ist das eine unlösbare Aufgabe ???????


----------



## André Uhres (13. Okt 2006)

Anonymous hat gesagt.:
			
		

> ..Ist das eine unlösbare Aufgabe ???????


Für einen Programmierer ist das kein Problem.
Eine Hausfrau wird das wahrscheinlich nie lösen können


----------



## Gast (29. Mai 2007)

Hallo, möchte das gleiche mit einer JTextArea machen.



> The method setPrintable(Printable, PageFormat) in the type PrinterJob is not applicable for
> the arguments (JTextArea, PageFormat)




```
PrinterJob printJob = PrinterJob.getPrinterJob(); 
                PageFormat pageFormat = new PageFormat(); 
                pageFormat.setOrientation(PageFormat.LANDSCAPE); 
                printJob.setPrintable(textArea, pageFormat); 
                try { 
                    printJob.print(); 
                } catch(PrinterException pe) { 
                    System.out.println("Error printing: " + pe); 
                }
```
hab leider keinen alternativen befehl gefunden. vielleicht könnt ihr mir weiterhelfen.


----------



## André Uhres (30. Mai 2007)

Du musst die Klasse "JTextArea" erweitern und die Schnittstelle "Printable" implementieren.


----------



## Gast (30. Mai 2007)

hab keine JTextArea Klasse erzeugt. ist es zwingend notwendig dies in einer eigenen Klasse zu tun oder kann man das irgendwie umgehen? casten kann mans leider auch nicht.


----------



## André Uhres (31. Mai 2007)

Gast hat gesagt.:
			
		

> hab keine JTextArea Klasse erzeugt. ist es zwingend notwendig dies in einer eigenen Klasse zu tun oder kann man das irgendwie umgehen?..


Da führt wohl kein Weg dran vorbei  :wink:


----------

