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
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