|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Java (31) - základy tisku
U mnoha programů si nevystačíme jen s prohlížením dokumentu nebo nebo jiných
dat na obrazovce. Potřebujeme to vytisknout. V Javě je to překvapivě jednoduché,
tím spíš, že se stírají rozdíly mezi jednotlivými platformami, kde se jinak
k tisku přistupuje dost odlišně.
Základní pojmyNež můžeme vůbec uvažovat o nějaké implementaci tisku, je potřeba dobře vědět, jak vůbec tiskový proces vypadá. A neuškodí si před tím připomenout některé pojmy, které se v této oblasti vyskytují. Grafický kontext
Již jsme se s ním setkali, a to při kreslení. Reprezentuje ho třída Dokument
Dokument je to, co tiskneme. Data v něm obsažená se převádějí do tisknutelné
podoby, do dat určených pro tiskárnu. Pod dokumentem si v této souvislosti
můžeme představit cokoliv, třeba i nějakou komponentu GUI, pokud se nám zachce
si ji vytisknout. Zde budeme k dokumentu přistupovat přes rozhraní Stránka
Vcelku logická věc. Obvykle se tiskne na stránky, tedy listy papíru. Sice známe
cosi jako "nekonečný papír", ale i tyto tiskárny, pokud netisknou pouze řádky
textu, se stránkou jako plochou o určité velikosti pracují. Dokument se pro
tisk děli právě na stránky, z nichž se tisknou třeba pouze některé. V Javě
existuje rozhraní Tisková úloha
Každý tisk má svůj začátek a konec. Například začneme první (nebo jinou)
stránkou a skončíme poslední. Ať je to jakkoliv, jedná se o ohraničenou
záležitost, které se říká tisková úloha. Lze si to představit třeba jako
postscriptový soubor, který se sestaví, někam uloží a pak se pošle do tiskárny.
Jak je to ve skutečnosti, je záležitost systému. V programu ovšem vidíme tak,
že v podstatě vytvoříme ucelený balík dat a ať si s ním systém dělá, co chce.
Pro úlohu slouží abstraktní třída Tisková službaTisková služba je v podstatě zobecněná virtuální tiskárna. Může to být místní tiskový démon, vzdálená tisková služba, ale třeba i jen nějaký program, který převádí data do určitého výstupního formátu. Tiskové služby teď necháme ještě spát, na ty přijde čas později. Zatím je důležité pouze to, že není-li k dispozici žádná tisková služba, nelze nic tisknout. Tiskneme - nebo kreslíme?
Vrátíme-li se zpět do 25. dílu seriálu, kde se popisuje kreslení v metodě
Každá komponenta obsahuje metody
Výše řečené znamená, že je tisk v podstatě ekvivalentní s běžným zobrazováním.
Liší se jen v tom, že se pracuje s jiným grafickým kontextem. Pokud potřebujeme
jiné chování, můžeme předefinovat Tiskový dokument
Nyní potřebujeme implementovat rozhraní
"Obyčejný" grafický kontext (třída
Není pro to nutné udělat nic zvláštního, protože získaný grafický kontext je
instancí právě této třídy, takže stačí přetypování. Navíc implementuje rozhraní Transformace
Jistě se nyní můžeme ptát: jak vůbec zacházet s rozměry? Je to poměrně
jednoduché. Grafický kontext obsahuje transformační matici o velikosti 3 x 3.
Přes tuto matici se přepočítává vstupní prostor (ten, do kterého kreslíme)
na výstupní (prostor zařízení). Matici můžeme měnit podle potřeby - pokud to
neuděláme, použije se výchozí. Ta se získává z objektu grafické konfigurace
( Mnohem větší význam má, jak ta matice vlastně vypadá. Máme tři případy:
Výše popsané má samozřejmě hlubokou logiku, jak každý jistě pochopí. Pokud by to přesto někomu nevyhovovalo a chtěl by třeba místo tiskových bodů používat milimetry, cesta je snadná. Stačí prostě vytvořit novou matici (nebo lépe použít kopii té existující), příslušné koeficienty změnit a pak matici přiřadit grafickému kontextu. Ovšem pozor na to, že se s tím pak musí počítat úplně všude (třeba i u okrajů stránek)! Nejjednodušší tisk
Dost bylo řečí, jdeme tisknout. Připomínám: implementujeme rozhraní public int print(Graphics g, PageFormat pageFmt, int index) { if (index != 0) return NO_SUCH_PAGE; Graphics2D g2 = (Graphics2D) g; g2.translate(pageFmt.getImageableX(), pageFmt.getImageableY()); String s = "Tohle je text"; TextLayout tl = new TextLayout(s, g2.getFont(), g2.getFontRenderContext()); Rectangle2D rt = tl.getBounds(); g2.drawString(s, 0, (float) rt.getHeight()); return PAGE_EXISTS; } Vypadá to možná složitě, ale složité to není. První podmínka kontroluje, že jde o požadavek na tisk 1. stránky (pro ostatní vrátí, že stránka neexistuje). Pak následuje přetypování kontextu a jeho posun do oblasti tisku. Máme totiž definovány okraje a mimo ně tisknout nelze (nic by se tam nevytisklo). Posun lze samozřejmě pokaždé přičítat k souřadnicím, ale jednorázově je to lepší.
Další část se týká vykreslení textu. A tady pozor. Metoda Příklad pracuje s aktuálním písmem, tedy obvykle výchozím. Chceme-li jiné, musíme ho nastavit, a to samozřejmě ještě před výpočtem umístění. Obdobně, kdybychom třeba chtěli změnit barvu. Tisk GUIJiž dříve jsem zmínil snadný tisk komponent GUI. Nyní uvedu příklad, jak by to mohlo vypadat: JComponent c = ... RepaintManager mgr = RepaintManager.currentManager(c); boolean db = mgr.isDoubleBufferingEnabled(); mgr.setDoubleBufferingEnabled(false); c.print(g2); mgr.setDoubleBufferingEnabled(db);
Výše uvedený kód by nahradil odpovídající část v metodě Co stojí za zmínku, je dočasná deaktivace dvojitého bufferingu, pokud byl zapnutý. Při tisku je tato technika zbytečná (má za cíl zabránit blikání na obrazovce) a pokud by se použila, bude spotřebovávat paměť a čas procesoru. Směr ... tiskárnaZatím jsme ještě nic nevytiskli. Sice už víme, jak tisknout, ale ještě ne, jak vytvořit tiskovou úlohu a poslat ji na tiskárnu. Také tento úkol není vůbec těžký. Podívejme se na příklad: protected void doPrint(Printable pt) { PrinterJob pj = PrinterJob.getPrinterJob(); pj.setPrintable(pt); try { pj.print(); } catch (PrinterException e) { JOptionPane.showMessageDialog(this, "Při tisku došlo k chybě: " + e.getMessage(), "Chyba", JOptionPane.ERROR_MESSAGE); } }
Vše, co v tuto chvíli potřebujeme, je vytvořit tiskovou úlohu, předat jí
dokument a spustit tisk. Tiskne se na výchozí tiskárnu s výchozími parametry
(velikost stránky, okraje, rozlišení atd.). Všimněte si, že při tisku může
nastat výjimka, která v příkladu způsobí zobrazení panelu s chybovou zprávou.
Ještě připomenu již zmíněné rozhraní PrinterGraphics - přes něj se můžeme
dostat k instanci tiskové úlohy (metodou Změna parametrů tisku
Někdy potřebujeme před tiskem změnit některé parametry - cílovou tiskárnu,
formát stránky apod. Existují dva dialogy, které to umožňují. Prvním z nich
je hlavní tiskový dialog, dostupný přes metodu if (pj.printDialog()) pj.print();
Dialog má dvě varianty, kromě výše uvedené (nativní) ještě přenositelnou, ke
které se dostaneme příště. Pozor, metodu lze volat jen v případě, že máme
možnost dialog zobrazit (jinak metoda vyhodí Stránkovaný tiskI když byl původní příklad navržen k tisku jen jediné stránky, klidně by jich mohl tisknout víc. Protože máme index stránky a její formát, není to problém. Jenže někdy to tak jednoduché není. Stránky v sadě mohou mít různý formát a pocházet z jiného logického dokumentu. Také předem neznáme celkový počet stránek k tisku.
Proto existuje rozhraní
Teď jde o to, jak to použít. Buď si můžeme napsat vlastní implementaci, nebo
použít tu, která už existuje. A to je třída
Objekt třídy Jak získat náhled
Mnohdy se hodí mít možnost náhledu před tiskem. Ideální je generovat ho
naprosto stejnou cestou jako samotný tisk. Vytvoříme si tedy nějakou
komponentu (potomka
Pak už stačí jen implementovat rozhraní
Ještě je tu jeden faktor, který má vliv na tisk i náhled: formát stránky,
tedy instance Tiskové službyPoslední oblastí v problematice tisku jsou tiskové služby. Je to záležitost poměrně rozsáhlá, proto jí bude věnován celý příští díl. Využití tiskových služeb umožňuje postoupit o úroveň výše a nemuset se tedy zabývat tím, kterou dostupnou tiskárnu použít k tisku požadovaného dokumentu. Vrstva tiskových služeb to totiž umí vyřešit za nás. A zvládá i mnohé další věci. Ještě jedno doporučení na závěr. Budete-li experimentovat s tiskem, můžete používat pseudotiskárnu s výstupem do souboru (PostScript nebo PDF). Výsledek uvidíte hned a nemusíte plýtvat papírem.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |