Programovanie

Úvod do AWT

Knižnica tried programovacieho jazyka Java poskytuje súpravu nástrojov používateľského rozhrania s názvom Abstract Windowing Toolkit alebo AWT. AWT je výkonný a flexibilný. Nováčikovia však často zisťujú, že jeho sila je zahalená. Popisy tried a metód, ktoré sa nachádzajú v distribuovanej dokumentácii, poskytujú novému programátorovi len malý návod. Dostupné príklady navyše často nechávajú veľa dôležitých otázok nezodpovedaných. Samozrejme, nováčikovia by mali očakávať určité ťažkosti. Efektívne grafické používateľské rozhrania sú vo svojej podstate náročné na návrh a implementáciu a niekedy komplikované interakcie medzi triedami v AWT túto úlohu iba komplikujú. Avšak so správnym vedením je vytvorenie grafického používateľského rozhrania pomocou AWT nielen možné, ale aj pomerne jednoduché.

Tento článok sa venuje niektorej z filozofií AWT a venuje sa praktickým záujmom, ako vytvoriť jednoduché užívateľské rozhranie pre applet alebo aplikáciu.

Čo je používateľské rozhranie

Užívateľské rozhranie je tá časť programu, ktorá interaguje s používateľom programu. Užívateľské rozhrania majú mnoho podôb. Tieto formy majú zložitosť, od jednoduchých rozhraní príkazového riadku až po grafické používateľské rozhrania typu point-and-click poskytované mnohými modernými aplikáciami.

Na najnižšej úrovni operačný systém prenáša informácie z myši a klávesnice do programu ako vstup a poskytuje pixely pre výstup programu. AWT bol navrhnutý tak, aby si programátori nemuseli robiť starosti s podrobnosťami sledovania myši alebo čítania klávesnice, ani sa nezaoberali podrobnosťami zápisu na obrazovku. AWT poskytuje dobre navrhnuté objektovo orientované rozhranie pre tieto služby a zdroje na nízkej úrovni.

Pretože programovací jazyk Java je nezávislý na platforme, musí byť AWT tiež nezávislý na platforme. Program AWT bol navrhnutý tak, aby poskytoval spoločnú sadu nástrojov na návrh grafického používateľského rozhrania, ktoré fungujú na rôznych platformách. Prvky používateľského rozhrania poskytované AWT sa implementujú pomocou natívneho súboru nástrojov GUI každej platformy, čím sa zachováva vzhľad a dojem z každej platformy. Toto je jedna z najsilnejších stránok AWT. Nevýhodou takéhoto prístupu je skutočnosť, že grafické používateľské rozhranie navrhnuté na jednej platforme môže vyzerať inak, keď sa zobrazuje na inej platforme.

Súčasti a kontajnery

Grafické užívateľské rozhranie je zostavené z grafických prvkov nazývaných komponenty. Medzi typické komponenty patria napríklad tlačidlá, posúvače a textové polia. Komponenty umožňujú používateľovi interagovať s programom a poskytujú mu vizuálnu spätnú väzbu o stave programu. V AWT sú všetky komponenty používateľského rozhrania inštanciami triedy Component alebo jedného z jej podtypov.

Komponenty nestoja samostatne, ale nachádzajú sa skôr v kontajneroch. Kontajnery obsahujú a riadia rozloženie komponentov. Kontajnery sú samy osebe komponentmi, a preto ich možno umiestniť do iných kontajnerov. V AWT sú všetky kontajnery inštanciami triedy Container alebo jedného z jej podtypov.

Priestorovo musia komponenty úplne zapadnúť do nádoby, ktorá ich obsahuje. Toto vnorenie komponentov (vrátane kontajnerov) do kontajnerov vytvorí strom prvkov, počnúc kontajnerom v koreňoch stromu a rozširujúcim sa až po listy, čo sú komponenty, ako sú tlačidlá.

