Drucken in JAVA 12-Drucken Probleme beim Drucken: •Es können nur graphische Informationen gedruckt werden. •Die zu druckende Information muss graphisch aufbereitet werden. •Größe und Auflösung unterscheiden zwischen Bildschirm und verschiedenen Druckern stark: •Bildschirm: 72-100 dpi •Drucker: 200-1200 dpi •Photosatz: >1200 dpi Es muss eine Anpassung vorgenommen werden •Wegen der unterschiedlichen Papiergrößen sind nicht alle Formate möglich. •Die Nutzung der Drucker ist sehr stark von der Hard- und Softwareumgebung abhängig. 12-Drucken 2 Drucken in JAVA 1. 2. 3. 4. Das zu druckende Objekt muss das Interface Printable oder Pageable implementieren. Es muss ein PrinterJob erzeugt werden. Es müssen die notwendigen Einstellungen vorgenommen werden (Seitengröße, Orientierung...). Der Ausdruck muss gestartet werden. 12-Drucken 3 Das Interface Printable Das Interface Printable beschreibt Ausgaben, die auf einer Seite gemacht werden. public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException Diese Methode muss implementiert werden. •graphics: Graphikkontext der auszugebenden Seite •pageFormat: beschreibt das Format der auszugebenden Seite •pageIndex: Nummer der auszugebenden Seite Die Methode print(...) erfüllt die gleiche Funktion, wie paintComponent für die Ausgabe auf den Bildschirm. Man kann print genau so implementieren, wie paintComponent In EMMA301Paint sollen alle graphischen Objekte druckbar sein. Erweiterung des Interfaces GraphicalObject und der absrakten Klasse AbstractGraphicalObject. 12-Drucken 4 public interface GraphicalObject extends Printable { ... } public abstract class AbstractGraphicalObject implements GraphicalObject { ... public int print(Graphics g, PageFormat pageFormat, int pageIndex) { double scale = Math.min(pageFormat.getImageableWidth()/bounds2D.getWidth(), pageFormat.getImageableHeight()/bounds2D.getHeight()); scale=scale>1.0?1.0:scale; ((Graphics2D)g).translate (pageFormat.getImageableX(), pageFormat.getImageableY()); ((Graphics2D)g).scale(scale, scale); paint((Graphics2D)g); return Printable.PAGE_EXISTS; } } 12-Drucken 5 Die Klasse PrinterJob Klasse PrinterJob beschreibt einen vollständigen Druckvorgang und ermöglicht die Auswahl der Seitenformate, des Druckers u.s.w. Ein Objekt der Klasse PrinterJob muss mit der Methode public static PrinterJob getPrinterJob() erzeugt werden, da die Klasse selbst abstrakt ist. public PageFormat pageDialog(PageFormat page) öffnet einen Dialog zur Auswahl des Seitenformates public boolean printDialog() öffnet einen Dialog zur Auswahl des Druckers. Liefert true, wenn mit ok beendet wird sonst false. Die 12-Drucken 6 public void setPrintable(Printable painter, PageFormat format) setzt das zu druckende Printable-Objekt und das zu verwendende Seitenformat. public void setPageable(Pageable document) throws NullPointerException setzt das zu druckende (mehrseitige Dokument) public void print() throws PrinterException startet die Ausgabe 12-Drucken 7 try { PrinterJob printerJob = PrinterJob.getPrinterJob(); activePageFormat=printerJob.pageDialog(activePageFormat); printerJob.setPrintable( ((EMMA301PaintFrame)desktopPane.getSelectedFrame()). getPicture() ,activePageFormat); if (printerJob.printDialog()) printerJob.print(); } catch (PrinterException pe) {} 12-Drucken 8 Interface Pageable Das Interface Pageable dient der Ausgabe mehrseitiger Dokumente, wobei jede Seite ein anderes Seitenformat haben kann. public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException ist die wesentliche zu implementierende Methode. Sie liefert für die Seite Nummer pageIndex die zu druckende Seite. 12-Drucken 9 Klasse Book Die Klasse Book ist eine reale Implementierung des Interfaces Pageable. Sie dient der Verwaltung mehrseitiger Dokumente. public void append(Printable painter, PageFormat page) fügt eine Seite zu dem Buch hinzu 12-Drucken 10