Image
22.6.2016 0 Comments

Java pod lupou I. /15.časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Balík java.awt

AWT je skratka názvu Abstract Windowing Toolkit. Súbor tried združených v balíku java.awt a v jeho podbalíkoch je určený na tvorbu používateľského rozhrania a prácu s grafikou. Dnes sa skôr dáva prednosť komponentom Swing, ktoré sú univerzálnejšie, flexibilnejšie a poskytujú väčšie možnosti. Napriek tomu nie je AWT úplne odsúdený na zánik; pre jednoduchšie aplikácie postačí (a práca s ním je v určitých ohľadoch o niečo jednoduchšia). Okrem toho Swing stavia na základoch vybudovaných pomocou AWT.

Vzhľadom na rozsiahlosť celého balíka nebude jeho opis taký vyčerpávajúci ako v predchádzajúcich častiach. Niekoľko väčších príkladov nájde čitateľ ako vždy na internetových stránkach PC REVUE.

Hierarchia komponentov

Jadrom balíka java.awt je hierarchia komponentov používateľského rozhrania (ďalej len UI). Používa sa tradičný okienkový systém, niektoré komponenty môžu v sebe obsahovať ďalšie komponenty. Interakcia používateľa s komponentmi sa transformuje na udalosti (ako stlačenie klávesu, kliknutie myši a podobne). Komponenty dokážu na výskyt udalostí vhodne reagovať, štandardným spôsobom alebo na základe správania špecifikovaného programátorom.

Trieda Component

Koreňom hierarchie je abstraktná trieda Component, predstavujúca univerzálny objekt, ktorý má nejakú grafickú reprezentáciu, môže byť zobrazený na obrazovke a dokáže interagovať s používateľom. Komponenty UI sú obyčajne implementované pomocou natívnych komponentov hostiteľskej platformy, ale v prípade potreby môže programátor odvodiť vlastných potomkov triedy Component a vytvoriť tak tzv. lightweight komponenty, ktoré nie sú implementované natívnymi objektmi – je očividné, že potom treba naprogramovať úplne všetko – od zobrazovania komponentu v jeho rôznych stavoch po definovanie spôsobu interakcie s používateľom.

V triede Component nájdeme obrovské množstvo metód. Nie je možné ich tu všetky vymenovať, tak sa pozrieme aspoň na tie najdôležitejšie (zápis (get|set)*() reprezentuje dvojicu metód get*() a set*() na získanie a nastavenie hodnoty nejakého atribútu): (get|set)Name() – názov komponentu, getParent() vracia rodičovský komponent, getToolkit() vracia objekt triedy Toolkit (pozri ďalej), isVisible()/isEnabled() zisťuje, či je komponent viditeľný a prístupný, setVisible()/setEnabled() nastavuje viditeľnosť a prístupnosť komponentu, (get|set)Foreground() a (get|set)Background() – farba popredia, resp. pozadia komponentu, (get|set)Font() – font použitý v komponente, (get|set)Location() – poloha komponentu, (get|set)Size() – rozmery komponentu, getX()/getY() – súradnice ľavého horného rohu komponentu, getWidth()/getHeight() – šírka/výška komponentu, getPreferredSize()/getMinimumSize()/getMaximumSize() – predpokladaná (požadovaná), minimálna a maximálna veľkosť komponentu, getGraphics() vracia objekt typu Graphics (pozri ďalej), (get|set)Cursor() – typ kurzora priradený komponentu, paint() vykreslí komponent, update() obnoví obsah komponentu (zmaže pozadie a zavolá metódu paint()), repaint() spôsobí, že sa čo najskôr zavolá metóda update() (možno zadať, ktorá časť komponentu sa má prekresliť a za aký čas), contains() zisťuje, či komponent obsahuje zadaný bod, getComponentAt() zisťuje, či samotný komponent alebo niektorý z jeho podkomponentov obsahuje zadaný bod.

Nasledujúca séria metód pripojí ku komponentu, resp. odoberie od neho špeciálny objekt, tzv. listener, ktorý bude dostávať správy o udalostiach týkajúcich sa komponentu. Metódy majú tvar (add|remove)*Listener(), kde namiesto hviezdičky môže byť niektoré zo slov Component (udalosti týkajúce sa komponentu), Focus (získanie alebo strata fokusu), Hierarchy a HierarchyBounds (zmena hierarchie komponentov), Key a InputMethod (udalosti klávesnice), Mouse a MouseMotion (udalosti myši) a PropertyChange (zmena fontu, farby popredia alebo farby pozadia). Metóda getListeners() vracia pole všetkých listenerov pripojených ku komponentu.

Zo zvyšných metód medzi významnejšie patria ešte: requestFocus() žiada o presun vstupného fokusu na komponent, transferFocus() presúva fokus na ďalší komponent, hasFocus() zisťuje, či má komponent fokus, add()/remove() pridáva/odoberá kontextové (popup) menu ku komponentu, list() „vypíše“ obsah komponentu do zadaného výstupného prúdu (vhodné na ladenie).

Kontajnerové komponenty

Dôležitým potomkom triedy Component je trieda Container. Inštancie triedy Container dokážu fungovať ako kontajnery – môžu v sebe obsahovať iné komponenty. (Máme na mysli vizuálne „obsiahnutie“ – okno napríklad obsahuje ovládacie prvky, ako tlačidlá, textové polia a podobne.) Komponenty sú v kontajneri uložené v určitom poradí, ktoré určuje ich prípadné vzájomné prekrývanie. Usporiadanie komponentov v kontajneri zabezpečuje layout manager, čo je objekt implementujúci rozhranie LayoutManager (viac o layoutoch pozri ďalej).

Z nových metód triedy Container k významnejším patria: getComponent()/getComponents() sprístupňuje vybraný komponent (alebo všetky vo forme poľa), getInsets() vracia objekt Insets, definujúci veľkosť okrajov kontajnera, add()/remove()/removeAll() pridáva, resp. odstraňuje komponenty do/z kontajnera, (get|set)Layout() zisťuje/nastavuje layout manager pre kontajner, validate() spôsobí, že sa komponenty kontajnera znovu rozmiestnia podľa aktuálneho layoutu (vhodné napríklad po pridaní nových komponentov), (add|remove)ContainerListener() pripája/odoberá kontajnerový listener, findComponentAt() je podobná metóde getComponentAt(), ale na rozdiel od nej prehľadáva všetky dcérske komponenty.

Trieda Container nie je implementovaná natívnym komponentom, takže sa v praxi stretneme skôr s jej potomkami. Najjednoduchším je Panel, komponentový kontajner bez akejkoľvek pridanej funkčnosti. Trieda Panel sa hodí napríklad v prípade, že chceme v jednom kontajneri použiť rôzne layouty. Ďalší potomok, ScrollPane, predstavuje panel s pridanou možnosťou rolovania obsahu pomocou posuvníkov. ScrollPane smie obsahovať len jediný dcérsky komponent, ktorému poskytuje schopnosť rolovania. Z metód za zmienku stojí len dvojica (get|set)ScrollPosition(), pomocou ktorej možno pracovať s aktuálnou pozíciou dcérskeho komponentu v rámci panela.

Dôležitým kontajnerom je trieda Window, predstavujúca okno bez okrajov a bez menu. Ak chceme vytvoriť objekt triedy Window, musíme zadať jeho rodičovské okno (iný objekt typu Window alebo niektorého z odvodených typov Frame a Dialog). Podstatné metódy triedy Window: pack() zmení veľkosť okna tak, aby sa doň práve vošli všetky vnorené komponenty, show()/hide() zobrazuje/skrýva okno, dispose() okno zruší, toFront()/toBack() presúva okno do popredia/do pozadia, getOwner() vracia vlastníka okna, getOwnedWindows() vracia vlastnené okná, (add|remove)WindowListener() pridáva/odoberá „okenný“ listener.

Praktickejšími potomkami triedy Window sú dve už spomínané triedy Frame a Dialog. Trieda Frame predstavuje okno najvyššej úrovne s titulkom a okrajom. Väčšina nových metód umožňuje čítať a meniť atribúty okna: (get|set)Title() – titulok okna, (get|set)IconImage() – ikona okna, (get|set)MenuBar() – hlavné menu okna, (get|set)State() – stav okna (či je minimalizované). Statická metóda getFrames() vracia pole všetkých objektov typu Frame, ktoré práve bežiaca aplikácia dosiaľ vytvorila.

Druhá trieda Dialog reprezentuje dialógové okná, ktorým pri konštrukcii treba určiť vlastníka. Dialógové okná môžu byť modálne (kým sú zobrazené, nemožno pracovať s inými top-level oknami aplikácie) alebo nemodálne. Z metód spomenieme (is|set)Modal() na zistenie alebo nastavenie modality dialógu a (is|set)Resizable() na zistenie alebo nastavenie schopnosti meniť veľkosť dialógu. Špeciálnym potomkom triedy Dialog je trieda FileDialog, predstavujúca dialóg na výber názvu súboru. Táto trieda poskytuje metódy (get|set)Directory, (get|set)File(), (get|set)FilenameFilter() na zistenie či nastavenie názvu a cesty vybraného súboru, ako aj metódy (get|set)Mode() na špecifikovanie, či je vybraný súbor určený na čítanie alebo zápis.

Ovládacie prvky

Zostávajúci potomkovia triedy Component predstavujú klasické ovládacie prvky. Triedu Label použijeme na zobrazenie needitovateľného textu. Pri jeho konštrukcii môžeme zadať, či má byť zarovnaný na ľavý okraj, na stred alebo na pravý okraj. S textom pracujeme pomocou metód (get|set)Text(), so zarovnaním pomocou (get|set)Alignment().

Trieda Button reprezentuje tlačidlo, ktoré obsahuje voliteľný text, a ktoré možno stlačiť pomocou myši alebo klávesnice. S textom na tlačidle pracujeme pomocou metód (get|set)Label() a ohlas na stlačenie tlačidla zabezpečí príslušný listener (môže ich byť aj viac), ktorý pridávame a odoberáme metódami (add|remove)ActionListener().

Trieda Checkbox predstavuje dvojstavové zaškrtávacie pole s voliteľným textom. Tento text sprístupňuje dvojica metód (get|set)Label(), stav poľa zase dvojica metód (get|set)State(). Zmenu stavu poľa môže registrovať listener, ktorý pridávame a odoberáme metódami (add|remove)ItemListener(). Objekty Checkbox môžu byť združované do skupín, reprezentovaných objektmi triedy CheckboxGroup (pozor, nie je potomkom triedy Component!) – vtedy sa z nich stávajú prepínače (radio buttons). Pomocou metód (get|set)SelectedCheckbox() máme prístup k aktuálne zvolenému prepínaču.

Rozbaľovací (drop-down) zoznam reťazcových položiek reprezentuje trieda Choice. Položky sa do zoznamu pridávajú metódami add() a insert(), odoberajú sa pomocou remove(). Položku s daným indexom môžeme získať metódou getItem(). Index aktuálne vybranej položky vracia metóda getSelectedIndex(), vybranú položku ako reťazec získame pomocou getSelectedItem(). Metódou select() môžeme nastaviť, ktorá položka bude vybraná, a dvojica metód (add|remove)ItemListener() slúži na pridanie/odobranie listenerov.

Klasický (teda nerozbaľovací) zoznam vytvoríme pomocou triedy List. Pri konštrukcii zoznamu môžeme zadať počet zobrazených riadkov (implicitne 4), ako aj to, či je možné vybrať viac ako jednu položku (multiselect list). Metódy triedy List sú podobné metódam triedy Choice. Z nových metód spomeňme replaceItem(), pomocou ktorej môžeme zmeniť vybranú položku, getSelectedIndexes() a getSelectedItems(), ktoré vracajú indexy vybraných položiek alebo priamo položky vo forme poľa (ináč to pri multiselect zoznamoch ani nejde), deselect() na zrušenie výberu zadanej položky, isIndexSelected() na zistenie, či je položka s daným indexom vybraná.