Obrázok na obrázku 1 zobrazuje jednoduché grafické používateľské rozhranie, aké by vyzeralo pri zobrazení vo Windows 95. Obrázok 2 zobrazuje komponenty rozhrania z obrázka 1 usporiadané ako strom.

Typy komponentov

Obrázok 3 zobrazuje dedičný vzťah medzi triedami komponentov používateľského rozhrania poskytovanými AWT. Komponent triedy definuje rozhranie, ktorého sa musia všetky komponenty držať.

AWT poskytuje deväť základných tried iných ako kontajnerových komponentov, z ktorých možno vytvoriť užívateľské rozhranie. (Nové triedy komponentov môžu byť samozrejme odvodené od ktorejkoľvek z týchto tried alebo od samotného komponentu triedy.) Týchto deväť tried je trieda Button, Canvas, Checkbox, Choice, Label, List, Scrollbar, TextArea a TextField. Obrázok 4 zobrazuje inštanciu každej triedy.

Na prezeranie tohto appletu potrebujete prehliadač s podporou Java.

Obrázok 4.

Deväť komponentov používateľského rozhrania

Zdroj tohto displeja sa nachádza tu.

Druhy kontajnerov

AWT poskytuje štyri triedy kontajnerov. Sú to trieda Window a jej dva podtypy - trieda Frame a trieda Dialog - a tiež trieda Panel. Okrem kontajnerov poskytovaných AWT je triedou Applet aj kontajner - ide o podtyp triedy Panel, a preto môže obsahovať komponenty. Stručný popis každej triedy kontajnerov poskytovaných AWT je uvedený nižšie.

OknoPlocha displeja najvyššej úrovne (okno). Inštancia triedy Window nie je pripojená ani vložená do iného kontajnera. Inštancia triedy Window nemá žiadne orámovanie ani názov.
RámPlocha displeja najvyššej úrovne (okno) s okrajom a nadpisom. Inštancia triedy Frame môže mať panel s ponukami. Inak sa veľmi podobá inštancii triedy Window.
DialógPlocha displeja najvyššej úrovne (okno) s okrajom a nadpisom. Inštancia triedy Dialog nemôže existovať bez pridruženej inštancie triedy Frame.
Panel

Všeobecný kontajner na uchytenie komponentov. Inštancia triedy Panel poskytuje kontajner, do ktorého sa dajú pridať komponenty.

Vytvorenie kontajnera

Pred pridaním komponentov, ktoré tvoria užívateľské rozhranie, musí programátor vytvoriť kontajner. Pri vytváraní aplikácie musí programátor najskôr vytvoriť inštanciu triedy Window alebo triedy Frame. Pri vytváraní appletu už rám (okno prehliadača) existuje. Pretože trieda Applet je podtypom triedy Panel, programátor môže pridať komponenty do inštancie samotnej triedy Applet.

Kód v zozname 1 vytvára prázdny rámček. Názov rámca („Príklad 1“) sa nastavuje vo výzve konštruktoru. Rám je spočiatku neviditeľný a musí sa zviditeľniť vyvolaním jeho rámu šou() metóda.

import java.awt. *;

verejná trieda Príklad1 {verejné statické void main (String [] args) {Rám f = nový Rám ("Príklad 1");

f.show (); }}

Zoznam 1.

Prázdny rám

Kód v zozname 2 rozširuje kód z výpisu 1 tak, aby nová trieda dedila z panela triedy. V hlavný() metóda sa vytvorí inštancia tejto novej triedy a pridá sa k objektu Frame prostredníctvom volania na pridať () metóda. Výsledok sa potom zobrazí. Výsledky oboch príkladov by mali vyzerať identicky (to znamená, že by mali vyzerať dosť nezaujímavo).

import java.awt. *;

verejná trieda Example1a rozširuje Panel {public static void main (String [] args) {Rám f = nový Rám ("Príklad 1a");

Príklad1a ex = nový Príklad1a ();

f.add ("Centrum", predtým);

f.pack (); f.show (); }}

Zoznam 2.

