# Drucken



## Alex_winf01 (8. Dez 2007)

Also ich habe bis jetzt folgende Druckfunktion:


```
private void doPrint()
   	{
     	PrintJob prJob = this.getToolkit().getPrintJob(this,"Seitendruck",null);
     	Graphics pg = prJob.getGraphics();
     	try
     	{
       		Robot robi = new Robot(this.getGraphicsConfiguration().getDevice());
       		pg.drawImage(robi.createScreenCapture(this.getBounds()),0,0,this.getWidth(),this.getHeight(),this);
       		pg.dispose();
       		prJob.end();
       	}
     	catch(Exception ex)
     	{
      		ex.printStackTrace();
     	}
  	}
```

Nun habe ich folgende Fragen:

1.) Die Funktion druckt nur eine Seite aus - ich möchte aber einen Fragebogen von 4 Seiten ausdrucken. Welche Methode gibt es dafür?
2.) Die Seiteneinrichtung ist nicht auf A4 angepasst. Wer kann mir ein kurzes Beispiel geben?

Und damit ich nicht noch einen Thread öffnen muss:

Ich möchte eine Installationsroutine schreiben, ohne großen Aufwand (wie etwa eine Windows-Installation). Gibt es dafür ein Programm, mit dem ich eine Installationsroutine automatisch zusammenstellen kann?


----------



## L-ectron-X (8. Dez 2007)

Zum Teil mit der Installationsroutine gibts immer noch die JLiB (Java Link Base) als Suchmöglichkeit.
Darin ist ein Tool namens IzPack vorgestellt.


----------



## Alex_winf01 (8. Dez 2007)

Danke für Deine Antwort.

Wer kann mir mit dem Drucken helfen?


----------



## Alex_winf01 (9. Dez 2007)

Also ich bin ein Schritt weiter.

Folgende Datei liegt als Beispiel vor:


```
import java.awt.*;
import javax.swing.*;
import java.awt.print.*;

/** A simple utility class that lets you very simply print
 *  an arbitrary component. Just pass the component to the
 *  PrintUtilities.printComponent. The component you want to
 *  print doesn't need a print method and doesn't have to
 *  implement any interface or do anything special at all.
 *  


 *  If you are going to be printing many times, it is marginally more 
 *  efficient to first do the following:
 *  <PRE>
 *    PrintUtilities printHelper = new PrintUtilities(theComponent);
 *  </PRE>
 *  then later do printHelper.print(). But this is a very tiny
 *  difference, so in most cases just do the simpler
 *  PrintUtilities.printComponent(componentToBePrinted).
 *
 *  7/99 Marty Hall, [url]http://www.apl.jhu.edu/~hall/java/[/url]
 *  May be freely used or adapted.
 */

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();
    printJob.setPrintable(this);
    if (printJob.printDialog())
      try {
        printJob.print();
      } catch(PrinterException pe) {
        System.out.println("Error printing: " + pe);
      }
  }

  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());
      disableDoubleBuffering(componentToBePrinted);
      componentToBePrinted.paint(g2d);
      enableDoubleBuffering(componentToBePrinted);
      return(PAGE_EXISTS);
    }
  }

  /** The speed and quality of printing suffers dramatically if
   *  any of the containers have double buffering turned on.
   *  So this turns if off globally.
   *  @see enableDoubleBuffering
   */
  public static void disableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(false);
  }

  /** Re-enables double buffering globally. */
  
  public static void enableDoubleBuffering(Component c) {
    RepaintManager currentManager = RepaintManager.currentManager(c);
    currentManager.setDoubleBufferingEnabled(true);
  }
}
```

Dann habe ich in meiner eigenen Klasse folgende Methode definiert:


```
private void doPrint()
   	{
     	PrintJob prJob = this.getToolkit().getPrintJob(this,"Seitendruck",null);
     	Graphics pg = prJob.getGraphics();
     	try
     	{
       		Robot robi = new Robot(this.getGraphicsConfiguration().getDevice());
       		pg.drawImage(robi.createScreenCapture(this.getBounds()),0,0,this.getWidth(),this.getHeight(),this);
       		pg.dispose();
       		prJob.end();
       	}
     	catch(Exception ex)
     	{
      		ex.printStackTrace();
     	}
  	}
```