Trieda Scrollbar predstavuje vodorovný alebo zvislý posuvník (nemýliť si s triedou ScrollPane, na ktorú sa v zásade môžeme pozerať ako na kombináciu objektu Panel a dvoch objektov typu Scrollbar). Pri konštrukcii posuvníka alebo neskôr pomocou samostatných metód môžeme zadať orientáciu, povolený rozsah hodnôt, ktoré bude ťahadlo posuvníka reprezentovať, a veľkosť prírastkov pri kliknutí na šípku alebo na plochu posuvníka. Metód je priveľa na to, aby sme ich všetky vymenovali (ide vždy o get/set dvojice), takže za všetky spomenieme iba metódu getValue(), ktorá vracia aktuálnu hodnotu, ktorú posuvník (resp. jeho ťahadlo) reprezentuje.

Ďalšia trieda TextComponent je spoločným predkom komponentov určených na editáciu textu. S textom ako celkom možno pracovať pomocou metód (get|set)Text(), metóda getSelectedText() vracia aktuálne vybranú (obyčajne inverzne zvýraznenú) časť textu. Ak chceme programovo vyznačiť úsek textu, použijeme metódu select(). Volaním setEditable() sa dá komponent „zamknúť“, metódy (set|get)CaretPosition() nastavujú/zisťujú polohu textového kurzora. K textovému komponentu môžeme pomocou (add|remove)TextListener() pripojiť/odobrať príslušný listener.

Od triedy TextComponent sú odvodené dve ďalšie triedy: TextField a TextArea. Prvá z nich predstavuje klasické jednoriadkové textové pole. Pri jeho konštrukcii môžeme zadať počiatočný obsah a šírku poľa v znakoch. Z užitočných metód pribudla predovšetkým dvojica (get|set)EchoChar(), umožňujúca nastaviť/zistiť znak, ktorý sa bude zobrazovať namiesto jednotlivých písmen textu (typicky to býva hviezdička pri textových poliach, do ktorých sa zadáva heslo). Druhá trieda, TextArea, reprezentuje viacriadkové textové editačné pole s možnosťou automatického zobrazovania posuvníkov, ak je obsah dlhší ako rozmery poľa. Pri konštrukcii môžeme zadať rozmery poľa (v riadkoch a znakoch). Pomocou metód insert() a append() môžeme text do poľa pridávať, metóda replaceRange() poskytuje možnosť nahradiť vybraný úsek textu iným reťazcom.

Poslednou komponentovou triedou je Canvas. Táto trieda slúži ako základ pre vlastné, používateľsky kreslené komponenty, ktoré na tento účel musia predefinovať metódu paint(). Pohybujeme v oblasti programovania riadeného udalosťami, nemôžeme si preto do okna kresliť, kedy sa nám zachce, ale iba vtedy, keď nám to systém dovolí. Filozofia je našťastie veľmi jednoduchá: v okamihu, keď treba komponent prekresliť, zavolá sa jeho metóda paint(). Ak ju nahradíme vlastnou verziou, máme proces kreslenia „pod palcom“.

Usporiadanie komponentov

Ako sme už spomenuli, usporiadanie komponentov v rámci kontajnerov majú na starosti zvláštne objekty, ktoré implementujú rozhranie LayoutManager. Toto rozhranie obsahuje niekoľko metód, ktoré sú volané kontajnerom (a pokiaľ nebudeme písať vlastný manažér, nemusíme sa nimi zapodievať) a má jedného potomka, rozhranie LayoutManager2, pridávajúce schopnosť rozmiestňovať komponenty na základe zadaných obmedzení.

V balíku java.awt nájdeme päť manažérov. Najjednoduchší je zrejme FlowLayout, ktorý umiestňuje komponenty do kontajnera v riadkoch zľava doprava. Keď sa komponent na riadok nezmestí, „pretečie“ do ďalšieho riadka. Pri zmene veľkosti kontajnera sa komponenty prelievajú z riadka na riadok podľa aktuálnych rozmerov. Pri konštrukcii objektu FlowLayout môžeme zadať spôsob zarovnania komponentov v rámci riadka a veľkosť medzery medzi komponentmi. Kontajnery triedy Panel majú implicitne nastavený manažér FlowLayout (zopakujme, že layout manager kontajnera sa nastavuje pomocou metódy setLayout()).