Rám s prázdnym panelom

Odvodením novej triedy z triedy Applet namiesto panela triedy môže byť tento príklad spustený buď ako samostatná aplikácia, alebo ako applet vložený do webovej stránky. Kód tohto príkladu je uvedený v zozname 3. Výsledný applet je zobrazený na obrázku 5 (a stále je dosť nezaujímavý).

import java.awt. *;

verejná trieda Example1b rozširuje java.applet.Applet {public static void main (String [] args) {Frame f = new Frame ("Example 1b");

Príklad1b ex = nový Príklad1b ();

f.add ("Centrum", predtým);

f.pack (); f.show (); }}

Zoznam 3.

Rám s prázdnym appletom

Na prezeranie tohto appletu potrebujete prehliadač s podporou Java.

Obrázok 5.

Prázdny rám

Poznámka: Objekt Window a v určitých prípadoch dokonca aj objekt Dialog môže nahradiť objekt Frame. Sú to všetko platné kontajnery a komponenty sa do každého pridávajú rovnakým spôsobom.

Pridávanie komponentov do kontajnera

Aby bolo používateľské rozhranie užitočné, musí pozostávať z viac ako len kontajnera - musí obsahovať komponenty. Komponenty sa do kontajnerov pridávajú pomocou kontajnera pridať () metóda. Existujú tri základné formy pridať () metóda. Metóda, ktorá sa má použiť, závisí od správcu rozloženia kontajnera (pozri časť s názvom Rozloženie komponentov).

Kód v zozname 4 pridáva vytvorenie dvoch tlačidiel ku kódu uvedenému v zozname 3. Vytvorenie sa vykonáva v init () metóda, pretože sa volá automaticky počas inicializácie appletu. Preto bez ohľadu na to, ako je program spustený, tlačidlá sa vytvárajú, pretože init () je volaný prehliadačom alebo hlavný() metóda. Obrázok 6 obsahuje výsledný applet.

import java.awt. *;

verejná trieda Example3 rozširuje java.applet.Applet {public void init () {add (new Button ("One")); pridať (nové tlačidlo („dva“)); }

public Dimension preferredSize () {vrátiť novú dimenziu (200, 100); }

public static void main (String [] args) {Rám f = nový Rám ("Príklad 3");

Príklad3 ex = nový Príklad3 ();

napr. init ();

f.add ("Centrum", predtým);

f.pack (); f.show (); }}

Výpis 4.

Applet s dvoma tlačidlami

Na prezeranie tohto appletu potrebujete prehliadač s podporou Java.

Obrázok 6.

Applet s dvoma tlačidlami

Rozloženie komponentov

Až do tejto chvíle sa nehovorilo o tom, ako sú rozmiestnené komponenty, ktoré boli pridané do kontajnera. Rozloženie nie je riadené kontajnerom, ale správcom rozloženia spojeným s kontajnerom. Správca rozloženia robí všetky rozhodnutia o umiestnení komponentov. V AWT implementujú všetky triedy manažérov rozloženia rozhranie LayoutManager.

AWT poskytuje päť správcov usporiadania. Pohybujú sa od veľmi jednoduchých po veľmi zložité. Tento článok sa venuje iba dvom triedam správcov rozloženia, ktoré sa tu používajú v príkladoch: trieda FlowLayout a trieda BorderLayout.

Trieda FlowLayout umiestňuje komponenty do kontajnera zľava doprava. Keď sa priestor v jednom rade vyčerpá, spustí sa ďalší riadok. Verzia kontajnera s jedným argumentom pridať () metóda sa používa na pridanie komponentov.

Trieda BorderLayout má päť zón, ako je znázornené na obrázku 7. Zóny sú pomenované „Sever“, „Juh“, „Východ“, „Západ“ a „Stred“. Do každej z týchto piatich zón je možné umiestniť jeden komponent. Keď sa zmení veľkosť obalového kontajnera, zmení sa veľkosť každej hraničnej zóny tak, aby bolo možné držať komponent umiestnený vo vnútri. Akýkoľvek nadbytočný priestor je daný stredovej zóne. Verzia kontajnera s dvoma argumentmi pridať () metóda sa používa na pridanie komponentov. Prvým argumentom je objekt String, ktorý pomenuje zónu, do ktorej sa má komponent umiestniť.

Každá trieda kontajnerov má predvoleného správcu rozloženia. Predvoleným správcom rozloženia pre triedu Frame a triedu Dialog je manažér BorderLayout. Predvolený správca rozloženia pre triedu Panel (a triedu Applet) je správca FlowLayout.

Kód v zozname 5 používa oboch manažérov rozloženia a obsahuje niekoľko ďalších komponentov používateľského rozhrania. Výsledok je zobrazený na obrázku 8.

import java.awt. *;

verejná trieda Example4 rozširuje java.applet.Applet {public void init () {Panel p;

setLayout (nový BorderLayout ());

p = nový panel ();

p.add (nový TextArea ());

pridať ("Stred", s);

p = nový panel ();

p.add (nové tlačidlo ("Jeden")); p.add (nové tlačidlo („dva“));

Voľba c = nová voľba ();

c.addItem ("jedna"); c.addItem ("dva"); c.addItem ("tri");

p.add (c);

pridať („Juh“, s); }

public static void main (String [] args) {Rám f = nový Rám ("Príklad 4");

Príklad4 ex = nový Príklad4 ();

napr. init ();

f.add ("Centrum", predtým);

f.pack (); f.show (); }}

Zoznam 5.

Zložitejší príklad

Na prezeranie tohto appletu potrebujete prehliadač s podporou Java.

Obrázok 8.

Zložitejší príklad

Riešenie udalostí

Vyššie uvedené príklady nerobia nič iné ako zobrazenie inertného používateľského rozhrania. Je samozrejme veľmi dôležité, aby užívateľské rozhranie konalo v dôsledku vstupu používateľa. Je však nad rámec tohto článku, aby sme sa hlbšie zaoberali záhadami spracovania udalostí. To musí počkať až do budúceho článku. V záujme úplnosti však vzorový kód v zozname 6 ukazuje, ako zvládnuť jeden typ udalosti, ktorú program môže prijať. Nová trieda má prednosť pred akcia () metóda poskytovaná triedou Component. The akcia () metóda reaguje na udalosti akcie, ktoré sú generované napríklad výberom položky z rozbaľovacieho zoznamu. The akcia () metóda vyžaduje, aby boli dodané dva parametre, inštancia udalosti a inštancia objektu. Inštancia udalosti obsahuje informácie o udalosti vrátane jej cieľa (komponentu, ktorý túto udalosť prijal prvý), súradníc udalosti xay a času, kedy k udalosti došlo. Inštancia Object obsahuje údajovú časť špecifickú pre udalosť. Pre Button objekty obsahuje text na štítku tlačidla.

import java.awt. *;

verejná trieda Example5 rozširuje java.applet.Applet {TextArea ta = null;

public void init () {Panel p;

setLayout (nový BorderLayout ());

p = nový panel ();

ta = new TextArea ();

p.add (ta);

pridať ("Stred", s);

p = nový panel ();

p.add (nové tlačidlo ("Jeden")); p.add (nové tlačidlo („dva“));

Voľba c = nová voľba ();

c.addItem ("jedna"); c.addItem ("dva"); c.addItem ("tri");

p.add (c);

pridať („Juh“, s); }

public boolean action (Udalosť e, Objekt o) {String str = (String) o;

ta.appendText (str + "\ n");

návrat nepravdivý; }

public static void main (String [] args) {Rám f = nový Rám ("Príklad 5");

Príklad5 ex = nový Príklad5 ();

napr. init ();

f.add ("Centrum", predtým);

f.pack (); f.show (); }}

Výpis 6.

Príklad so spracovaním udalostí

$config[zx-auto] not found$config[zx-overlay] not found