Die Methode doPrint() macht sozusagen einen "Bildschirmprint" einer Seite. Ich versuche verzweifelt das Beispiel einzubinden und weiss nicht, wie ich 
	
	
	
	





```
printComponent
```
 ein binden muss. Wer kann mir helfen?


----------



## André Uhres (9. Dez 2007)

Schau dir mal das an:
http://www.java-forum.org/de/userfiles/user3690/PrintDemo2.java


----------



## Alex_winf01 (9. Dez 2007)

@ André Uhres

Vielen Dank schon mal für Deine Antwort. Hat mir geholfen. Ich habe da noch folgende Frage:

Ich möchte jetzt nicht nur ein JTextField ausdrucken, sondern ich habe einen container con1 (dieser enthält mehrere unterschiedliche Componenten). Nun möchte ich diesen Container komplett ausdrucken. Wie kann ich das realisieren?


----------



## André Uhres (9. Dez 2007)

Meinst du sowas:
http://www.java-forum.org/de/userfiles/user3690/Formular.java
 :?:


----------



## Alex_winf01 (10. Dez 2007)

Ja, genau so was.

@ André Uhres

Vielen vielen Dank. :applaus:

EDIT: Noch mal eine reine Verständnisfrage: Ich habe eine JTabbedPane, die aus vier Reitern besteht. Wenn ich nun alle vier Reiter ausdrucken möchte, muss ich jeden einzelnen Reiter makieren und drucken, oder?


----------



## André Uhres (10. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> ..Ich habe eine JTabbedPane, die aus vier Reitern besteht. Wenn ich nun alle vier Reiter ausdrucken möchte,
> muss ich jeden einzelnen Reiter makieren und drucken, oder?


Man kann auch unsichtbare Komponenten drucken. Diese müssen aber eine Grösse haben.
Du musst also eventuell zuerst die Grösse mit setSize(..) setzen ehe du die unsichtbare
Komponente drucken kannst.


----------



## Alex_winf01 (10. Dez 2007)

@ André Uhres

Könntest Du mir dafür ein Beispiel geben?


----------



## Alex_winf01 (11. Dez 2007)

Kann mir keiner da weiterhelfen?


----------



## André Uhres (11. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> Kann mir keiner da weiterhelfen?


Ich hab jetzt grad keine Zeit dafür. Hast du's wenigstens schon so probiert?
Poste mal ein Beispiel, dann kuck ich danach wenn's nicht funzt.


----------



## Alex_winf01 (11. Dez 2007)

Ich habs schon mal probiert.

Mein Listener für den Button "drucken" sieht wie folgt aus:


```
class druckenListener implements ActionListener 
		{
			public void actionPerformed(ActionEvent e)
			{
			   	formular 		= new Formular(con1);
		       	        PrinterJob pj 	= PrinterJob.getPrinterJob();
				pageFormat 		= new PageFormat();
				paper 			= new Paper();
				reiter2Pane.setSize(500,500);
				paper.setSize(594.936, 841.536); // Set to A4 size.
				paper.setImageableArea(0, 0, 594.936, 841.536); // Set the margins.
				pageFormat.setPaper(paper);
				pj.setPrintable(formular, pageFormat);
				try 
				{
					if (pj.printDialog()) 
				    {
				    	pj.print();
				    }
				} catch (PrinterException pe) 
				{
					System.err.println(pe);
				}
			}
		}
```

reiter2Pane ist der unsichtbare Reiter Nr. 2.

Dann habe ich noch eine Klasse Formular, die wie folgt aussieht:


```
class Formular implements Printable 
{
    private Container container;
    private int index = -1;
    private Rectangle page = new Rectangle(0, 0, 0, 0);
    
    Formular(Container container) 
    {
    	this.container = container;
    }

    public int print(Graphics g, PageFormat pageFormat, int pageIndex) 
    {
        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        int iWidth = (int) pageFormat.getImageableWidth();
        int iHeight = (int) pageFormat.getImageableHeight();
        double scaleFactor = (double) iWidth / (double) container.getWidth();

        while (index < pageIndex) 
        {
            if (pageIndex > container.getHeight() * scaleFactor / iHeight) 
            {
                return NO_SUCH_PAGE;
            }
            page.y += page.height;
            page.width = (int) (iWidth / scaleFactor);
            page.height = (int) (iHeight / scaleFactor);
            index++;
        }

        g2d.scale(scaleFactor, scaleFactor);

        g2d.translate(0, -page.y);
        g2d.clip(page);
        container.print(g2d);

        return PAGE_EXISTS;
    }
}
```


----------



## André Uhres (11. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> ..reiter2Pane ist der unsichtbare Reiter Nr. 2..


Dann poste den Reiter doch mal. Der Code in deinem Beitrag enthält ja nichts Neues.


----------



## Alex_winf01 (11. Dez 2007)

Kann ich Dir den Teil per Mail zukommen lassen? 600 Zeilen halte ich ein bissle viel, um das ins Forum zu posten. Ich hab halt mehrere Panels in dem Reiter mit mehreren Inhalten.

Hier aber mal ein paar Zeilen aus einem anderen JTabbed, welches ich auch ausdrucken muss:


```
/*-----------------------------------------------------------------------------
		* Reiter 1 Anfang
		/*-----------------------------------------------------------------------------*/
		
		JPanel reiter1 			= new JPanel(new BorderLayout());
		JPanel linke_seite 		= new JPanel(new GridLayout(1,0));
		JPanel rechte_seite 	= new JPanel(new GridLayout(1,0));
		
		JLabel absatz1 = new JLabel("irgendein Text");
		
		JLabel absatz4 = new JLabel("irgendein 2. Text");
			
		linke_seite.add(absatz1);
		
		rechte_seite.add(absatz4);
		    
    	reiter1.add(linke_seite, BorderLayout.WEST);
    	reiter1.add(rechte_seite, BorderLayout.CENTER);
  		reiter1Pane = new JScrollPane(reiter1);
  		tp.addTab("A Einführung", reiter1Pane);
    	con1.add(tp);
		
		/*-----------------------------------------------------------------------------
		/* Reiter 1 Ende
		/*-----------------------------------------------------------------------------*/
```

Kann ich Dir den anderen Teil einfach mal per Mail zusenden?


----------



## André Uhres (12. Dez 2007)

Grosse Dateien können wir hier hochladen: Eigene Dateien
Dann braucht man nur den Link zur Datei zu posten,
so wie ich das oben schon gemacht habe :wink:


----------



## Alex_winf01 (12. Dez 2007)

Wie würde das den bei dem von mir geposteten Teil aussehen? Angenommen, dieser 1. Reiter wäre so ein unsichtbarer Teil?


----------



## André Uhres (12. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> Wie würde das den bei dem von mir geposteten Teil aussehen? Angenommen, dieser 1. Reiter wäre so ein unsichtbarer Teil?


Bei mir funktioniert es schon, wenn ich einfach nur ein Formular mit reiter1 anlege und dann drucke.


----------



## Alex_winf01 (12. Dez 2007)

@ André Uhres

Das funktioniert bei mir auch - solange der Reiter auf dem Bildschirm sichtbar ist. Sobald ich einen 2. Reiter habe, wo Reiter 1 selektiert ist und Reiter 2 nicht, so wird nur der 1. Reiter gedruckt und der 2. nicht mehr!!!


----------



## André Uhres (12. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> @ André Uhres
> 
> Das funktioniert bei mir auch - solange der Reiter auf dem Bildschirm sichtbar ist. Sobald ich einen 2. Reiter habe, wo Reiter 1 selektiert ist und Reiter 2 nicht, so wird nur der 1. Reiter gedruckt und der 2. nicht mehr!!!


Mach ein KSKB, wir reden offenbar aneinander vorbei.


----------



## Alex_winf01 (12. Dez 2007)

```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import java.awt.print.Printable;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.PrinterException;
import javax.swing.JLabel;
import javax.swing.Icon;
import java.awt.Graphics2D;
import java.awt.print.PrinterJob;
import java.awt.Robot;
import java.awt.print.*;


class Glossar extends JFrame 
{
	/*-----------------------------------------------------*/
	/* Variablendeklaration
	/*-----------------------------------------------------*/
	public static Container con1;
	public static JScrollPane reiter1Pane, reiter2Pane, reiter3Pane, reiter4Pane, reiter5Pane, reiter6Pane, reiter7Pane;
	final JTabbedPane tp = new JTabbedPane();
	public static PageFormat pageFormat;
    public static Paper paper;
    private Formular formular;
	/*-----------------------------------------------------------------------
	/* Konstruktor
	/*-----------------------------------------------------------------------*/	
    public Glossar( String title ) 
    {
		
        super( title );

        con1=getContentPane();
		con1.setLayout(new BorderLayout());
		JButton drucken = new JButton("drucken");
		
		/*------------------------------------------------------------*/
		/* Schaltfläche "drucken"*/
		/*------------------------------------------------------------*/
		class druckenListener implements ActionListener 
		{
			public void actionPerformed(ActionEvent e)
			{
			   	formular 		= new Formular(con1);
		       	PrinterJob pj 	= PrinterJob.getPrinterJob();
				pageFormat 		= new PageFormat();
				paper 			= new Paper();
				reiter3Pane.setSize(500,500);
				paper.setSize(594.936, 841.536); // Set to A4 size.
				paper.setImageableArea(0, 0, 594.936, 841.536); // Set the margins.
				pageFormat.setPaper(paper);
				pj.setPrintable(formular, pageFormat);
				try 
				{
					if (pj.printDialog()) 
				    {
				    	pj.print();
				    }
				} catch (PrinterException pe) 
				{
					System.err.println(pe);
				}
			}
		}
		
		/*---------------------------------------------------*/
		/*Formatierungen
		/*---------------------------------------------------*/
		Font schrift	= new Font("", Font.BOLD, 26);
		Font schrift_1	= new Font("", Font.PLAIN, 20);
		Font kursiv		= new Font("", Font.ITALIC, 12);
		Font fett		= new Font("", Font.BOLD, 12);
		int rot 			= 255;
		int grün 			= 255;
		int blau 			= 255;
		int rot_schwarz 	= 0;
		int grün_schwarz 	= 0;
		int blau_schwarz 	= 0;
		Color farbe_weiss 	= new Color(rot, grün, blau);
		Color farbe_schwarz = new Color(rot_schwarz, grün_schwarz, blau_schwarz);
		Border rahmen 	= BorderFactory.createMatteBorder(5, 5, 5, 5, Color.black);

		/*-----------------------------------------------------------------------------
		* Reiter 1 Anfang
		/*-----------------------------------------------------------------------------*/
		
		JPanel reiter1 			= new JPanel(new BorderLayout());
		JPanel linke_seite 		= new JPanel(new GridLayout(1,0));
		JPanel rechte_seite 	= new JPanel(new GridLayout(1,0));
		
		JLabel absatz1 = new JLabel("1. Absatz");
		JLabel absatz4 = new JLabel("2. Absatz");
			
		linke_seite.add(absatz1);
		
		rechte_seite.add(absatz4);
		    
    	reiter1.add(linke_seite, BorderLayout.WEST);
    	reiter1.add(rechte_seite, BorderLayout.CENTER);
  		reiter1Pane = new JScrollPane(reiter1);
  		tp.addTab("A Einführung", reiter1Pane);
    	con1.add(tp, BorderLayout.CENTER);
    	con1.add(drucken, BorderLayout.NORTH);
		
		/*-----------------------------------------------------------------------------
		/* Reiter 1 Ende
		/*-----------------------------------------------------------------------------*/
		
		/*-----------------------------------------------------------------------------
		/* Reiter 2 Anfang
		/*-----------------------------------------------------------------------------*/
		JPanel reiter3 					= new JPanel(new BorderLayout());
		JPanel linke_seite_reiter3 		= new JPanel(new GridLayout(1,0));
		JPanel rechte_seite_reiter3		= new JPanel(new GridLayout(1,0));
		
		JLabel absatz20 = new JLabel("Absatz 20");
		linke_seite_reiter3.add(absatz20);
		
		JLabel absatz31 = new JLabel("Absatz 31");
		
		rechte_seite_reiter3.add(absatz31);
		
		reiter3.add(linke_seite_reiter3, BorderLayout.WEST);
    	reiter3.add(rechte_seite_reiter3, BorderLayout.CENTER);
  		reiter3Pane = new JScrollPane(reiter3);
  		
  		tp.addTab("Was wird in den einzelnen Teilen dokumentiert?", reiter3Pane);
    	con1.add(tp);
    	/*-----------------------------------------------------------------------------
		/* Reiter 2 Ende
		/*-----------------------------------------------------------------------------*/
		
    	drucken.addActionListener(new druckenListener());// Listener zuordnen
	}
	public static void main(String[] args)
	{
		Glossar frm = new Glossar("Glossar");
		frm.setVisible(true);
		frm.setSize(400,400);
		frm.pack();
	}
}
class Formular implements Printable 
{
    private Container container;
    private int index = -1;
    private Rectangle page = new Rectangle(0, 0, 0, 0);
    
    Formular(Container container) 
    {
    	this.container = container;
    }

    public int print(Graphics g, PageFormat pageFormat, int pageIndex) 
    {
        Graphics2D g2d = (Graphics2D) g;
        g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
        int iWidth = (int) pageFormat.getImageableWidth();
        int iHeight = (int) pageFormat.getImageableHeight();
        double scaleFactor = (double) iWidth / (double) container.getWidth();

        while (index < pageIndex) 
        {
            if (pageIndex > container.getHeight() * scaleFactor / iHeight) 
            {
                return NO_SUCH_PAGE;
            }
            page.y += page.height;
            page.width = (int) (iWidth / scaleFactor);
            page.height = (int) (iHeight / scaleFactor);
            index++;
        }

        g2d.scale(scaleFactor, scaleFactor);

        g2d.translate(0, -page.y);
        g2d.clip(page);
        container.print(g2d);

        return PAGE_EXISTS;
    }
}
```

