Hallo,
ich möchte einen String ausdrucken. Dazu habe ich aus dem "Sun SDK 1.2 Printing Tutorial" den Code aus "Listing 3: Using the print method: PrintText " als Basis genommen und einwenig abgeändert. Dieses Beispiel aus dem Tutorial ist eigentlich für das Drucken einer einzigen Seite gedacht. Habe leider noch keine genaue Idee, wie ich diesen für das ausdrucken mehrerer Seiten modifiziere.
Eines habe ich festgestellt: in der folgenden Zeile
while (measurer.getPosition() < charIterator.getEndIndex() )
durchläuft die Schleife den String bis zum Ende, egal ob es aus dem Druckbereich hinaus geht oder nicht.
Eine Möglichkeit wäre die while-Schleife, dann abzubrechen wenn er den letzen char gedruckt hat, welche auf diese Seite noch Platz findet. Dessen index sollte dann in eine Variable gespeichert werden. So könnte ich für den Rest des Strings die Druckroutine nochmals aufrufen, und soweiter bis alles ausgedruckt ist.
Wie könnte ich festellen das ein bestimmter Schleifendurchgang die Zeile gedruckt hat welche auf die aktuelle Seite gerade noch passt um danach sofort die Schleife abzubrechen? Wenn das klappen würde könnte ich mit dem letzen Wert von measurer.getPosition() und substring() den Rest des ursprünglichen Strings nochmals zum Drucken weitergeben.
Noch eines, ist das das übliche Verfahren ein mehrseitiges Dokument aus einem String heraus zu drucken? Oder würdet Ihr da anders vorgehen?
Vg Erdal
ich möchte einen String ausdrucken. Dazu habe ich aus dem "Sun SDK 1.2 Printing Tutorial" den Code aus "Listing 3: Using the print method: PrintText " als Basis genommen und einwenig abgeändert. Dieses Beispiel aus dem Tutorial ist eigentlich für das Drucken einer einzigen Seite gedacht. Habe leider noch keine genaue Idee, wie ich diesen für das ausdrucken mehrerer Seiten modifiziere.
Eines habe ich festgestellt: in der folgenden Zeile
while (measurer.getPosition() < charIterator.getEndIndex() )
durchläuft die Schleife den String bis zum Ende, egal ob es aus dem Druckbereich hinaus geht oder nicht.
Eine Möglichkeit wäre die while-Schleife, dann abzubrechen wenn er den letzen char gedruckt hat, welche auf diese Seite noch Platz findet. Dessen index sollte dann in eine Variable gespeichert werden. So könnte ich für den Rest des Strings die Druckroutine nochmals aufrufen, und soweiter bis alles ausgedruckt ist.
Wie könnte ich festellen das ein bestimmter Schleifendurchgang die Zeile gedruckt hat welche auf die aktuelle Seite gerade noch passt um danach sofort die Schleife abzubrechen? Wenn das klappen würde könnte ich mit dem letzen Wert von measurer.getPosition() und substring() den Rest des ursprünglichen Strings nochmals zum Drucken weitergeben.
Noch eines, ist das das übliche Verfahren ein mehrseitiges Dokument aus einem String heraus zu drucken? Oder würdet Ihr da anders vorgehen?
Vg Erdal
Code:
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import java.awt.print.*;
import java.text.*;
public class PrintText implements Printable {
AttributedString mStyledText;
PageFormat format;
public PrintText(String text, Font font, PageFormat pageformat) {
mStyledText = new AttributedString(text);
mStyledText.addAttribute(TextAttribute.FONT, font);
format = pageformat;
}
public void drucken() {
PrinterJob printerJob = PrinterJob.getPrinterJob();
Book book = new Book();
book.append(this, format);
printerJob.setPageable(book);
boolean doPrint = printerJob.printDialog();
if (doPrint) {
try {
printerJob.print();
} catch (PrinterException exception) {
System.err.println("Printing error: " + exception);
}
}
}
public int print(Graphics g, PageFormat format, int pageIndex) {
if (pageIndex > 0)
return Printable.NO_SUCH_PAGE;
Graphics2D g2d = (Graphics2D) g;
g2d.translate(format.getImageableX(), format.getImageableY());
g2d.setPaint(Color.black);
Point2D.Float pen = new Point2D.Float();
AttributedCharacterIterator charIterator = mStyledText.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(charIterator, g2d
.getFontRenderContext());
float wrappingWidth = (float) format.getImageableWidth();
while (measurer.getPosition() < charIterator.getEndIndex() ) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
pen.y += layout.getAscent();
float dx = layout.isLeftToRight() ? 0 : (wrappingWidth - layout
.getAdvance());
layout.draw(g2d, pen.x + dx, pen.y);
pen.y += layout.getDescent() + layout.getLeading();
}
return Printable.PAGE_EXISTS;
}
}