Date: Fri, 10 Nov 2023 15:11:48 +0100
Subject: add new repo
---
.../hjp5/html/k100170.html | 1026 ++++++++++++++++++++
1 file changed, 1026 insertions(+)
create mode 100644 Master/Reference Architectures and Patterns/hjp5/html/k100170.html
(limited to 'Master/Reference Architectures and Patterns/hjp5/html/k100170.html')
diff --git a/Master/Reference Architectures and Patterns/hjp5/html/k100170.html b/Master/Reference Architectures and Patterns/hjp5/html/k100170.html
new file mode 100644
index 0000000..75b8c9a
--- /dev/null
+++ b/Master/Reference Architectures and Patterns/hjp5/html/k100170.html
@@ -0,0 +1,1026 @@
+
+
+
+Handbuch der Java-Programmierung, 5. Auflage
+
+
+
+
+
+
+
+
+
+
+
+
+26.3 Drucken seit dem JDK 1.2
+
+
+
+
+
+
+
+26.3.1 Überblick
+
+
+Seit dem JDK 1.2 wurde ein anderer Ansatz verfolgt. Anstelle der im
+vorigen Abschnitt erwähnten Techniken sind nun die Klassen und
+Interfaces aus dem Paket java.awt.print
+zu verwenden, die zwei unterschiedliche Arten von Funktionen zur Verfügung
+stellen:
+
+- Die Klasse PrinterJob
+ist für die Kontrolle des Druckauftrags verantwortlich.
+Sie dient zum Aufrufen der plattformspezifischen Konfigurationsdialoge,
+registriert die Objekte zur Seitenausgabe und startet den eigentlichen
+Druckvorgang.
+
- Der eigentliche Ausdruck wird von Objekten des Typs Printable
+oder Pageable
+erledigt. Sie werden beim PrinterJob
+registriert und zu geeigneter Zeit von diesem mit der Ausgabe der
+Druckdaten beauftragt.
+
+
+
+Anders als im JDK 1.1 stehen nun zwei Konfigurationsdialoge
+zur Verfügung. Mit dem einen können Job-Parameter wie Anzahl
+der Kopien, auszudruckende Seiten oder der Druckertyp
+eingestellt werden. Der andere dient zur Einstellung von Seitenparametern,
+mit dem etwa das Papierformat, die Seitengröße oder die
+Randeinstellungen konfiguriert werden können. Beide Dialoge sind
+optional und können auch unterdrückt werden. Alle mit ihrer
+Hilfe konfigurierbaren Parameter können auch programmgesteuert
+verändert werden.
+
+
+
+
+
26.3.2 Zusammenspiel der Klassen
+
+
+
+
+Die Klasse PrinterJob
+
+
+Die abstrakte Klasse PrinterJob
+aus dem Paket java.awt.print
+repräsentiert einen Druckauftrag und ist Ausgangspunkt für
+alle Druckaktivitäten mit dem JDK 1.2. Sie besitzt eine statische
+Methode getPrinterJob,
+mit der Instanzen erzeugt werden können:
+
+
+
+
+PrinterJob
+besitzt Methoden, mit denen einige globale Eigenschaften des Druckauftrags
+kontrolliert werden können:
+
+
+
+
+
+
+public String getUserName()
+
+public int getCopies()
+public void setCopies(int copies)
+
+public void setJobName(String jobName)
+public String getJobName()
+
+public void cancel()
+public boolean isCancelled()
+
+
+ |
+
+java.awt.print.PrinterJob |
+
+
+
+
+getUserName
+liefert den Namen des Benutzers, der den Job gestartet hat. getCopies
+und setCopies
+dienen zum Zugriff auf die Anzahl der Kopien, die ausgedruckt werden
+sollen. Mit getJobName
+und setJobName
+kann der Name des Druckjobs abgefragt bzw. eingestellt werden. Durch
+Aufruf von cancel
+kann ein laufender Druckjob abgebrochen werden. isCancelled
+liefert true,
+falls während eines laufenden Druckjobs cancel
+aufgerufen wurde und der Job bei der nächstmöglichen Gelegenheit
+beendet wird.
+
+
+
+
+
Die Klassen Paper und PageFormat
+
+
+Neben den eigentlichen Druckdaten besitzt eine auszudruckende Seite
+globale Eigenschaften wie Papiergröße und Randeinstellungen.
+Diese werden durch die Klassen PageFormat
+und Paper
+gekapselt. Paper
+repräsentiert ein Blatt Papier mit festgelegten Abmessungen für
+Breite, Höhe und bedruckbaren Bereich:
+
+
+
+
+
+
+public double getHeight()
+public double getWidth()
+
+public double getImageableX()
+public double getImageableY()
+
+public double getImageableWidth()
+public double getImageableHeight()
+
+
+ |
+
+java.awt.print.Paper |
+
+
+
+
+getHeight
+und getWidth
+liefern die Höhe bzw. Breite des Papierblatts. getImageableX
+und getImageableY
+geben den Abstand des bedruckbaren Bereichs vom oberen bzw. linken
+Blattrand an. getImageableWidth
+und getImageableHeight
+geben die Breite bzw. Höhe des bedruckbaren Bereichs an.
+
+
+
+
+Die Klasse PageFormat
+kapselt ein Paper-Objekt
+und dessen Orientierung:
+
+
+
+
+
+
+public static final int PORTRAIT
+public static final int LANDSCAPE
+public static final int REVERSE_LANDSCAPE
+
+
+ |
+
+java.awt.print.PageFormat |
+
+
+
+
+Ist die Orientierung PORTRAIT,
+so wird das Blatt in seiner Standardausrichtung verwendet. Es ist
+also höher als breit, und der Koordinatenursprung befindet sich
+links oben. Beim Drucken im LANDSCAPE-Modus
+wird das Papier dagegen quer verwendet, und der rechte Rand des Ausdrucks
+liegt am oberen Blattrand. REVERSE_LANDSCAPE
+druckt ebenfalls quer, aber mit umgekehrter Druckrichtung.
+
+
+PageFormat
+stellt Methoden zum Zugriff auf das Papier, seine Orientierung und
+die aus Paper
+bekannten Methoden zum Zugriff auf die Seitenabmessungen zur Verfügung:
+
+
+
+
+
+
+
+public Paper getPaper()
+
+public int getOrientation()
+
+public double getHeight()
+public double getWidth()
+
+public double getImageableX()
+public double getImageableY()
+
+public double getImageableWidth()
+public double getImageableHeight()
+
+
+ |
+
+java.awt.print.Paper |
+
+
+
+
+
+
+Ein PageFormat-Objekt
+wird gewöhnlich mit der Methode defaultPage
+der Klasse PrinterJob
+beschafft:
+
+
+
+
+Es kann dann entweder programmgesteuert oder durch Aufruf des Seitendialogs
+konfiguriert werden.
+
+
+
+
+
Die Konfigurationsdialoge
+
+
+Die Klasse PrinterJob
+besitzt zwei Konfigurationsdialoge. Der erste dient zur Konfiguration
+eines PageFormat-Objekts
+und wird mit pageDialog
+aufgerufen. Der zweite dient zur Konfiguration der globalen Job-Parameter
+und wird mit printDialog
+aufgerufen:
+
+
+
+
+
+
+public PageFormat pageDialog(PageFormat page)
+
+public abstract boolean printDialog()
+
+
+ |
+
+java.awt.print.PrinterJob |
+
+
+
+
+pageDialog
+erwartet ein PageFormat-Objekt
+(das typischerweise durch defaultPage
+erzeugt wird) und bietet dem Anwender die Möglichkeit, dessen
+Eigenschaften zu verändern. Die dafür verwendeten Dialoge
+sind plattformabhängig, die Windows-Variante ist in Abbildung 26.2
+zu sehen.
+
+
+Der Rückgabewert von pageDialog
+ist das konfigurierte PageFormat-Objekt.
+Hat der Anwender den Dialog mit »OK« beendet, wird eine
+Kopie des als Parameter übergebenen Objekts erzeugt, mit den
+Einstellungen des Anwenders versehen und an den Aufrufer zurückgegeben.
+Hat der Anwender den Dialog dagegen abgebrochen, wird das unveränderte
+Originalobjekt zurückgegeben. Durch Vergleichen der beiden Objektreferenzen
+kann also unterschieden werden, ob der Druckvorgang fortgesetzt oder
+abgebrochen werden soll.
+
+
+
+
+
+
+Abbildung 26.2: Der Dialog zur Druckseitenkonfiguration unter Windows
+
+
+Durch Aufruf von printDialog
+wird der plattformspezifische Dialog zur Jobkonfiguration aufgerufen
+(siehe Abbildung 26.3. Er
+konfiguriert das PrinterJob-Objekt,
+und die Änderungen können mit den oben beschriebenen Methoden
+abgefragt werden. Der boolesche Rückgabewert zeigt an, ob der
+Dialog mit »OK« beendet oder abgebrochen wurde.
+
+
+
+
+
+
+Abbildung 26.3: Der Dialog zur Druckjobkonfiguration unter Windows
+
+
+
+
+Das Interface Printable
+
+
+Nachdem wir die Konfiguration der Job- und Seiteneinstellungen besprochen
+haben, wollen wir uns nun der Frage zuwenden, wie die eigentliche
+Druckausgabe erzeugt wird. Dazu gibt es im Paket java.awt.print
+ein Interface Printable,
+das nur eine Methode enthält:
+
+
+
+
+
+
+public int print(Graphics g, PageFormat pf, int page)
+ throws PrinterException
+
+
+ |
+
+java.awt.print.Printable |
+
+
+
+
+Ein Programm, das Druckausgaben erzeugen will, muss ein Objekt zur
+Verfügung stellen, das dieses Interface implementiert. Es muss
+mit der Methode setPrintable
+an den PrinterJob
+übergeben werden und wird von PrinterJob
+automatisch aufgerufen, nachdem der Druckvorgang mit print
+gestartet wurde:
+
+
+
+
+
+
+public void setPrintable(Printable painter)
+public void setPrintable(Printable painter, PageFormat format)
+
+public void print()
+ throws PrinterException
+
+
+ |
+
+java.awt.print.PrinterJob |
+
+
+
+
+Printable
+sorgt dabei für die Druckausgabe, ähnlich wie es paint
+für die Bildschirmausgabe bei GUI-Komponenten tut. Jeder (von
+PrinterJob
+initiierte) Aufruf von print
+fordert das Printable-Objekt
+auf, eine bestimmte Seite auszudrucken. Der Seitenindex wird dabei
+in dem Parameter page übergeben,
+dessen Zählung bei 0 beginnt.
+
+
+Zur Erzeugung von Druckausgaben wird das übergebene Graphics-Objekt
+verwendet, das wie bei der Erzeugung von Bildschirmausgaben verwendet
+werden kann. Das übergebene Objekt kann dabei in ein Graphics2D-Objekt
+konvertiert werden und stellt so die erweiterten Funktionen des 2D-APIs
+zur Verfügung.
+
+
+Weiterhin wird das konfigurierte PageFormat
+als Argument an print
+übergeben. Innerhalb von print
+wird es dazu benutzt, die Größe des Papiers und dessen
+bedruckbaren Bereich zu ermitteln.
+
+
+
+
+Der Rückgabewert von print
+gibt an, ob die Seitenzahl gültig war und die Druckausgabe erzeugt
+werden konnte, oder ob eine ungültige Seitenzahl übergeben
+wurde. Im ersten Fall gibt print
+die in Printable
+definierte Konstante PAGE_EXISTS
+zurück, im zweiten Fall NO_SUCH_PAGE.
+Da der PrinterJob
+nicht von Anfang an weiß, wie viele Seiten insgesamt ausgedruckt
+werden sollen, muss er beim Aufruf von print
+schrittweise den Seitenzähler erhöhen und darauf warten,
+dass NO_SUCH_PAGE
+zurückgegeben wird. Danach erfolgen keine weiteren Aufrufe von
+print.
+
+
+
+
+
+
+Das Interface Pageable und die Klasse Book
+
+
+Das Paket java.awt.print
+stellt auch eine Abstraktion für mehrseitige Dokumente
+zur Verfügung. Das Interface Pageable
+definiert deren Eigenschaften:
+
+
+
+
+
+
+public int getNumberOfPages()
+
+public PageFormat getPageFormat(int pageIndex)
+ throws IndexOutOfBoundsException
+
+public Printable getPrintable(int pageIndex)
+ throws IndexOutOfBoundsException
+
+
+ |
+
+java.awt.print.Pageable |
+
+
+
+
+Ein Pageable-Objekt
+kennt (normalerweise) die Anzahl der auszudruckenden Seiten und stellt
+diese auf Anfrage als Rückgabewert von getNumberOfPages
+zur Verfügung. Wahlweise kann aber auch die Konstante UNKNOWN_NUMBER_OF_PAGES
+zurückgegeben werden, wenn die Seitenzahl nicht von vorneherein
+bekannt ist. Im Unterschied zu einem Printable-Objekt
+(das ja auch mehrere Seiten ausdrucken kann), kann ein Pageable
+zu den einzelnen Seiten unterschiedliche PageFormat-
+und Printable-Objekte
+zur Verfügung stellen. Sie werden während des Druckvorgangs
+mit den Methoden getPageFormat
+und getPrintable
+abgefragt.
+
+
+Mit der Klasse Book
+stellt java.awt.print
+eine konkrete Implementierung von Pageable
+zur Verfügung. Ein Book
+ist dabei nichts anderes als eine nach Seitenzahlen indizierte Liste
+von (PageFormat/Printable)-Paaren,
+die mit einigen einfachen Methoden gepflegt werden kann:
+
+
+
+
+
+
+public void append(Printable painter, PageFormat pf)
+public void append(Printable painter, PageFormat pf, int numPages)
+
+public void setPage(int page, Printable painter, PageFormat pf)
+ throws IndexOutOfBoundsException
+
+
+ |
+
+java.awt.print.Book |
+
+
+
+
+Mit append
+werden eine oder mehrere Seiten mit den angegebenen Printable-
+und PageFormat-Objekten
+an das Ende des Buchs angehängt. Mit setPage
+kann gezielt eine bereits bestehende Seite verändert werden.
+
+
+
+
+
26.3.3 Ausdrucken einer Textdatei
+
+
+Nach diesen Vorbemerkungen wollen wir uns in diesem Abschnitt ein
+Anwendungsbeispiel für das Druck-API des JDK 1.2 ansehen. Dazu
+soll ein Programm geschrieben werden, das beliebige Textdateien auf
+einem Drucker ausgeben kann. Der Anwender soll sowohl Job- als auch
+Seitenparameter im Dialog verändern können. Jede Seite soll
+mit einer Kopfzeile versehen werden, die den Namen der Datei und die
+Seitenzahl enthält. Die Kopfzeile soll fett gedruckt und unterstrichen
+werden. Der Textteil soll dunkelblau gedruckt werden, sofern Farben
+unterstützt werden.
+
+
+
+
+
Die Hilfsklasse FilePrintHelper
+
+
+Wir hatten oben erwähnt, dass die Methode print
+des Printable-Objekts
+mehrfach für eine einzelne Seite aufgerufen werden kann. Soll
+eine Datei ausgedruckt werden, muss das Programm bei wiederholten
+Besuchen derselben Seite in der Lage sein, an der Textstelle aufzusetzen,
+die den Anfang der Seite markiert. Wir führen dazu eine Hilfsklasse
+FilePrintHelper ein, die sich
+zu jeder besuchten Seite deren Dateioffset merkt. Diesen stellt sie
+auf Anfrage wieder zur Verfügung. Sie kann auch Auskunft darüber
+geben, ob eine Seite überhaupt schon besucht wurde.
+
+
+
+
+Die Implementierung der Klasse FilePrintHelper
+sieht so aus:
+
+
+
+
+
+
+
+
+001 /* FilePrintHelper.java */
+002
+003 import java.util.*;
+004
+005 public class FilePrintHelper
+006 {
+007 //---Membervariablen----------------------------------
+008 Vector pageinfo;
+009
+010 //---Konstruktor--------------------------------------
+011 public FilePrintHelper()
+012 {
+013 pageinfo = new Vector();
+014 }
+015
+016 //---Seitendefinition und -abfrage--------------------
+017 public void createPage(int page)
+018 {
+019 for (int i = pageinfo.size(); i <= page; ++i) {
+020 pageinfo.addElement(new Entry());
+021 }
+022 }
+023
+024 public boolean knownPage(int page)
+025 {
+026 return page < pageinfo.size();
+027 }
+028
+029 //---Verwaltung der Offsets---------------------------
+030 public long getFileOffset(int page)
+031 {
+032 Entry entry = (Entry)pageinfo.elementAt(page);
+033 return entry.fileoffset;
+034 }
+035
+036 public void setFileOffset(int page, long fileoffset)
+037 {
+038 Entry entry = (Entry)pageinfo.elementAt(page);
+039 entry.fileoffset = fileoffset;
+040 }
+041
+042 //---Lokale Klasse Entry------------------------------
+043 static class Entry
+044 {
+045 public long fileoffset;
+046
+047 public Entry()
+048 {
+049 this.fileoffset = -1;
+050 }
+051 }
+052 }
+
+ |
+
+FilePrintHelper.java |
+
+
+
+Listing 26.2: Die Klasse FilePrintHelper