Programování

Úvod do AWT

Knihovna tříd programovacího jazyka Java poskytuje sadu nástrojů uživatelského rozhraní nazvanou Abstract Windowing Toolkit nebo AWT. AWT je výkonný a flexibilní. Nováčci však často zjistí, že jeho síla je zahalená. Popisy tříd a metod nalezené v distribuované dokumentaci poskytují novému programátorovi malé vodítko. Dostupné příklady navíc často ponechávají mnoho důležitých otázek nezodpovězených. Nováčci by samozřejmě měli očekávat určité potíže. Efektivní grafická uživatelská rozhraní jsou neodmyslitelně náročná na návrh a implementaci a někdy komplikované interakce mezi třídami v AWT tento úkol jen komplikují. Při správném vedení je však vytvoření grafického uživatelského rozhraní pomocí AWT nejen možné, ale také relativně jednoduché.

Tento článek se věnuje některé filozofii AWT a věnuje se praktickému zájmu o vytvoření jednoduchého uživatelského rozhraní pro applet nebo aplikaci.

Co je uživatelské rozhraní

Uživatelské rozhraní je ta část programu, která interaguje s uživatelem programu. Uživatelská rozhraní mají mnoho podob. Tyto formy mají složitost, od jednoduchých rozhraní příkazového řádku až po grafická uživatelská rozhraní typu point-and-click poskytovaná mnoha moderními aplikacemi.

Na nejnižší úrovni operační systém přenáší informace z myši a klávesnice do programu jako vstup a poskytuje pixely pro výstup programu. AWT byl navržen tak, aby si programátoři nemuseli dělat starosti s podrobnostmi sledování myši nebo čtení klávesnice, ani se nezabývat podrobnostmi psaní na obrazovku. AWT poskytuje dobře navržené objektově orientované rozhraní pro tyto nízkoúrovňové služby a zdroje.

Protože programovací jazyk Java je nezávislý na platformě, musí být AWT také nezávislý na platformě. AWT byl navržen tak, aby poskytoval společnou sadu nástrojů pro návrh grafického uživatelského rozhraní, které fungují na různých platformách. Prvky uživatelského rozhraní poskytované AWT jsou implementovány pomocí nativní sady nástrojů GUI každé platformy, čímž je zachován vzhled a chování každé platformy. Toto je jedna z nejsilnějších stránek AWT. Nevýhodou takového přístupu je skutečnost, že grafické uživatelské rozhraní navržené na jedné platformě může vypadat jinak, když se zobrazí na jiné platformě.

Součásti a kontejnery

Grafické uživatelské rozhraní je vytvořeno z grafických prvků zvaných komponenty. Typické součásti zahrnují takové položky, jako jsou tlačítka, posuvníky a textová pole. Komponenty umožňují uživateli interakci s programem a poskytují uživateli vizuální zpětnou vazbu o stavu programu. V AWT jsou všechny komponenty uživatelského rozhraní instancemi třídy Component nebo jednoho z jejích podtypů.

Komponenty nestojí samostatně, ale nacházejí se spíše v kontejnerech. Kontejnery obsahují a řídí rozložení komponent. Kontejnery jsou samy o sobě součástmi a lze je tedy umístit do jiných kontejnerů. V AWT jsou všechny kontejnery instancemi třídy Container nebo jednoho z jejích podtypů.

Prostorově musí komponenty zcela zapadnout do kontejneru, který je obsahuje. Toto vnoření komponent (včetně kontejnerů) do kontejnerů vytvoří strom prvků, počínaje kontejnerem v kořenovém adresáři stromu a rozšiřujícím se až k listím, což jsou komponenty, jako jsou tlačítka.

Ilustrace na obrázku 1 zobrazuje jednoduché grafické uživatelské rozhraní tak, jak by vypadalo při zobrazení pod Windows 95. Obrázek 2 zobrazuje součásti rozhraní z obrázku 1 uspořádané jako strom.

Druhy komponent

Obrázek 3 ukazuje vztah dědičnosti mezi třídami komponent uživatelského rozhraní poskytovanými AWT. Třída Komponenta definuje rozhraní, ke kterému se musí všechny komponenty držet.

AWT poskytuje devět základních nekontejnerových komponentních tříd, ze kterých lze vytvořit uživatelské rozhraní. (Nové třídy komponent lze samozřejmě odvodit z kterékoli z těchto tříd nebo ze samotné komponenty Component.) Těchto devět tříd je třída Button, Canvas, Checkbox, Choice, Label, List, Scrollbar, TextArea a TextField. Obrázek 4 zobrazuje instanci každé třídy.

K prohlížení tohoto appletu potřebujete prohlížeč s podporou Java.

Obrázek 4.

Devět komponent uživatelského rozhraní

Zdroj tohoto displeje najdete zde.

