Gengivelsesmodeller
Der er to udskrivningsmodeller i Java: Printbar
job og Sidelig
job.
Printables
Printbar
job er den enkleste af de to udskrivningsmodeller. Denne model bruger kun en PagePainter
for hele dokumentet. Sider gengives i rækkefølge, begyndende med side nul. Når den sidste side udskrives, vil din PagePainter
skal returnere NO_SUCH_PAGE
værdi. Undersystemet Print vil altid bede om, at applikationen gengiver siderne i rækkefølge. For eksempel, hvis din applikation bliver bedt om at gengive siderne fem til syv, beder udskriftsundersystemet om alle sider op til den syvende side, men udskriver kun siderne fem, seks og syv. Hvis din applikation viser en udskrivningsdialogboks, vises det samlede antal sider, der skal udskrives, ikke, da det er umuligt at vide på forhånd antallet af sider i dokumentet ved hjælp af denne model.
Sider
Sidelig
job giver mere fleksibilitet end Printbar
job, som hver side i en Sidelig
job kan have et andet layout. Sidelig
job bruges oftest med Bestil
s, en samling sider, der kan have forskellige formater. Jeg vil forklare Bestil
klasse på et øjeblik.
EN Sidelig
job har følgende egenskaber:
- Hver side kan have sin egen maler. For eksempel kan du få en maler implementeret til at udskrive forsiden, en anden maler til at udskrive indholdsfortegnelsen og en tredje til at udskrive hele dokumentet.
- Du kan indstille et andet sideformat for hver side i bogen. I en
Sidelig
job, kan du blande sider i stående og liggende format. - Udskrivningssystemet beder muligvis din applikation om at udskrive sider uden for rækkefølge, og nogle sider springes muligvis over, hvis det er nødvendigt. Igen behøver du ikke bekymre dig om dette, så længe du kan levere en hvilken som helst side i dit dokument efter behov.
- Det
Sidelig
job behøver ikke at vide, hvor mange sider der er i dokumentet.
Bøger
Også nyt, da version 1.2 er Bestil
klasse. Denne klasse giver dig mulighed for at oprette dokumenter på flere sider. Hver side kan have sit eget format og sin egen maler, hvilket giver dig fleksibiliteten til at oprette sofistikerede dokumenter. Siden Bestil
klasse implementerer Sidelig
interface, kan du implementere din egen Bestil
klasse, når den leveres Bestil
klasse mangler de funktioner, du har brug for.
EN Bestil
klasse repræsenterer en samling af sider. Ved første oprettelse blev Bestil
objektet er tomt. For at tilføje sider skal du blot bruge en af de to Tilføj()
metoder (se min forklaring på denne klasse i API-sektionen for flere detaljer). Denne metodes parametre er Sideformat
objekt, der definerer de fysiske egenskaber på siden, og a PagePainter
objekt, der implementerer Printbar
interface. Hvis du ikke kender antallet af sider i dit dokument, skal du blot sende UNKNOWN_NUMBER_OF_PAGES
værdi til Tilføj()
metode. Printersystemet finder automatisk antallet af sider ved at kalde alle sidemalerne i bogen, indtil den modtager en NO_SUCH_PAGE
værdi.
API-definition
Teori og praksis mødes i dette afsnit. I de foregående sektioner lærte vi om sidestruktur, måleenheder og gengivelsesmodeller. I dette afsnit vil vi se på Java-udskrivnings-API.
Alle de klasser, der kræves for at udskrive, findes i java.awt.print
pakke, der består af tre grænseflader og fire klasser. Følgende tabeller definerer klasser og grænseflader for udskrivningspakken.
Navn | Type | Beskrivelse |
Papir | Klasse | Denne klasse definerer sidens fysiske egenskaber. |
Sideformat | Klasse | Sideformat definerer sidens størrelse og retning. Den definerer også hvilken Papir til brug ved gengivelse af en side. |
PrinterJob | Klasse | Denne klasse administrerer udskriftsjobbet. Dets ansvar omfatter oprettelse af et udskriftsjob, visning af en udskrivningsdialogboks, når det er nødvendigt, og udskrivning af dokumentet. |
Bestil | Klasse |
|
Sidelig | Interface | EN Sidelig implementering repræsenterer et sæt sider, der skal udskrives. Det Sidelig objekt returnerer det samlede antal sider i sættet såvel som Sideformat og Printbar for en bestemt side. Det Bestil klasse implementerer denne grænseflade. |
Printbar | Interface | En sidemaler skal implementere Printbar interface. Der er kun en metode i denne grænseflade, Print() . |
PrinterGrafik | Interface | Det Grafik objekt implementerer denne grænseflade. PrinterGrafik giver den getPrinterJob () metode til at opnå det printerjob, der instantierede udskrivningsprocessen. |
Sidet interface
Det Sidelig
interface inkluderer tre metoder:
Metodenavn | Beskrivelse |
int getNumberOfPages () | Returnerer antallet af sider i dokumentet. |
PageFormat getPageFormat (int pageIndex) | Returnerer siderne Sideformat som specificeret af pageIndex . |
Printbar getPrintable (int pageIndex) | Returnerer Printbar instans ansvarlig for gengivelse af den side, der er angivet af pageIndex . |
Printbar grænseflade
Det Printbar
interface har en metode og to værdier:
Navn | Type | Beskrivelse |
int print (Grafik grafik, PageFormat sideFormat, int pageIndex) | Metode | Anmoder om, at grafikken håndteres ved hjælp af det givne sideformat, gengiver den angivne side. |
NO_SUCH_PAGE | Værdi | Dette er en konstant. Returner denne værdi for at angive, at der ikke er flere sider at udskrive. |
PAGE_EXISTS | Værdi | Det Print() metoden vender tilbage PAGE_EXISTS . Det indikerer, at siden blev sendt som en parameter til Print() er gengivet og eksisterer. |
Hver sidemaler skal implementere Printbar
interface. Da der kun er én metode at implementere, kan det være let at oprette sidemalere. Husk dog, at din kode skal kunne gengive en hvilken som helst side i eller uden for rækkefølgen.
Der er tre parametre til Print()
, inklusive Grafik
, som er den samme klasse, der bruges til at tegne på skærmen. Siden Grafik
klasse implementerer PrinterGrafisk
interface, kan du få PrinterJob
der instantierede dette udskriftsjob. Hvis dit sidelayout er komplekst og kræver nogle avancerede tegningsfunktioner, kan du caste Grafik
parameter til en Grafik2D
objekt. Du får derefter adgang til den fulde Java 2D API.
Inden du begynder at bruge Grafik
objekt, bemærk at koordinaterne ikke oversættes til det øverste venstre hjørne af det udskrivbare område. Se figur 3 for at finde placeringen af standardoprindelsen.
(0, 0) vises i øverste venstre hjørne af printermargenerne. Hvis du vil udskrive et 1-til-1-tommers rektangel, 1 tommer fra både øverste og venstre margen, bruger du følgende kode:
1: offentlig int-udskrivning (Grafikgrafik, PageFormat-sideFormat, int-sideIndex) {2: Grafik2D-grafik2D = (Grafik2D) -grafik; 3: Rektangel2D.Dobbelt rektangel = ny Rektangel2D.Dobbelt (); 4: rectangle.setRect (pageFormat.getImageableX () + 72, 5: pageFormat.getImageableY () + 72, 6: 72, 7: 72); 8: graphics2D.draw (rektangel); 9: returnere (PAGE_EXISTS); }
Fra det foregående eksempel ser vi, at vi manuelt skal oversætte oprindelsen af rektanglet, så det udskrives øverst i det udskrivbare område som i figur 1. For at forenkle koden kunne vi oversætte koordinaterne en gang og bruge (0, 0 ) som oprindelsen til det udskrivbare område. Ved at ændre det foregående eksempel får vi:
1: offentlig int-udskrivning (Grafikgrafik, PageFormat-sideFormat, int-sideIndex) {2: Grafik2D-grafik2D = (Grafik2D) -grafik; 3: graphics2D.translate (pageFormat.getImageableX (), pageFormat.getImageableY ()); 4: Rektangel2D.Dobbelt rektangel = ny Rektangel2D.Dobbelt (); 5: rectangle.setRect (72, 72, 72, 72); 6: graphics2D.draw (rektangel); 7: returner (PAGE_EXISTS); 8:}
Bruger Oversætte()
metode i linje 3, kan vi oversætte koordinaterne og indstille vores oprindelse (0, 0) øverst i det udskrivbare område. Fra dette tidspunkt bliver vores kode forenklet.
PrinterGraphics-grænseflade
Det PrinterGrafik
interface består af en metode:
Metodenavn | Beskrivelse |
PrinterJob getPrinterJob () | Returnerer PrinterJob for denne gengivelsesanmodning og implementeres af Grafik klasse |
Papir klasse
Otte metoder udgør Papir
klasse:
Metodenavn | Beskrivelse |
dobbelt getHeight () | Denne metode returnerer sidens fysiske højde i point (1 tomme = 72 point). For eksempel, hvis du udskriver på en side i Letter-størrelse, vil returværdien være 792 point eller 11 inches. |
dobbelt getImageableHøjde () | Denne metode returnerer sidens billedhøjde. Den forestillbare højde er højden på det udskrivningsområde, du kan trække på. Se figur 1 for en grafisk afbildning af det forestillbare område. |
dobbelt getImageableWidth () | Denne metode returnerer en sides imagebredde (bredden på det udskrivningsområde, som du kan trække på). Se figur 1 for en grafisk afbildning af det forestillbare område. |
dobbelt getImageableX () | Denne metode returnerer x-oprindelsen til det forestillbare område. Da der ikke er nogen understøttelse af margener, repræsenterer returværdien venstre margen. |
dobbelt getImageableY () | Denne metode returnerer y-oprindelsen for det forestillbare område. Værdien, der returneres fra denne metode, svarer til topmargenen. |
dobbelt getWidth () | Denne metode returnerer sidens fysiske bredde i point. Hvis du udskriver på papir i Letter-størrelse, er bredden 8,5 inches eller 612 point. |
void setImageableArea (dobbelt x, dobbelt y, dobbelt bredde, dobbelt højde) | Denne metode indstiller det forestillbare område og specificerer marginerne på siden. Faktisk giver API'en ingen metode til at indstille margenerne eksplicit. du skal selv beregne dem. |
void setSize (dobbelt bredde, dobbelt højde) | Denne metode indstiller den fysiske sidestørrelse. For at definere et 8,5 x 11 tommer ark leverer du 612 og 792 point. Bemærk, at standardstørrelsen er BREV . |
Inden vi går videre til næste afsnit, skal du huske, at Papir
klasse definerer sidens fysiske egenskaber. Det Sideformat
klasse repræsenterer alle sidens egenskaber, såsom sideretning, størrelse og papirtype. Denne klasse sendes altid som en parameter til Printbar
grænseflader Print()
metode. Brug Papir
for at opnå den forestillbare områdes placering, størrelse og sideorientering sammen med en transformationsmatrix.
PageFormat klasse
Det Sideformat
består af 12 metoder:
Metodenavn | Beskrivelse |
dobbelt getHeight () | Denne metode returnerer sidens fysiske højde i point (1 tomme = 72 point). Hvis din side måler 8,5 x 11 tommer, vil returværdien være 792 point eller 11 tommer. |
dobbelt getImageableHøjde () | Denne metode returnerer sidens billedhøjde, som er højden på det udskrivningsområde, som du kan tegne. Se figur 1 for en grafisk afbildning af det forestillbare område. |
dobbelt getImageableWidth () | Denne metode returnerer sidens forestillbare bredde - bredden på det udskrivningsområde, som du kan tegne. Figur 1 illustrerer et grafisk billede af det forestillbare område. |
dobbelt getImageableX () | Denne metode returnerer x-oprindelsen til det forestillbare område. |
dobbelt getImageableY () | Denne metode returnerer det tænkelige områdes y-oprindelse. |
dobbelt getWidth () | Denne metode returnerer sidens fysiske bredde i point. Hvis du udskriver på papir i Letter-størrelse, er bredden 812 tommer eller 612 point. |
dobbelt getHeight () | Denne metode returnerer sidens fysiske højde i point. For eksempel er papir i Letter-størrelse 11 inches i højden eller 792 point. |
dobbelt [] getMatrix () | Denne metode returnerer en transformationsmatrix, der oversætter brugerplads til den ønskede sideorientering. Returneringsværdien er i det format, der kræves af AffineTransform konstruktør. |
int getOrientation () | Denne metode returnerer retningen af siden som en af disse PORTRET eller LANDSKAB . |
ugyldigt sæt Orientering (int-retning) | Denne metode indstiller retningen på siden ved hjælp af konstanterne PORTRET og LANDSKAB . |
Papir getPaper () | Denne metode returnerer Papir objekt tilknyttet sideformatet. Se det foregående afsnit for en beskrivelse af Papir klasse. |
ugyldigt sæt Papir (papir) | Denne metode indstiller Papir objekt, der vil blive brugt af Sideformat klasse. Sideformat skal have adgang til de fysiske sidekarakteristikker for at udføre denne opgave. |
Dette afslutter beskrivelsen af sideklasser. Den næste klasse, som vi skal studere, er PrinterJob
.
PrinterJob-klasse
Det PrinterJob
klasse styrer udskrivningsprocessen. Det kan både starte og styre et udskriftsjob. Nedenfor finder du en definition af klassen:
Metodenavn | Beskrivelse |
abstrakt ugyldigt annullere () | Denne metode annullerer det aktuelle udskriftsjob. Du kan validere annulleringen med isCancel () metode. |
abstrakt boolsk isCancelled () | Denne metode returnerer sand, hvis jobbet annulleres. |
PageFormat defaultPage () | Denne metode returnerer standardsideformatet for PrinterJob . |
abstrakt PageFormat defaultPage (PageFormat side) | Denne metode kloner Sideformat videregivet i parametre og ændrer klonen for at oprette standard Sideformat . |
abstrakt int getCopies () | Denne metode returnerer antallet af kopier, som udskriftsjobbet udskriver. |
abstrakt ugyldigt sætKopier (int kopier) | Denne metode indstiller antallet af kopier, jobbet udskrives på. Bemærk, at hvis du viser en udskrivningsdialogboks, kan brugerne ændre antallet af kopier (se sideDialog metode). |
abstrakt streng getJobName () | Denne metode returnerer jobnavnet. |
statisk PrinterJob getPrinterJob () | Denne metode opretter og returnerer en ny PrinterJob . |
abstrakt streng getUserName () | Denne metode returnerer det brugernavn, der er knyttet til udskriftsjobbet. |
abstrakt SideFormat-sideDialog (SideFormat-side) | Denne metode viser en dialog, der giver brugeren mulighed for at ændre Sideformat . Det Sideformat , videregivet i parametre, indstiller felterne i dialogen. Hvis brugeren annullerer dialogen, så er originalen Sideformat vil blive returneret. Men hvis brugeren accepterer parametrene, så en ny Sideformat vil blive oprettet og returneret. Da det ikke viser de samme parametre på alle operativsystemer, skal du være forsigtig, når du bruger sideDialog . |
abstrakt ugyldigt sæt Pageable (Pageable document) | Denne metode spørger dokumentet for at få det samlede antal sider. Det Sidelig vil også returnere Sideformat og Printbar objekt for hver side. Se definitionen af Sidelig interface for mere information. |
abstrakt ugyldigt sæt Printbart (malbar til udskrivning) | Denne metode indstiller Maler objekt, der gengiver siderne, der skal udskrives. EN Maler objekt er et objekt, der implementerer Printbar klasse og dens Print() metode. |
abstrakt ugyldigt sæt Printbart (malbar til udskrivning, PageFormat-format) | Denne metode udfører de samme opgaver som abstrakt ugyldigt sæt Printbart (malbar til udskrivning) , bortset fra at du leverer Sideformat at den Maler vil bruge. Som angivet i definitionen af Printbar interface, den Print() metoden passerer en Sideformat objekt som den første parameter. |
abstrakt ugyldigt tryk () | Denne metode udskriver dokumentet. Det kalder faktisk Print() metode til Maler tidligere tildelt dette udskriftsjob. |
abstrakt ugyldigt sætJobName (streng jobnavn) | Denne metode indstiller navnet på udskriftsjobbet. |
abstrakt boolesk print Dialog () | Denne metode viser en udskrivningsdialogboks, der giver brugeren mulighed for at ændre udskriftsparametrene. Bemærk, at resultatet af denne interaktion ikke returneres til dit program. I stedet overføres det til peer-operativsystemet. |
abstrakt PageFormat validatePage (PageFormat side) | Denne metode validerer Sideformat videregivet i parametre. Hvis printeren ikke kan bruge Sideformat som du leverede, så returneres en ny, der passer til printeren. |
Bogklasse
Syv metoder udgør Bestil
klasse:
>
Metodenavn | Beskrivelse |
ugyldig tilføjelse (udskrivbar maler, PageFormat-side) | Denne metode føjer en side til Bestil . Det maler og Sideformat for den side sendes i parametre. |
ugyldig tilføjelse (udskrivbar maler, PageFormat-side, int numPages) | Denne metode udfører de samme opgaver som ugyldig tilføjelse (udskrivbar maler, PageFormat-side) , bortset fra at du angiver antallet af sider. |
int getNumberOfPages () | Denne metode returnerer antallet af sider, der aktuelt er i Bestil . |
PageFormat getPageFormat (int pageIndex) | Denne metode returnerer Sideformat objekt for en given side. |
Printbar getPrintable (int pageIndex) | Denne metode returnerer maler for en given side. |
void setPage (int pageIndex, malbar til udskrivning, PageFormat-side) | Denne metode indstiller maler og Sideformat for en given side, der allerede er i bogen. |
Udskrivningsopskriften
Opskriften til udskrivning er meget enkel. Opret først en PrinterJob
objekt:
PrinterJob printJob = PrinterJob.getPrinterJob ();
Brug derefter setPrintable ()
metode til PrinterJob
, tildele Maler
modsætter sig PrinterJob
. Bemærk, at en Maler
objekt er et, der implementerer Printbar
interface.
printJob.setPrintable (Maler);
Eller du kan indstille Sideformat
sammen med Maler
:
printJob.setPrintable (Maler, sideFormat);
Endelig blev Maler
objektet skal implementere Print()
metode:
public int print (Grafik g, PageFormat sideFormat, int side)
Her er den første parameter det grafiske håndtag, som du vil bruge til at gengive siden, den sideFormat
er det format, der skal bruges til den aktuelle side, og den sidste parameter er det sidetal, der skal gengives.
Det er alt der er til det - til simpel udskrivning, altså.
Introduktion til rammen
Udskrivningsrammen, som vi bygger i denne serie, vil være helt uafhængig af Java-udskrivnings-API'en. Det giver mulighed for større fleksibilitet i produktionen af forskellige output.Dens struktur giver dig mulighed for at oprette dokumenter, sider og udskrive objekter. Du vil være i stand til at tilføje udskriftsobjekter til en side, mens du føjer sider til et dokument. Ved at bruge denne struktur vil du være i stand til nemt at implementere eksportfunktioner til PDF- eller HTML-filer eller udskrive direkte til printeren ved hjælp af udskrivnings-API. Men det primære mål med rammen er at forenkle oprettelsen af trykte dokumenter. Når du udskriver ved hjælp af udskrivnings-API'et, ender du kun med et grafisk lærred at tegne på. Det adresserer ikke begreberne afsnit, billeder, tegninger, grafik, tabeller eller løbende sidehoveder og sidefødder. Fordi du skal beregne oprindelsen (x, y), bredden og højden af det udskrivbare område, er indstillingsmargener en opgave. Vores printrammer vil løse alle disse svagheder.
Konklusion
Vi dækkede meget grund i denne første del. Vi kiggede på måleenheder, sidens struktur, de to gengivelsesmodeller (Sidelig
og Printbar
), og Bøger
, og vi afsluttede med en detaljeret forklaring af udskrivnings-API'et. Næste måned vil vi primært fokusere på kode, da vi vil omsætte alt i praksis. Vi vil også se på de problemer, der opstår, når der udskrives på flere platforme. Ser jeg frem til del 3, vil jeg forklare detaljeret designet og implementeringen af rammen.
Lær mere om dette emne
- "Udskrivning i Java", Jean-Pierre Dubé (JavaWorld)
- Del 1: Bekend dig med Java-udskrivningsmodellen (20. oktober 2000)
- Del 2: Udskriv din første side og gengiv komplekse dokumenter (1. december 2000)
- Del 3: Jean-Pierre Dubé introducerer printrammerne, der fungerer oven på Java Print API (5. januar 2001)
- Del 4: Kod udskriftsrammen
- (2. februar 2001)
- Del 5: Opdag udskriftsrammernes supportklasser
- (2. marts 2001)
- Du vil finde masser af bøger, der dækker Java AWT, men ingen vil dække dette emne i denne bogs omfang. Hvis du skriver GUI'er, skal du have denne bog ved siden af din computer: Grafisk Java 2, Mastering The JFCAWT, bind 1, David M. Geary (Prentice Hall, 1998)
//www.amazon.com/exec/obidos/ASIN/0130796662/javaworld
- Denne bog var nyttig, da Java 1.1 kom ud og var den første til at tale om udskrivning i Java: Migrering fra Java 1.0 til Java 1.1, Daniel I. Joshi og Pavel A. Vorobiev (Ventana Communications Group, 1997)
//www.amazon.com/exec/obidos/ASIN/1566046866/javaworld
- Sandsynligvis den bedste bog på Java 2D, denne bog dækker alle aspekter af 2D API og giver også en
Grafik
ramme for avancerede 2D-kompositioner: Java 2D API-grafik, Vincent J. Hardy (Prentice Hall, 1999)//www.amazon.com/exec/obidos/ASIN/0130142662/javaworld
- En glimrende introduktion til Java 2D API "Kom godt i gang med Java 2D", Bill Day (JavaWorld, Juli 1998)
//www.javaworld.com/javaworld/jw-07-1998/jw-07-media.html
Denne historie, "Printing in Java, Part 1" blev oprindeligt udgivet af JavaWorld.