07.06.2015 Views

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

Untitled - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M E<br />

Udalosti súvisiace so zmenou hierarchie komponentov reprezentuje trieda Hierarchy-<br />

Event, urèená opätovne len <strong>na</strong> informaèné úèely. Udalosti oz<strong>na</strong>èenia a odz<strong>na</strong>èenia položky<br />

v objekte typu ItemSelectable (takým je <strong>na</strong>príklad trieda List) reprezentuje trieda<br />

ItemEvent. Príslušnú položku zí<strong>sk</strong>ame volaním metódy getItem(). Poslednou udalostnou<br />

triedou je TextEvent, ktorá indikuje zmenu textového obsahu v komponente.<br />

ZACHYTÁVANIE UDALOSTÍ. Ako sme hovorili minule, jednotlivé komponenty<br />

AWT generujú rôzne množiny udalostí a iným objektom po<strong>sk</strong>ytujú možnos reagova<br />

<strong>na</strong> vý<strong>sk</strong>yt týchto udalostí. Objekt, ktorý sa chce dozvedie o každom vý<strong>sk</strong>yte nejakého<br />

typu udalosti, pripojí k príslušnému komponentu tzv. listener. Sú v zásade dva spôsoby,<br />

ako vytvori listener: implementáciou príslušného „poèúvacieho“ rozhrania alebo odvodením<br />

od niektorej adaptérovej triedy.<br />

„Poèúvacích“ rozhraní je spolu pätnás a všetky sú odvodené od rozhrania Event-<br />

Listener (neobsahuje žiadne metódy, slúži len ako spoloèný predok). Nebudeme ich tu<br />

všetky menova , v zásade majú názvy korelujúce s metódami typu (add|remove)*Listener()<br />

jednotlivých komponentov. Jeden príklad za všetky: rozhranie ActionListener.<br />

Toto rozhranie musia implementova všetky listenery, ktoré majú zachytáva<br />

„akèné“ udalosti, ako <strong>na</strong>príklad kliknutie <strong>na</strong> tlaèidlo. Rozhranie tvorí jediná metóda<br />

actionPerformed(), ktorá je volaná v okamihu vý<strong>sk</strong>ytu udalosti. Parametrom metódy<br />

actionPerformed() je objekt typu ActionEvent.<br />

Treba ma <strong>na</strong> pamäti, že metóda actionPerformed() je súèas ou listenera a volá<br />

ju komponent, <strong>na</strong> ktorom k udalosti došlo. Vo všeobecnosti si každý komponent udržuje<br />

zoz<strong>na</strong>m všetkých zaregistrovaných listenerov a pri vý<strong>sk</strong>yte niektorej udalosti ich všetkých<br />

informuje zavolaním ich príslušnej metódy.<br />

Podobne vyzerajú aj ostatné „poèúvacie“ rozhrania, môžu však obsahova aj viac ako<br />

jednu metódu, <strong>na</strong> indikáciu rôznych podtypov udalostí (<strong>na</strong>príklad WindowListener<br />

obsahuje sedem metód, zodpovedajúcich siedmim podtypom udalosti WindowEvent).<br />

Urèitou nevýhodou tohto spôsobu zachytávania udalostí môže by nutnos implementova<br />

všetky metódy príslušného rozhrania, aj keï máme záujem iba o jeden podtyp udalosti.<br />

Malý príklad, ako pripoji k tlaèidlu akèný listener:<br />

import java.awt.*;<br />

import java.awt.event.*;<br />

...<br />

Button b = new Button(„OK“);<br />

b.addActionListener(new ButtonWatcher());<br />

...<br />

class ButtonWatcher implements ActionListener<br />

{<br />

void actionPerformed(ActionEvent e)<br />

{<br />

// ošetrenie udalosti<br />

}<br />

}<br />

(Dva riadky kódu, <strong>na</strong> ktorých sa vytvára nový objekt typu Button a pripája sa k nemu<br />

listener, budú, pochopite¾ne, súèas ou nejakej metódy.)<br />

Druhým spôsobom zachytávania udalostí je použitie niektorej z adaptérových tried.<br />

Ide o osem abstraktných tried, ktoré implementujú vybrané poèúvacie rozhrania. Metódy<br />

týchto tried sú implicitne prázdne. Ak od niektorej z tried odvodíme vlastný adaptér,<br />

postaèí reimplementova len tie metódy, o ktoré máme záujem (<strong>na</strong> rozdiel od poèúvacích<br />

rozhraní, kde sme povinní implementova všetky metódy). Názvy adaptérových tried<br />

sú podobné názvom poèúvacích rozhraní, len <strong>na</strong>miesto slova Listener je Adapter.<br />

Adaptérové triedy existujú len pre rozhrania s viac ako jednou metódou.<br />

Príklad použitia triedy WindowAdapter:<br />

// nech f je inštanciou Frame<br />

f.addWindowListener(new WindowWatcher());<br />

...<br />

class WindowWatcher extends WindowAdapter<br />

{<br />

void windowClosing(WindowEvent e)<br />

{<br />

// reakcia <strong>na</strong> zavretie ok<strong>na</strong><br />

}<br />

}<br />

Treba ma <strong>na</strong> pamäti, že v praxi sa <strong>na</strong>miesto samostatných tried (ako sú Button-<br />

Watcher a WindowWatcher v <strong>na</strong>šich príkladoch) èastejšie používajú triedy vnorené<br />

alebo dokonca anonymné, takže sa stretneme <strong>na</strong>príklad so zápisom:<br />

f.addWindowListener(new WindowAdapter<br />

{<br />

void windowClosing(WindowEvent e)<br />

{<br />

// reakcia <strong>na</strong> zavretie ok<strong>na</strong><br />

}<br />

});<br />

K anonymným triedam sa však dostaneme až ne<strong>sk</strong>ôr.<br />

PRÁCA S OBRÁZKAMI. Ïalší podbalík java.awt.image po<strong>sk</strong>ytuje triedy urèené<br />

<strong>na</strong> vytváranie a úpravu obrázkov. Ako abstraktná reprezentácia grafického obrázka<br />

slúži trieda Image (ktorá patrí do java.awt). Z dôležitých metód spomeòme getWidth()<br />

a getHeight() <strong>na</strong> zistenie rozmerov obrázka a getSource() <strong>na</strong> zí<strong>sk</strong>anie objektu,<br />

ktorý má <strong>na</strong> starosti vygenerovanie jednotlivých pixelov obrázka.<br />

Na zaèiatku èlánku sme spomenuli triedu Toolkit, ktorá po<strong>sk</strong>ytuje nieko¾ko metód<br />

<strong>na</strong> vytvorenie a prácu s obrázkami. V balíku java.awt.image sa <strong>na</strong>chádzajú triedy<br />

urèené pre komplexnejšie operácie. Práca s obrázkami je postavená <strong>na</strong> prúdovom modeli,<br />

ktorý zahàòa „producenta“ obrázka (implementuje rozhranie ImageProducer), volite¾né<br />

filtre a „spotrebite¾a“ obrázka (implementuje rozhranie ImageConsumer).<br />

Základom obrázkových filtrov je trieda ImageFilter, ktorá sa sama osebe javí ako<br />

spotrebite¾ obrázka. Táto trieda predstavuje prázdny filter a slúži len ako bázová implementácia.<br />

Praktickejšia je trieda CropImageFilter, ktorá dokáže pôvodný obrázok<br />

oreza <strong>na</strong> požadovanú ve¾kos . Na jednoduchú zmenu rozmerov obrázka možno použi<br />

triedu ReplicateScaleFilter, ktorá používa <strong>na</strong>jjednoduchší možný algoritmus: opakuje<br />

riadky (pri zväèšovaní obrázka) alebo ich vynecháva (pri zmenšovaní). O nieèo lepšie<br />