Druhy kontejnerů

AWT poskytuje čtyři třídy kontejnerů. Jsou to třída Window a její dva podtypy - třída Frame a třída Dialog - stejně jako třída Panel. Kromě kontejnerů poskytovaných AWT je třída Applet kontejnerem - jedná se o podtyp třídy Panel a může tedy obsahovat komponenty. Níže jsou uvedeny stručné popisy každé třídy kontejnerů poskytované AWT.

OknoPlocha displeje nejvyšší úrovně (okno). Instance třídy Window není připojena ani vložena do jiného kontejneru. Instance třídy Window nemá žádné ohraničení ani název.
RámPlocha displeje nejvyšší úrovně (okno) s ohraničením a nadpisem. Instance třídy Frame může mít panel nabídek. Jinak se velmi podobá instanci třídy Window.
DialogPlocha displeje nejvyšší úrovně (okno) s ohraničením a nadpisem. Instance třídy Dialog nemůže existovat bez přidružené instance třídy Frame.
Panel

Obecný kontejner pro uložení komponent. Instance třídy Panel poskytuje kontejner, do kterého se mají přidat komponenty.

Vytvoření kontejneru

Před přidáním komponent, které tvoří uživatelské rozhraní, musí programátor vytvořit kontejner. Při vytváření aplikace musí programátor nejprve vytvořit instanci třídy Window nebo třídy Frame. Při vytváření appletu již rámec (okno prohlížeče) existuje. Protože třída Applet je podtypem třídy Panel, může programátor přidat komponenty do instance samotné třídy Applet.

Kód v seznamu 1 vytvoří prázdný rámeček. Název rámce („Příklad 1“) je nastaven ve volání konstruktoru. Rámec je zpočátku neviditelný a musí být viditelný vyvoláním jeho ukázat() metoda.

importovat java.awt. *;

public class Example1 {public static void main (String [] args) {Frame f = new Frame ("Example 1");

f.show (); }}

Výpis 1.

Prázdný rámeček

Kód v seznamu 2 rozšiřuje kód z výpisu 1 tak, aby nová třída děděla z panelu třídy. V hlavní() metoda je vytvořena instance této nové třídy a přidána k objektu Frame prostřednictvím volání metody přidat() metoda. Výsledek se poté zobrazí. Výsledky obou příkladů by měly vypadat shodně (to znamená, že by měly vypadat docela nezajímavě).

importovat java.awt. *;

public class Example1a extends Panel {public static void main (String [] args) {Frame f = new Frame ("Example 1a");

Příklad1a ex = nový Příklad1a ();

f.add ("Center", ex);

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

Výpis 2.

Rám s prázdným panelem

Odvozením nové třídy z třídy Applet namísto panelu třídy může tento příklad běžet jako samostatná aplikace nebo jako applet vložený do webové stránky. Kód pro tento příklad je uveden v seznamu 3. Výsledný applet je zobrazen na obrázku 5 (a stále je docela nezajímavý).

importovat java.awt. *;

veřejná třída Example1b rozšiřuje java.applet.Applet {public static void main (String [] args) {Frame f = new Frame ("Example 1b");

Příklad1b ex = nový Příklad1b ();

f.add ("Center", ex);

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

Výpis 3.

Rámeček s prázdným appletem

K prohlížení tohoto appletu potřebujete prohlížeč s podporou Java.

Obrázek 5.

Prázdný rámeček

Poznámka: Objekt Window, a v některých případech dokonce i Dialog, může nahradit objekt Frame. Jsou to všechny platné kontejnery a komponenty jsou do každého přidány stejným způsobem.

Přidávání komponent do kontejneru

Aby bylo uživatelské rozhraní užitečné, musí se skládat z více než jen z kontejneru - musí obsahovat komponenty. Komponenty se do kontejnerů přidávají pomocí kontejneru přidat() metoda. Existují tři základní formy přidat() metoda. Metoda, která se má použít, závisí na správci rozložení kontejneru (viz část s názvem Rozložení komponent).

Kód v seznamu 4 přidává vytvoření dvou tlačítek k kódu uvedenému v seznamu 3. Vytvoření se provádí v init () metoda, protože je volána automaticky během inicializace appletu. Proto bez ohledu na to, jak je program spuštěn, jsou tlačítka vytvořena, protože init () je volán prohlížečem nebo hlavní() metoda. Obrázek 6 obsahuje výsledný applet.

importovat java.awt. *;

veřejná třída Example3 rozšiřuje java.applet.Applet {public void init () {add (new Button ("One")); přidat (nové tlačítko („dva“)); }

public Dimension preferredSize () {vrátit novou dimenzi (200, 100); }

public static void main (String [] args) {Frame f = new Frame ("Example 3");

Příklad3 ex = nový Příklad3 ();

např. init ();

f.add ("Center", ex);

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

Výpis 4.

Applet se dvěma tlačítky

K prohlížení tohoto appletu potřebujete prohlížeč s podporou Java.

Obrázek 6.

Applet se dvěma tlačítky

Rozložení komponent

Až do tohoto okamžiku nebylo nic řečeno o tom, jak jsou rozloženy komponenty, které byly přidány do kontejneru. Rozložení není řízeno kontejnerem, ale správcem rozložení přidruženým k kontejneru. Správce rozložení provádí všechna rozhodnutí o umístění komponent. V AWT implementují všechny třídy správce rozložení rozhraní LayoutManager.

AWT poskytuje pět správců rozložení. Pohybují se od velmi jednoduchých po velmi složité. Tento článek popisuje pouze dvě třídy správce rozložení používané v příkladech v tomto dokumentu: FlowLayout třída a BorderLayout třída.

Třída FlowLayout umisťuje komponenty do kontejneru zleva doprava. Když je místo v jedné řadě vyčerpáno, spustí se další řada. Verze s jedním argumentem kontejneru přidat() metoda se používá k přidání komponent.

Třída BorderLayout má pět zón, jak je znázorněno na obrázku 7. Zóny jsou pojmenovány „sever“, „jih“, „východ“, „západ“ a „střed“. Do každé z těchto pěti zón lze umístit jednu komponentu. Když se změní velikost uzavírajícího kontejneru, změní se velikost každé hraniční zóny jen natolik, aby udržela součást umístěnou uvnitř. Nadměrný prostor je dán středové zóně. Verze se dvěma argumenty kontejneru přidat() metoda se používá k přidání komponent. Prvním argumentem je objekt String, který pojmenuje zónu, do které se má komponenta umístit.

Každá třída kontejneru má výchozího správce rozložení. Výchozí správce rozložení pro třídu Frame a třídu Dialog je správce BorderLayout. Výchozí správce rozložení pro třídu Panel (a třídu Applet) je správce FlowLayout.

Kód v seznamu 5 používá oba manažery rozložení a obsahuje několik dalších komponent uživatelského rozhraní. Výsledek je zobrazen na obrázku 8.

importovat java.awt. *;

veřejná třída Example4 rozšiřuje java.applet.Applet {public void init () {Panel p;

setLayout (nový BorderLayout ());

p = nový Panel ();

p.add (nový TextArea ());

add ("Střed", p);

p = nový Panel ();

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

Volba c = nová volba ();

c.addItem ("jedna"); c.addItem ("dva"); c.addItem ("tři");

p.add (c);

add ("Jih", p); }

public static void main (String [] args) {Frame f = new Frame ("Example 4");

Příklad4 ex = nový Příklad4 ();

např. init ();

f.add ("Center", ex);

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

Výpis 5.

Složitější příklad

K prohlížení tohoto appletu potřebujete prohlížeč s podporou Java.

Postavení 8.

Složitější příklad

Zpracování událostí

Výše uvedené příklady nedělají nic jiného než zobrazení inertního uživatelského rozhraní. Je samozřejmě velmi důležité, aby uživatelské rozhraní přijalo opatření v důsledku vstupu uživatele. Je však nad rámec tohoto článku, abychom se ponořili hluboko do tajemství manipulace s událostmi. To musí počkat až do dalšího článku. V zájmu úplnosti však ukázkový kód v seznamu 6 ukazuje, jak zpracovat jeden typ události, kterou může program obdržet. Nová třída přepíše akce() metoda poskytovaná třídou Component. The akce() metoda reaguje na události akce, které jsou generovány například výběrem položky z rozevíracího seznamu. The akce() metoda vyžaduje, aby byly zadány dva parametry, instanci události a instanci objektu. Instance události obsahuje informace o události, včetně cíle události (komponenty, která událost poprvé přijala), souřadnic x a y události a času, kdy k události došlo. Instance Object obsahuje část dat specifickou pro událost. U objektů Button obsahuje text na štítku tlačítka.

importovat java.awt. *;

veřejná třída Example5 rozšiřuje java.applet.Applet {TextArea ta = null;

public void init () {Panel p;

setLayout (nový BorderLayout ());

p = nový Panel ();

ta = new TextArea ();

p.add (ta);

add ("Střed", p);

p = nový Panel ();

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

Volba c = nová volba ();

c.addItem ("jedna"); c.addItem ("dva"); c.addItem ("tři");

p.add (c);

add ("Jih", p); }

public boolean action (Událost e, Objekt o) {String str = (String) o;

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

návrat false; }

public static void main (String [] args) {Frame f = new Frame ("Example 5");

Příklad5 ex = nový Příklad5 ();

např. init ();

f.add ("Center", ex);

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

Výpis 6.

Příklad zpracování událostí