Seitengerechtes Drucken von JTextAreas

Duckemai

Mitglied
Hallo zusammen,

stehe derzeit mit einem etwas verzwicktem Problem auf dem Schlauch. Vielleicht kennt sich jemand besser mit den Druckfunktionen unter Java aus als ich. Mein Problem ist, dass ich ein JTextArea ausdrucken möchte. Das funktioniert auch (s. Quelltext unten). Aber: Da das JTextArea breiter ist als eine DinA 4 Seite, verschluckt das Programm den Text einer zu langen Zeile und druckt nur den Anfang aus. Das Ende der Zeile wird nicht gedruckt. Ich bräuchte so etwas, dass das Programm die Seitenbreite erkennt und dann einen wortgerechten (also nicht mitten im Wort) Umbruch schafft. Event. geht das mit: getImageableWidth() ?
Vielen Dank für jeden hilfreichen Ansatz:

public class PrintSuit implements Printable
{
private Component compToPrint;
//comp = Parameter für das JTextArea
public static void printComponent(Component comp)
{
new PrintSuit(comp).print();
}

PrintSuit(Component comp)
{
this.compToPrint = comp;
}

public void print()
{
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(this);
PageFormat pf = new PageFormat();
printJob.pageDialog(pf);
if (printJob.printDialog())
try {
printJob.print();
} catch(PrinterException pex) {
pex.printStackTrace();
}
}

public int print(Graphics g, PageFormat pageFormat, int pageIndex)
{
//double breite = (pageFormat.getImageableWidth() - 300); ?
if (pageIndex > 0)
{
return(NO_SUCH_PAGE);
} else
{ //Bestimmung der linken oberen Ecke
int x = (int)pageFormat.getImageableX() + 1;
int y = (int)pageFormat.getImageableY() + 1;
g.translate(x,y);
//Buffer für besseren Druck ausschalten
RepaintManager currentManager = RepaintManager.currentManager(compToPrint);
currentManager.setDoubleBufferingEnabled(false);
compToPrint.paint(g);
currentManager.setDoubleBufferingEnabled(true);
return(PAGE_EXISTS);
}
}//print Graphics

}//class
 
Sorry, jetzt beantworte ich mir schon wieder meine Frage selbst. Bin schon etwas länger aus dem Programmieren raus und mir fehlt wohl noch etwas Selbstvertrauen ;-). Hier die Antwort:

public int print(Graphics g, PageFormat pageFormat, int pageIndex)
{ //Der oben ermittelte Pixelwert aus pageDialog kann hier
//mittels getImageabel... ausgelesen werden. Das Ergebnis
//ist richtigerweise nur die bedruckbare Pixelzahl, also abzüglich Rand
breitePapier = (int) pageFormat.getImageableWidth();
hoehePapier = (int) pageFormat.getImageableHeight();
if (pageIndex > 0)
{
return(NO_SUCH_PAGE);
} else
{ //Bestimmung der linken oberen Ecke
int x = (int)pageFormat.getImageableX() + 1;
int y = (int)pageFormat.getImageableY() + 1;
g.translate(x,y);
//Buffer für besseren Druck ausschalten
RepaintManager currentManager = RepaintManager.currentManager(compToPrint);
currentManager.setDoubleBufferingEnabled(false);
//compToPrint enthält das JTextArea. Hier wird die tatsächlich
//bedruckbare Größe festgelegt
compToPrint.setSize(breitePapier, hoehePapier);
compToPrint.paint(g);
currentManager.setDoubleBufferingEnabled(true);
return(PAGE_EXISTS);
}
}//print Graphics
 
Zurück