výsledky dáva trieda AreaAveragingScaleFilter, ktorá pri zmene rozmerov poèíta<br />

priemerné hodnoty pixelov. Najzaujímavejšia je však abstraktná trieda RGBImageFilter,<br />

ktorá umožòuje filtrova obrázky <strong>na</strong> základe zložiek RGB jednotlivých pixelov. Vzh¾adom<br />

<strong>na</strong> jej abstraktnos je jasné, že konkrétny filter treba <strong>na</strong>programova reimplementáciou<br />

príslušných metód.<br />

Na prepojenie producenta obrázka a niektorého z filtrov použijeme triedu Filtered-<br />

ImageSource. Tá sa sama tvári ako producent, takže v prípade nutnosti použi viacero filtrov<br />

staèí triedy vhodne zre azi rov<strong>na</strong>kým spôsobom ako pri filtroch údajových prúdov.<br />

Ostatné triedy spomeòme len struène: ColorModel je abstraktná trieda <strong>na</strong> reprezentáciu<br />

farebných modelov. Jej konkrétne implementácie tvoria triedy ComponentColor-<br />

Model (zložkový model, jednotlivé farebné zložky sú samostatnými údajmi), IndexColorModel<br />

(paletový systém, jednotlivé farby sú indexmi do zadanej farebnej palety) a<br />

DirectColorModel, ktorá je odvodená cez medzipotomka PackedColorModel (opä<br />

zložkový model, jednotlivé zložky sú však <strong>sk</strong>ombinované do jedného údaja – <strong>na</strong>príklad<br />

model RGB565 v 16-bitových farebných režimoch).<br />

Na reprezentáciu pixelového rastra slúži trieda Raster. Nad rastrami možno vykonáva<br />

rôzne operácie, ako afinné transformácie, konvolúcie a podobne. Údaje rastra sú<br />

uložené v objekte typu DataBuffer.<br />

ÏALŠIE PODBALÍKY. V balíku java.awt možno nájs nieko¾ko ïalších podbalíkov,<br />

ale s oh¾adom <strong>na</strong> rozsah èlánku sa im nebudeme podrobnejšie venova . Takže len<br />

informatívne: balík java.awt.color obsahuje triedy <strong>na</strong> prácu s farebnými profilmi ICC.<br />

Balík java.awt.datatransfer po<strong>sk</strong>ytuje rozhrania a triedy <strong>na</strong> výmenu dát medzi aplikáciami<br />

(pomocou schránky – clipboardu). V balíku java.awt.dnd sa <strong>na</strong>chádzajú triedy<br />

potrebné <strong>na</strong> implementáciu mechanizmu drag-and-drop. Ïalší balík java.awt.font<br />

v súlade so svojím názvom po<strong>sk</strong>ytuje triedy a rozhrania <strong>na</strong> prácu s písmami a ich opisnými<br />

súbormi (fontami). Balík java.awt.geom obsahuje množstvo tried <strong>na</strong> prácu s<br />

dvojrozmernou grafikou. Balíky java.awt.im a java.awt.im.spi umožòujú zápis<br />

netradièných z<strong>na</strong>kov (typicky japon<strong>sk</strong>ých, èín<strong>sk</strong>ych èi kórej<strong>sk</strong>ých) pomocou tzv. vstupných<br />

metód. No a koneène v poslednom balíku java.awt.print nájdeme rozhrania a triedy<br />

<strong>na</strong> prácu s tlaèiaròou.<br />

PRI GRAFIKE ZOSTANEME. Java 2 obsahuje okrem AWT ešte jeden grafický<br />

rámec s poetickým názvom Swing. Ten je o nieèo bohatší a prispôsobite¾nejší. Viac si o<br />

òom povieme v budúcom pokraèovaní.<br />

Vladimír Klimov<strong>sk</strong>ý<br />

148 PC REVUE 12/2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!