# Inhalt der JTextArea drucken



## Dolce (7. Apr 2009)

Hallo Jungs, 

bin leider noch am Anfang der Programmierung!

Ich möchte gerne den Inhalt meiner TextArea ausdrucken, 
aber ich weiß nicht, wo ich das "TextArea  - Objekt" übergeben soll!

Ich habe hier einen Quellcode der funktioniert, also Verbindung zum 
Drucker ist O.k. und er druckt mir auch "Hallo auf Seite 0", so wie es sein soll!

Jetzt möchte ich aber den Inhalt der jTextArea ("Testdruck") ausgeben, aber ich bekomms nicht hin!!

Kann mir jemand helfen...??
Wäre echt super!

[highlight=Java]
import java.io.PrintWriter;
import java.io.*;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.Copies;
//package com.javatutor.insel.ui.print;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.print.*;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 07.04.2009
  * @author
  */

public class Drucken extends JFrame {
  // Anfang Variablen
  private JScrollPane jScrollPanejTextArea1 = new JScrollPane();
  private JTextArea jTextArea1 = new JTextArea("");
  private JButton jButton1 = new JButton();
  // Ende Variablen

  public Drucken(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Container cp = getContentPane();
    cp.setLayout(null);
    // Anfang Komponenten


    jScrollPanejTextArea1.setBounds(88, 56, 113, 73);
    jTextArea1.setText("TESTDRUCK\n\n");
    jScrollPanejTextArea1.setViewportView(jTextArea1);
    cp.add(jScrollPanejTextArea1);
    jButton1.setBounds(80, 176, 107, 25);
    jButton1.setText("Drucken");
    cp.add(jButton1);
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1ActionPerformed(evt);
      }
    });

    // Ende Komponenten
     //for ( PrintService s : PrintServiceLookup.lookupPrintServices( null, null ) )
     //System.out.println( s.getName() );
    setResizable(false);
    setVisible(true);
   }

  // Anfang Ereignisprozeduren
   public void jButton1ActionPerformed(ActionEvent evt)
   {
     String content = jTextArea1.getText();

      try
      {
      PrinterJob pjob = PrinterJob.getPrinterJob();
       if ( pjob.printDialog() == false )
      return;
       pjob.setPrintable( new TextPrintable() );
       pjob.print();

      }

       catch (Exception ex)
      {
      ex.printStackTrace();
      }



    }

    //Toolkit tk = Toolkit.getDefaultToolkit();
    //PrintJob pj = tk.getPrintJob( new Frame(), "", null );

  // Ende Ereignisprozeduren

  public static void main(String[] args)  {
    new Drucken("Drucken");


  }
}
[/highlight]

Und jetzt kommt die Klasse, die die zu druckende Seite beschreibt

[highlight=Java]
import java.awt.Font;
import java.awt.Graphics;
import java.awt.print.*;


 public class TextPrintable implements Printable
  {
    static Font font = new Font( "Times", Font.PLAIN, 20 );
    public int print( Graphics g, PageFormat pageFormat, int pageIndex )
    {

      if ( pageIndex >= 1 )
        return Printable.NO_SUCH_PAGE;
      g.setFont( font );
      g.drawString( "Hallo auf Seite " + pageIndex, 100, 100 );
      return Printable.PAGE_EXISTS;
    }
  }


[/highlight]


----------



## André Uhres (8. Apr 2009)

Grundsätzlich können wir die JTextArea so drucken:

```
text.print(g);
```
wobei "text" die Referenz auf die JTextArea darstellt.
Hier will ich dir zeigen, wie wir das in deinem Beispiel ansatzweise einbauen könnten:

```
TextPrintable p = new TextPrintable();
p.setText(jTextArea1);
pjob.setPrintable(p);
pjob.print();
```


```
public class TextPrintable implements Printable {
...
    private JTextArea text;
    public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
...
        ((Graphics2D) g).translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        text.print(g);
        return Printable.PAGE_EXISTS;
    }
    public void setText(JTextArea text) {
        this.text = text;
    }
}
```
Gruß,
André

Wenn wir in Abhängikeit vom pageIndex nur einen Teilbereich der JTextArea drucken möchten, d.h. wenn wir eine grössere JTextArea auf mehreren Seiten verteilen wollen, dann können wir dabei folgende Methoden benutzen:
Graphics2D#translate(..)
Graphics2D#clip(..);
Kniffliger wird's nur beim Berechnen der entsprechenden Methodenparameter.


----------



## Dolce (8. Apr 2009)

Danke dir André, 
denke eine sehr hilfreiche Antwort...!!

Ich werd es direkt mal ausprobieren!

So macht es Spaß wenn man so hilfreiche Tipps bekommt... 


Danke dir...!


----------