Wenn ich jetzt auf drucken gehe, wird nur der 1. Reiter gedruckt und nicht der 2. Reiter. Auch nicht, wenn ich sage 
	
	
	
	





```
.setSize().
```

Dann habe ich noch folgendes "Problem":

Meine Reiter haben eine ScrollPane, das heisst der Anwender muss scrollen. Da wird dann der untere,  nicht sichtbare Teil nicht mit ausgedruckt.


----------



## André Uhres (12. Dez 2007)

```
package printing;
/*
 * Glossar.java
 */

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

class Glossar extends JFrame {
    /*-----------------------------------------------------*/
    /* Variablendeklaration
    /*-----------------------------------------------------*/

    private Container con1;
    private JScrollPane reiter1Pane,  reiter3Pane;
    private JTabbedPane tp = new JTabbedPane();
    private JPanel reiter1,  reiter3,  linke_seite,  rechte_seite,  linke_seite_reiter3,  rechte_seite_reiter3;
    private JLabel absatz1,  absatz4,  absatz20,  absatz31;
    private Formular formular;
    private Paper paper;
    private PageFormat pageFormat;
    private PrinterJob pj;
    /*-----------------------------------------------------------------------
    /* Konstruktor
    /*-----------------------------------------------------------------------*/

    public Glossar(String title) {
        super(title);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        con1 = getContentPane();
        con1.setLayout(new BorderLayout());
        JButton drucken = new JButton("drucken");

        /*------------------------------------------------------------*/
        /* Schaltfläche "drucken"*/
        /*------------------------------------------------------------*/
        class druckenListener implements ActionListener {

            public void actionPerformed(ActionEvent e) {
                pj = PrinterJob.getPrinterJob();
                try {
                    if (pj.printDialog()) {
                        paper = new Paper();
                        paper.setSize(594.936, 841.536); // Set to A4 size.
                        paper.setImageableArea(30, 30, 530, 780);//set margins
                        pageFormat = new PageFormat();
                        pageFormat.setPaper(paper);
                        Dimension size = null;
                        /*
                         (We assume that the invisible tabs are 
                          not bigger than the visible tab)
                         */
                        //get size of visible tab:
                        if (tp.getSelectedIndex() == 0) {
                            size = reiter1.getSize();
                        } else {
                            size = reiter3.getSize();
                        }
                        //print first tab:
                        reiter1.setSize(size);
                        formular = new Formular(reiter1);
                        pj.setPrintable(formular, pageFormat);
                        pj.print();
                        //print second tab:
                        reiter3.setSize(size);
                        formular = new Formular(reiter3);
                        pj.setPrintable(formular, pageFormat);
                        pj.print();
                    }
                } catch (PrinterException ex) {
                    ex.printStackTrace();
                }
            }
        }
        /*--------------------------------------------------------------------
         * Reiter 1 Anfang
        /*-------------------------------------------------------------------*/

        reiter1 = new JPanel(new BorderLayout());
        linke_seite = new JPanel(new GridLayout(1, 0));
        rechte_seite = new JPanel(new GridLayout(1, 0));

        absatz1 = new JLabel("1. Absatz");
        absatz4 = new JLabel("2. Absatz");

        linke_seite.add(absatz1);

        rechte_seite.add(absatz4);

        reiter1.add(linke_seite, BorderLayout.WEST);
        reiter1.add(rechte_seite, BorderLayout.CENTER);
        reiter1Pane = new JScrollPane(reiter1);
        tp.addTab("A Einführung", reiter1Pane);
        con1.add(tp, BorderLayout.CENTER);
        con1.add(drucken, BorderLayout.NORTH);

        /*--------------------------------------------------------------------
        /* Reiter 1 Ende
        /*--------------------------------------------------------------------*/

        /*---------------------------------------------------------------------
        /* Reiter 2 Anfang
        /*--------------------------------------------------------------------*/
        reiter3 = new JPanel(new BorderLayout());
        linke_seite_reiter3 = new JPanel(new GridLayout(1, 0));
        rechte_seite_reiter3 = new JPanel(new GridLayout(1, 0));

        absatz20 = new JLabel("Absatz 20");
        linke_seite_reiter3.add(absatz20);

        absatz31 = new JLabel("Absatz 31");

        rechte_seite_reiter3.add(absatz31);

        reiter3.add(linke_seite_reiter3, BorderLayout.WEST);
        reiter3.add(rechte_seite_reiter3, BorderLayout.CENTER);
        reiter3Pane = new JScrollPane(reiter3);

        tp.addTab("Was wird in den einzelnen Teilen dokumentiert?", reiter3Pane);
        con1.add(tp);
        /*------------------------------------------------------------------
        /* Reiter 2 Ende
        /*-------------------------------------------------------------------*/
        pack();
        drucken.addActionListener(new druckenListener());// Listener zuordnen
    }

    public static void main(String[] args) {
        new Glossar("Glossar").setVisible(true);
    }
}
```


----------



## Alex_winf01 (13. Dez 2007)

Vielen vielen Dank. :toll:

Ich habe jetzt nur noch das Problem mit der JScrollPane. Und zwar muss der Anwender einen kleinen Teil "scrollen" mit der JScrollPane. Der nicht sichtbare Teil der JScrollPane wird nicht mit gedruckt.


----------



## André Uhres (13. Dez 2007)

Alex_winf01 hat gesagt.:
			
		

> ..Ich habe jetzt nur noch das Problem mit der JScrollPane..


Das JScrollPane dürfte eigentlich nicht stören.
Wir drucken ja nicht das JScrollPane sondern nur das JPanel, was drinnen ist.
Letzteres musst du also einfach nur mit der richtigen Grösse versehen, so dass alles gedruckt wird.


----------