Ďalší manažér, trieda GridLayout, usporiadava komponenty do pravouhlej siete. Pri konštrukcii možno zadať počet stĺpcov a riadkov siete i rozstup komponentov. Každý komponent zaberá jednu „bunku“ siete (nejde teda o umiestňovanie na zadanú pozíciu, ako je to bežné v iných prostrediach).

Trieda BorderLayout umiestňuje komponenty do jednej z piatich oblastí, pomenovaných príznačne sever, juh, západ, východ, stred. Opätovne možno zadať veľkosť medzier medzi komponentmi.

Manažér triedy CardLayout zoradí všetky komponenty nad seba a zobrazí vždy len jeden z nich (vytvára teda akoby balíček kariet). To, ktorý komponent bude navrchu, nastavíme pomocou metód first(), last(), next(), previous() a show().

Najzložitejším a súčasne najmocnejším manažérom je GridBagLayout. Nanešťastie nemáme miesto na jeho podrobnejší opis, v skratke platí, že pre každý komponent môžeme (ba musíme) zadať množstvo obmedzení (vo forme objektu triedy GridBagConstraints). Tieto obmedzenia opisujú, kde sa komponent bude nachádzať (v rámci pomyselnej mriežky – podobne ako pri GridLayout), či bude zaberať viacero buniek mriežky, či sa zväčší tak, aby zaplnil celú oblasť, ktorú má k dispozícii, veľkosť medzier okolo komponentu, dokonca môžeme stanoviť, ktoré komponenty budú meniť svoje rozmery pri zmene veľkosti kontajnera a ktoré zostanú nemenné.

Ak potrebujeme v rámci jedného kontajnera použiť viacero layoutov, musíme skupiny komponentov umiestniť na samostatné panely s potrebnými layout manažérmi a tieto panely vložiť do kontajnera.

Práca s grafikou

Ak chceme v programe zobrazovať kreslený výstup (napríklad v prípade vlastných komponentov), celkom isto prídeme do styku s triedou Graphics. Táto abstraktná trieda predstavuje grafický kontext (podobne ako napr. vo Windows), v rámci ktorého existuje niekoľko charakteristík: komponent, do ktorého sa bude kresliť, poloha a farba pera, font použitý pri kreslení textu a podobne. Inštanciu typu Graphics pre požadovaný komponent získame volaním metódy getGraphics().

V triede Graphics nájdeme mnoho metód na zisťovanie a nastavovanie uvedených charakteristík, nastavenie orezávacieho obdĺžnika (clipping rectangle – oblasť, mimo ktorej sa prípadný grafický výstup bude ignorovať), kreslenie čiar, plných aj prázdnych obdĺžnikov, elíps, oblúkov, polygónov, textových reťazcov, obrázkov a podobne. Trieda Graphics2D, ktorá je potomkom triedy Graphics, tieto možnosti ešte rozširuje.

Pomocné triedy

Z množstva ďalších tried spomenieme Point na reprezentáciu dvojrozmerných bodov s metódami na absolútnu (move()) aj relatívnu (translate()) zmenu súradníc, triedu Color na reprezentáciu farieb v modeli RGBA (teda s podporou priehľadnosti), ktorá obsahuje aj preddefinované konštanty pre niekoľko najbežnejších farieb, jej potomka SystemColor na reprezentáciu systémových farieb, ďalej triedu Cursor na prácu s preddefinovanými typmi kurzorov, pomerne komplexnú triedu Font na reprezentáciu fontov, ktoré sú v systéme k dispozícii, spolu s triedou FontMetrics, ktorá opisuje rozmerové vlastnosti fontov, triedu Insets, ktorá sa používa na opis veľkosti okrajov kontajnera alebo komponentov umiestňovaných pomocou manažéra GridBagLayout, a triedy Rectangle a Polygon, predstavujúce obdĺžniky a polygóny, s metódami na rôzne geometrické operácie (zjednotenie, prienik, test polohy bodu voči objektu a pod).

Pokračovanie nabudúce

V balíku java.awt toho nájdeme, pochopiteľne, oveľa viac. O tom však až nabudúce.

 

 

 


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá