Programavimas

Įvadas į AWT

„Java“ programavimo kalbos klasės bibliotekoje pateikiamas vartotojo sąsajos įrankių rinkinys, vadinamas „Abstract Windowing Toolkit“ arba AWT. AWT yra galingas ir lankstus. Tačiau naujokai dažnai pastebi, kad jo galia yra uždengta. Klasėse ir metodų aprašymuose, pateiktuose išplatintoje dokumentacijoje, naujam programuotojui pateikiama mažai rekomendacijų. Be to, turimi pavyzdžiai dažnai palieka neatsakytą į daugelį svarbių klausimų. Žinoma, naujokai turėtų tikėtis tam tikrų sunkumų. Efektyvias grafines vartotojo sąsajas yra sudėtinga kurti ir įgyvendinti, o kartais sudėtinga AWT klasių sąveika šią užduotį tik apsunkina. Tačiau tinkamai vadovaujantis grafinės vartotojo sąsajos sukūrimas naudojant AWT yra ne tik įmanomas, bet ir gana paprastas.

Šiame straipsnyje apžvelgiama kai kuri AWT filosofija ir nagrinėjamas praktinis rūpestis, kaip sukurti paprastą programėlės ar programos vartotojo sąsają.

Kas yra vartotojo sąsaja

Vartotojo sąsaja yra ta programos dalis, kuri sąveikauja su programos vartotoju. Vartotojo sąsajos gali būti įvairių formų. Šios formos skiriasi nuo paprastų komandų eilutės sąsajų iki daugelio šiuolaikinių programų teikiamų grafinių vartotojo sąsajų.

Žemiausiu lygiu operacinė sistema informaciją iš pelės ir klaviatūros perduoda programai kaip įvestį ir pateikia programos išvesties taškus. AWT buvo sukurtas taip, kad programuotojai nesijaudintų dėl pelės sekimo ar klaviatūros skaitymo detalių ir neatsižvelgtų į rašymo į ekraną detales. AWT suteikia gerai suprojektuotą į objektą orientuotą sąsają šioms žemo lygio paslaugoms ir ištekliams.

Kadangi „Java“ programavimo kalba nepriklauso nuo platformos, AWT taip pat turi būti nepriklausoma nuo platformos. AWT buvo sukurtas siekiant pateikti bendrą grafinio vartotojo sąsajos projektavimo įrankių rinkinį, kuris veikia įvairiose platformose. AWT teikiami vartotojo sąsajos elementai įgyvendinami naudojant kiekvienos platformos vietinį GUI įrankių rinkinį, taip išsaugant kiekvienos platformos išvaizdą ir jausmą. Tai yra viena stipriausių AWT vietų. Tokio požiūrio trūkumas yra tai, kad grafinė vartotojo sąsaja, sukurta vienoje platformoje, gali atrodyti kitaip, kai ji rodoma kitoje platformoje.

Komponentai ir talpyklos

Grafinė vartotojo sąsaja yra sukurta iš grafinių elementų, vadinamų komponentais. Tipiški komponentai yra tokie elementai kaip mygtukai, slinkties juostos ir teksto laukai. Komponentai leidžia vartotojui bendrauti su programa ir suteikia vartotojui vizualinį grįžtamąjį ryšį apie programos būseną. AWT visi vartotojo sąsajos komponentai yra „Component“ klasės arba vieno iš jo potipių egzemplioriai.

Komponentai nėra atskirai, jie yra konteineriuose. Konteineriuose yra komponentų išdėstymas ir jis valdomas. Konteineriai patys yra komponentai, todėl juos galima įdėti į kitus konteinerius. AWT visi konteineriai yra „Container“ klasės arba vieno iš jo potipių egzemplioriai.

Erdvėje komponentai turi visiškai tilpti į indą, kuriame jie yra. Šis komponentų (įskaitant konteinerius) lizdas į konteinerius sukuria elementų medį, pradedant konteineriu medžio šaknyje ir išsiplečiant iki lapų, kurie yra tokie komponentai kaip mygtukai.

1 paveiksle pavaizduota paprasta grafinė vartotojo sąsaja, kokia ji atrodytų, kai ji rodoma sistemoje „Windows 95“. 2 paveiksle pavaizduoti 1 paveikslo sąsajos komponentai, išdėstyti kaip medis.

Komponentų tipai

3 paveiksle parodytas paveldėjimo santykis tarp vartotojo sąsajos komponentų klasių, kurias teikia AWT. „Class Component“ apibrėžia sąsają, kurios turi laikytis visi komponentai.

AWT pateikia devynias pagrindines ne konteinerių komponentų klases, iš kurių gali būti sukurta vartotojo sąsaja. (Žinoma, naujos komponentų klasės gali būti gaunamos iš bet kurios iš jų arba iš paties klasės komponento.) Šios devynios klasės yra klasės mygtukas, drobė, žymimasis langelis, pasirinkimas, etiketė, sąrašas, slinkties juosta, „TextArea“ ir „TextField“. 4 paveiksle pavaizduotas kiekvienos klasės egzempliorius.

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę.

4 paveikslas.

Devyni vartotojo sąsajos komponentai

Šio ekrano šaltinį rasite čia.

Konteinerių tipai

AWT teikia keturias konteinerių klases. Jie yra „Window“ klasės klasė ir du jos potipiai - „Class Frame“ ir „Class Dialog“, taip pat „Panel“ klasė. Be AWT pateikiamų konteinerių, „Applet“ klasė yra ir konteineris - tai yra „Panel“ klasės potipis, todėl gali talpinti komponentus. Toliau pateikiami trumpi kiekvienos konteinerių klasės aprašymai, kuriuos pateikia AWT.

LangasAukščiausio lygio ekranas (langas). Langų klasės egzempliorius nėra prijungtas prie kito sudėtinio rodinio ir jame neįterptas. Lango klasės egzempliorius neturi krašto ir pavadinimo.
RėmasAukščiausio lygio ekrano paviršius (langas) su kraštu ir pavadinimu. „Frame“ klasės egzemplioriuje gali būti meniu juosta. Kitaip jis labai panašus į „Windows“ klasės egzempliorių.
DialogasAukščiausio lygio ekrano paviršius (langas) su kraštu ir pavadinimu. „Dialog“ klasės egzempliorius negali egzistuoti be susieto „Frame“ klasės egzemplioriaus.
Skydelis

Bendras konteineris komponentams laikyti. „Panel“ klasės egzempliorius pateikia talpyklą, prie kurios reikia pridėti komponentų.

Konteinerio kūrimas

Prieš pridėdamas komponentus, sudarančius vartotojo sąsają, programuotojas turi sukurti konteinerį. Kuriant programą, programuotojas pirmiausia turi sukurti klasės „Window“ arba „Class Frame“ egzempliorių. Kuriant programėlę, rėmelis (naršyklės langas) jau yra. Kadangi „Applet“ klasė yra „Panel“ klasės potipis, programuotojas komponentus gali pridėti prie pačios „Applet“ klasės egzemplioriaus.

1 sąrašo kodas sukuria tuščią rėmą. Kadro pavadinimas („1 pavyzdys“) nustatomas kvietime konstruktoriui. Rėmas iš pradžių nematomas ir turi būti matomas jį iškviečiant Rodyti() metodas.

importuoti java.awt. *;

public class1 pavyzdys {public static void main (String [] args) {Frame f = new Frame ("1 pavyzdys");

f. rodyti (); }}

1 sąrašas.

Tuščias rėmas

2 sąrašo kodas pratęsia kodą iš 1 sąrašo, kad naujoji klasė paveldėtų iš klasės skydo. Viduje konors pagrindinis () metodas, šios naujos klasės egzempliorius sukuriamas ir pridedamas prie „Frame“ objekto iškviečiant papildyti() metodas. Tada rodomas rezultatas. Abiejų pavyzdžių rezultatai turėtų atrodyti identiški (tai yra, jie turėtų atrodyti gana neįdomūs).

importuoti java.awt. *;

public class1a pavyzdys prailgina skydelį {public static void main (String [] args) {Frame f = new Frame ("1a pavyzdys");

1a pavyzdys ex = naujas 1a pavyzdys ();

f.add („Centras“, buvęs);

f.pakuotė (); f. rodyti (); }}

2 sąrašas.

Rėmas su tuščiu skydeliu

Išvedant naują klasę iš klasės „Applet“, o ne „Class Panel“, šis pavyzdys dabar gali veikti kaip atskira programa arba kaip programėlė, įdėta į tinklalapį. Šio pavyzdžio kodas pateiktas 3 sąraše. Gauta programėlė rodoma 5 paveiksle (ir vis dar gana neįdomi).

importuoti java.awt. *;

viešoji klasė1b tęsia java.applet.Applet {public static void main (String [] args) {Frame f = new Frame ("1b pavyzdys");

1b pavyzdys ex = naujas1b pavyzdys ();

f.add („Centras“, buvęs);

f.pakuotė (); f. rodyti (); }}

3 sąrašas.

Rėmas su tuščia programėle

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę.

5 paveikslas.

Tuščias rėmas

Pastaba: lango objektas ir tam tikrais atvejais net dialogo objektas gali pakeisti objektą „Rėmas“. Jie visi yra galiojantys konteineriai, o komponentai dedami į kiekvieną tą patį būdą.

Komponentų pridėjimas į konteinerį

Kad vartotojo sąsaja būtų naudinga, ją turi sudaryti ne tik sudėtinis rodinys - joje turi būti komponentų. Komponentai į konteinerius dedami per konteinerį papildyti() metodas. Yra trys pagrindinės programos formos papildyti() metodas. Naudojamas metodas priklauso nuo talpyklos išdėstymo tvarkyklės (žr. Skyrių pavadinimu Komponento išdėstymas).

4 sąrašo kodas prideda dviejų mygtukų sukūrimą prie 3 sąraše pateikto kodo. Sukūrimas atliekamas inicijuoti () metodas, nes inicijuojant programėlę jis automatiškai iškviečiamas. Todėl, kad ir kaip programa būtų paleista, mygtukai kuriami, nes inicijuoti () iškviečiama naršyklė arba pagrindinis () metodas. 6 paveiksle yra gautas programėlė.

importuoti java.awt. *;

public class3 pavyzdys prailgina java.applet.Applet {public void init () {add (new Button ("One")); pridėti (naujas mygtukas („du“)); }

public Dimension preferSize () {grąžinti naują aspektą (200, 100); }

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

3 pavyzdys ex = naujas 3 pavyzdys ();

ex.init ();

f.add („Centras“, buvęs);

f.pakuotė (); f. rodyti (); }}

4 sąrašas.

Programėlė su dviem mygtukais

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę.

6 paveikslas.

Programėlė su dviem mygtukais

Komponento išdėstymas

Iki šiol nieko nebuvo pasakyta apie tai, kaip išdėstomi į konteinerį įdėti komponentai. Išdėstymą valdo ne sudėtinis rodinys, o išdėstymo tvarkyklė, susieta su sudėtiniu rodiniu. Maketavimo tvarkyklė priima visus komponentų išdėstymo sprendimus. AWT visose maketavimo tvarkyklių klasėse įdiegta „LayoutManager“ sąsaja.

AWT pateikia penkis maketavimo tvarkytuvus. Jie svyruoja nuo labai paprastų iki labai sudėtingų. Šis straipsnis apima tik dvi išdėstymo tvarkyklių klases, naudojamas šiame pavyzdyje: „FlowLayout“ ir „BorderLayout“ klases.

„FlowLayout“ klasėje komponentai dedami į konteinerį iš kairės į dešinę. Išnaudojus vienos eilės vietą, pradedama kita eilutė. Vieno argumento talpyklos versija papildyti() metodas naudojamas komponentams pridėti.

„BorderLayout“ klasėje yra penkios zonos, pavaizduotos 7 paveiksle. Zonos pavadintos „šiaurė“, „pietūs“, „rytai“, „vakarai“ ir „centras“. Kiekvienoje iš šių penkių zonų galima įdėti po vieną komponentą. Kai pakeičiamas uždaro konteinerio dydis, kiekvienos sienos zonos dydis pakeičiamas tiek, kad būtų galima laikyti dedamą komponentą. Bet kokia perteklinė erdvė skiriama centrinei zonai. Dviejų argumentų konteinerio versija papildyti() metodas naudojamas komponentams pridėti. Pirmasis argumentas yra String objektas, nurodantis zoną, į kurią dedamas komponentas.

Kiekvienoje sudėtinių rodinių klasėje yra numatytasis išdėstymo tvarkyklė. Numatytasis „Frame“ ir „Dialog“ klasės išdėstymo tvarkytuvas yra „BorderLayout“ tvarkyklė. Numatytasis skydo klasės (ir „Applet“ klasės) maketų tvarkytuvas yra „FlowLayout“ tvarkyklė.

5 sąraše pateiktame kode naudojami abu maketo tvarkytuvai ir jame yra dar keli vartotojo sąsajos komponentai. Rezultatas parodytas 8 paveiksle.

importuoti java.awt. *;

public class4 pavyzdys prailgina java.applet.Applet {public void init () {Panel p;

„setLayout“ (naujas „BorderLayout“ ());

p = nauja skydelis ();

p.add (nauja TextArea ());

pridėti („Centras“, p);

p = nauja skydelis ();

p.add (naujas mygtukas („Vienas“)); p.add (naujas mygtukas („Du“));

Pasirinkimas c = naujas pasirinkimas ();

c.addItem ("vienas"); c.addItem ("du"); c.addItem ("trys");

p. pridėta (c);

pridėti („Pietūs“, p); }

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

4 pavyzdys ex = naujas 4 pavyzdys ();

ex.init ();

f.add („Centras“, buvęs);

f.pakuotė (); f. rodyti (); }}

5 sąrašas.

Sudėtingesnis pavyzdys

Jums reikia „Java“ palaikančios naršyklės, kad galėtumėte peržiūrėti šią programėlę.

8 paveikslas.

Sudėtingesnis pavyzdys

Renginių tvarkymas

Aukščiau pateiktuose pavyzdžiuose pateikiama tik inertiška vartotojo sąsaja. Žinoma, labai svarbu, kad vartotojo sąsaja imtųsi veiksmų dėl vartotojo įvesties. Tačiau gilintis į įvykių valdymo paslaptis yra ne šiame straipsnyje. To reikia palaukti, kol pasirodys būsimas straipsnis. Tačiau siekiant išsamumo, pavyzdinis kodas 6 sąraše parodo, kaip elgtis su vieno tipo įvykiais, kuriuos gali gauti programa. Naujoji klasė pakeičia veiksmas () metodas, kurį pateikia komponentų klasė. veiksmas () metodas reaguoja į veiksmo įvykius, kuriuos sukuria, pavyzdžiui, pasirinkdami elementą iš iškylančiojo sąrašo. veiksmas () metodas reikalauja pateikti du parametrus, įvykio egzempliorių ir objekto egzempliorių. Įvykio egzemplioriuje yra informacija apie įvykį, įskaitant įvykio tikslą (komponentą, kuris pirmą kartą gavo įvykį), įvykio x ir y koordinates bei laiką, kada įvykis įvyko. Objekto egzemplioriuje yra konkretaus įvykio duomenų dalis. „Button“ objektuose tekstas yra mygtuko etiketėje.

importuoti java.awt. *;

public class5 pavyzdys prailgina java.applet.Applet {TextArea ta = null;

public void init () {Panel p;

setLayout (naujas „BorderLayout“);

p = nauja skydelis ();

ta = nauja „TextArea“ ();

p.add (ta);

pridėti („Centras“, p);

p = nauja skydelis ();

p.add (naujas mygtukas („vienas“)); p.add (naujas mygtukas („Du“));

Pasirinkimas c = naujas pasirinkimas ();

c.addItem ("vienas"); c.addItem ("du"); c.addItem ("trys");

p. pridėta (c);

pridėti („Pietūs“, p); }

viešas loginis veiksmas (įvykis e, objektas o) {String str = (String) o;

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

grąžinti klaidingą; }

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

5 pavyzdys ex = naujas 5 pavyzdys ();

ex.init ();

f.add („Centras“, buvęs);

f.pakuotė (); f. rodyti (); }}

6 sąrašas.

Pavyzdys su įvykių tvarkymu