Sunteți pe pagina 1din 18

Abstract Windowing Toolkit

Abstract Windowing Toolkit, pe scurt AWT, este un set de clase cu ajutorul crora putei crea o interfa grafic utilizator care s reacioneze la datele de intrare primite de la mouse i tastatur. Deoarece Java este un limbaj independent de platform, AWT ofer o modalitate de proiectare a unei interfee care s prezinte aceeai nfiare i aceleai caracteristici pe orice sistem pe care ar fi rulat. Folosind AWT, o interfa este compus din urmtoarele: Componente. Orice poate fi plasat pe o interfa utilizator, cum ar fi butoane, liste derulante, meniuri pop-up, casete de validare sau cmpuri de text. Containere. Acestea sunt componente care pot conine alte componente. Ai folosit deja un astfel de container - fereastra Applet; alte exemple ar fi panouri, casete de dialog sau ferestre independente. Administratori de dispunere. Obiecte care definesc modul cum sunt aranjate (dispuse) componentele ntr-un container. Administratorul de dispunere nu este vizibil ntr-o interfa, ns sunt vizibile rezultatele muncii" sale. Toate clasele AWT fac parte din pachetul java.awt. Pentru a face toate aceste clase disponibile ntr-un program, poate fi folosit urmtoarea instruciune de import, introdus la nceputul codului surs: import java.awt.*; Aceast instruciune are ca rezultat importarea tuturor componentelor, containerelor i administratorilor de dispunere pe care i vei folosi la proiectarea unei interfee. Putei folosi i instruciuni import individuale, numai pentru clasele care vor fi utilizate ntr-un program. Clasele AWT, ca oricare alte pri ale unei biblioteci de clase Java, sunt aranjate ierarhic.

Componentele interfetei utilizator


Componentele sunt poziionate pe interfaa utilizator prin adugarea lor ntr-un container. Un container este el nsui o component, deci poate fi adugat n alte containere. Vei folosi aceast caracteristic atunci cnd vei ncepe s lucrai cu administratori de dispunere (layout managers) pentru a aranja o interfa. Cea mai uoar modalitate de a demonstra cum se proiecteaz o interfa este folosirea containerului cu care ai lucrat pn acum - clasa Applet.

Adugarea componentelor ntr-un container


O component este adugat ntr-un container astfel: Creai componenta. Apelai metoda add() a containerului, pentru componenta respectiv. Deoarece toate applet-urile sunt containere, putei folosi metoda add() ntr-un applet pentru a aduga o component direct n fereastra Applet. Fiecare component AWT este o clas, deci componenta respectiv este creat prin crearea unui obiect al clasei respective. Clasa Button reprezint butoanele din cadrul unei interfee (suprafee pe care se poate executa clic). Un buton se creeaz specificnd eticheta sa n metoda constructorului, ca n urmtorul exemplu: Button atentie = new Button(Atenie!) ; Aceast instruciune creeaz un buton etichetat cu textul Atenie!. O dat creat o component, cea mai simpl metod de a o aduga ntr-un container este de a apela metoda add () a containerului, avnd ca argument componenta respectiv.

Deoarece un applet este un container, putei folosi urmtoarea instruciune pentru a aduga obiectul atenie ntr-o fereastr Applet: add(atentie) ; Adugarea unei componente nu duce imediat la afiarea acesteia. De fapt, aceasta va fi afiat numai la apelarea metodei paint() a containerului. De acest lucru se ocup n culise" Java, ns putei fora un apel al metodei paint() a applet-ului folosind metoda repaint() a acestuia. Atunci cnd adugai o component ntr-un container, nu se specific coordonatele x,y ale locului unde va fi plasat aceasta. De aranjamentul componentelor se ocup administratorul de dispunere (layout manager) care aparine containerului respectiv.

Etichete
Cea mai simpl component a unei interfee utilizator este eticheta, care este creat din clasa Label. Etichetele se folosesc de obicei pentru a identifica rolul celorlalte componente aflate pe interfa; acestea nu pot fi modificate direct de utilizator. Folosirea unei etichete pentru text este preferabil folosirii metodei drawString(), din urmtoarele motive: Etichetele sunt desenate automat dup creare i nu trebuie s fie tratate explicit de metoda paint(). Etichetele vor fi aranjate corespunztor administratorului de dispunere curent i nu la o anumit coordonat x,y cum este cazul irului. Pentru a crea o etichet folosii unul dintre urmtorii constructori: Label() creeaz o etichet goal (vid), cu textul aliniat la stnga. Label (String) creeaz o etichet cu irul de text dat, aliniat, de asemenea, la stnga. Label (String, int) creeaz o etichet cu irul de text dat i alinierea indicat de argumentul ntreg. Pentru stabilirea alinierii se folosesc urmtoarele variabile de clas: Label.RIGHT, Label.LEFT, Label.CENTER.

Butoane
Butoanele (zone pe care se poate efectua clic) pot fi create folosind clasa Button. Butoanele sunt folosite ntr-o interfa pentru a declana o aciune, cum este butonul Quit (Terminare) folosit pentru a prsi un program. Pentru a crea un buton, folosii unul dintre constructorii: Button() creeaz un buton care nu conine nici un text pentru explicarea funciei sale. Button(String) creeaz un buton pe care este afiat irul de text primit ca argument. Dup crearea unui buton, putei s i modificai eticheta folosind metoda setLabel (String) sau putei afla textul scris folosind metoda getLabel()

Casete de validare
Casetele de validare (check boxes) sunt mici casete, etichetate sau nu, care pot fi validate (bifate") sau goale. Acestea sunt, de obicei, folosite pentru a selecta sau deselecta anumite opiuni ntr-un program, cum ar fi opiunile Disable Sound (Dezactivare sunet) sau Password Protected (Protecie cu parol) dintr-o protecie de ecran (screen saver) Windows. n mod normal, casetele de validare sunt neexclusive, ceea ce nseamn c, dac avei cinci casete de validare ntr-un container, toate cinci pot fi validate sau nu simultan. Aceste componente pot fi organizate i n grupuri de validare, care mai sunt denumite i butoane radio (radio buttons). Ele i-au luat numele de la vechile aparate de radio, la care apsarea unui buton ducea la ridicarea altuia care era apsat pn atunci.

Ambele tipuri de casete de validare sunt create folosind clasa Checkbox. Putei crea o caset de validare neexclusiv folosind unul din urmtorii constructori: Checkbox() creeaz o caset de validare neetichetat, care nu este validat. Checkbox(String) creeaz o caset de validare nevalidat i care are ca etichet irul dat. Dup ce ai creat un obiect Checkbox, putei folosi metoda setState (boolean) pentru a modifica starea acestuia, astfel: valoarea true pentru a valida caseta i valoarea false pentru a o anula. Metoda getState() returneaz o valoare Boolean care indic starea de validare a casetei. Pentru a organiza mai multe casete de validare ntr-un grup, cu scopul de a nu permite dect validarea unei singure opiuni la un moment dat, se creeaz un obiect CheckboxGroup, printr-o instruciune de genul: CheckboxGroup radio = new CheckboxGroup(); Obiectul CheckboxGroup pstreaz starea tuturor casetelor de validare din grupul su. Acest obiect va fi folosit ca argument suplimentar pentru constructorul Checkbox. Checkbox (String, GrupCaseteValidare, boolean) creeaz o caset de validare etichetat cu irul dat de primul argument i care aparine grupului indicat de cel de-al doilea argument. Cel de-al treilea argument trebuie setat pe true dac se dorete validarea casetei de dialog i false n caz contrar.

Liste de opiuni
Listele de opiuni (choice lists), create din clasa Choice, sunt componente care permit alegerea unei singure opiuni dintr-o list derulant (pull-down list). Vei ntlni de multe ori acest tip de liste atunci cnd completai un formular dintr-o pagin World Wide Web. Primul pas n crearea unei liste de opiuni const n crearea obiectului Choice care va pstra lista, ca n exemplul urmtor: Choice sex = new Choice(); Elementele se adaug ntr-o list de opiuni folosind metoda addItem(String) a obiectului. Urmtoarele instruciuni adaug dou elemente n lista de opiuni sex: sex.addItem("Masculin"); sex.addItem("Feminin"); Putei continua s folosii metoda addItem() pentru a aduga opiuni n list chiar i dup ce lista a fost introdus ntr-un container.

Cmpuri de text
Cmpurile de text (text fields) sunt folosite pentru a crea componente n care textul poate fi modificat de utilizator. Aceste componente sunt create din clasa TextField. Pentru a crea un cmp de text, folosii unul din urmtorii constructori: TextField() creeaz un cmp gol, fr o lime specificat. TextField(int) creeaz un cmp gol, care are o lime suficient pentru a afia numrul specificat de caractere. TextField(String) creeaz un cmp completat cu irul dat i fr o lime specificat. TextField (String, int) creeaz cmp completat cu irul dat i cu limea specificata de argumentul ntreg. Atributul responsabil cu limea cmpului are relevan doar n cazul folosirii unor administratori de dispunere (layout managers) care nu redimensioneaz componentele, cum ar fi administratorul FlowLayout. Urmtoarea instruciune creeaz un cmp de text gol, care ofer suficient spaiu pentru 30 de caractere: TextField nume = new TextField(30) ;

Urmtoarea instruciune poate fi folosit dac dorii s iniializai cmpul cu irul de text "Ion I. Ionescu": TextField nume = new TextField("Ion I. Ionescu", 30); Putei crea i un cmp de text care s ascund caracterele tastate, afind n locul lor un caracter oarecare. Aceast facilitate se folosete de obicei n cmpurile de introducere a parolelor, pentru a ascunde parola de priviri indiscrete. Pentru a defini un astfel de caracter de mascare, n Java 1.02 se folosete metoda setEchoCharacter(char), iar n versiunile urmtoare, metoda setEchoChar(char). Dac se folosete un literal, acesta trebuie ncadrat ntre ghilimele simple, ca de exemplu '*'. Java interpreteaz orice literal ncadrat de ghilimele duble ca fiind un obiect de tip String (ir).

Zone de text
Zonele de text (text areas), create din clasa textArea, sunt cmpuri de text modificabile care pot conine mai multe linii de text. Zonele de text posed bare de defilare orizontale i verticale, care permit utilizatorului s parcurg ntreg textul coninut n component. Pentru a crea o zon de text putei folosi unul din urmtorii constructori: TextArea() creeaz o zon de text goal, cu nlime i lime nespecificate. TextArea (int, int) creeaz o zon goal, care conine numrul de rnduri dat de primul argument i are limea n caractere dat de al doilea argument. TextArea (String) creeaz o zon de text care conine irul specificat i are limea i nlimea nespecificate. TextArea(String, int, int) creeaz o zon de text care conine irul specificat, numrul de rnduri fiind dat de primul argument, iar limea n caractere de al doilea argument.

Liste de derulare
Listele de derulare (scrolling lists), create din clasa List, sunt asemntoare listelor de opiuni, cu dou diferene semnificative: Lista de derulare poate fi configurat aa nct s poat fi selectate mai multe opiuni la un moment dat. Listele de derulare se prezint asemntor unei zone de text n care sunt afiate mai multe opiuni. Dac lista conine mai multe opiuni dect pot fi afiate, se folosete o bar de derulare pentru a se parcurge ntreaga list. O list de derulare este definit prin crearea unui obiect List i adugarea n list a unor elemente. Clasa List posed urmtorii constructori: List() creeaz o list de parcurgere vid care permite selectarea unui singur element la un moment dat. List(int, boolean) creeaz o list de derulare care posed numrul de elemente vizibile indicat de primul argument (numr care poate fi mai mic dect numrul total de elemente). Argumentul boolean indic dac pot fi selectate mai multe elemente (true) sau nu (false). Dup crearea unui obiect List se folosete metoda addItem(String) pentru a aduga elemente n list. (Nota: ncepnd cu Java 2, metoda nu se mai recomand i a fost nlocuit de metoda add(String)).

Bare de derulare i glisoare


Barele de derulare (scrollbars) sunt componente care permit selectarea unei valori prin deplasarea unei casete ntre dou sgei. Exist mai multe componente care au nglobate bare de derulare, cum ar fi zonele de text sau listele de derulare. Clasa Scrollbar este folosit pentru alte tipuri de bare de derulare. O bar de derulare poate fi orizontal sau vertical.

Barele de derulare sunt folosite n mod normal pentru specificarea valorilor minime i maxime care pot fi stabilite prin utilizarea componentei. Pentru a crea o bar de derulare putei folosi urmtorii constructori: Scrollbar() creeaz o bar de derulare vertical care are valorile maxim i minim setate iniial la 0. Scrollbar(int) creeaz o bar de derulare care are valorile maxim i minim setate la 0, iar orientarea este dat de valoarea ntreag. Argumentul poate lua urmtoarele valori, care sunt variabile de clas: Scrollbar.HORIZONTAL i Scrollbar.VERTICAL. Putei folosi, de asemenea, un al treilea constructor, care primete cinci argumente: Scrollbar ( int, int, int, int, int). Argumentele acestei metode sunt, n ordine, urmtoarele: Orientarea, care este Scrollbar.HORIZONTAL sau Scrollbar.VERTICAL. Valoarea iniial a barei de derulare, care trebuie s se afle ntre valorile minim i maxim ale barei sau s fie egal cu una dintre acestea. Limea sau nlimea general a casetei folosite pentru modificarea valorii barei de derulare. Aceasta poate fi egal cu 0 atunci cnd se folosete dimensiunea prestabilit. Valoarea minim a barei de derulare. Valoarea maxim a barei de derulare.

Suprafee de desenare
Suprafeele de desenare (canvas) sunt componente folosite, n principal, drept loc de afiare pentru imagini sau animaie. Putei desena i pe alte componente, ns obiectele Canvas sunt cele mai simplu de folosit n acest scop. Pentru a folosi o suprafa de desenare trebuie s creai o subclas a clasei Canvas. Aceast subclas se poate ocupa de toate operaiunile de desenare care trebuie s aib loc, n metoda sa paint(). O dat creat o subclas Canvas, aceasta poate fi folosit n program prin apelarea constructorului su i prin adugarea noului obiect Canvas ntr-un container.

Aranjarea componentelor ntr-o interfa utilizator


Putei dispune componente pe o interfa, ns nu prea vei avea controlul asupra locului unde vor fi amplasate. Pentru a impune o anumit form interfeei proiectate cu ajutorul Abstract Windowing Toolkit trebuie s folosii un set de clase denumite administratori de dispunere (layout managers).

Dispunerea componentelor interfeei


Un administrator de dispunere determin modul cum vor fi aranjate (dispuse) componentele adugate ntr-un container. Administratorul de dispunere implicit este clasa FlowLayout. Aceast component permite dispunerea secvenial a obiectelor, de la stnga la dreapta, n ordinea n care acestea sunt adugate n container. Atunci cnd nu mai este loc pe un rnd, celelalte obiecte se dispun n continuare pe rndul urmtor, continund secvena de la stnga la dreapta. Biblioteca AWT conine cinci administratori de dispunere principali: FlowLayout, GridLayout, BorderLayout, CardLayout i GridBagLayout. Pentru a crea un administrator de dispunere pentru un container, se creeaz o instan a clasei container folosind o instruciune de genul: FlowLayout flo = new FlowLayout();

Dup ce ai creat un administrator de dispunere, l vei declara drept administrator de dispunere pentru container folosind metoda setLayout() a acestuia. Administratorul de dispunere trebuie stabilit nainte de a aduga componentele n container. Dac nu este stabilit nici un administrator de dispunere, se folosete implicit dispunerea n secven (flow layout). Urmtoarele instruciuni reprezint punctul de ncepere pentru un applet n care se creeaz un administrator de dispunere i se folosete metoda setLayout() pentru a controla dispunerea tuturor componentelor ce vor fi adugate n fereastra Applet: public class Starter extends java.applet.Applet { FlowLayout ad = new FlowLayout(); public void init() { setLayout(ad) ; } } Dup stabilirea administratorului de dispunere curent, putei ncepe s adugai componentele n containerul pe care acesta l controleaz. Pentru unii dintre administratorii de dispunere, cum ar fi FlowLayout, ordinea n care se adaug componentele este important.

Dispunerea secvenial
FlowLayout este cea mai simpl clas de administrare a dispunerii. Ea aranjeaz componentele ntr-o manier asemntoare dispunerii cuvintelor ntr-o pagin - de la stnga la dreapta pn la captul rndului, apoi n continuare pe rndul urmtor. n mod prestabilit, dac folosii constructorul FlowLayout() fr argumente, componentele de pe fiecare rnd vor fi centrate. Dac dorii ca acestea s fie aliniate la marginea din stnga sau din dreapta a containerului, trebuie folosite drept argument pentru constructor variabilele de clas FlowLayout.LEFT sau FlowLayout.RIGHT: FlowLayout dreapta = new FlowLayout(FlowLayout.RIGHT); Variabila de clas FlowLayout.CENTER este folosit pentru dispunerea pe centru a componentelor.

Dispunerea tabelar
Administratori de dispunere tabelar (grid) aranjeaz componentele ntr-un caroiaj (tabel) format din rnduri i coloane. Componentele sunt adugate ncepnd cu celula aflat cel mai n stnga pe primul rnd al tabelului i continund spre dreapta. Dup completarea tuturor celulelor de pe primul rnd se continua cu cel de-al doilea rnd, de la stnga la dreapta, i aa mai departe. Dispunerea tabelar este stabilit pornind de la clasa GridLayout. Constructorul GridLayout primete dou argumente - numrul de rnduri i numrul de coloane din tabel. Urmtoarea instruciune creeaz un administrator de dispunere tabelar pentru 10 rnduri i 3 coloane: GridLayout gr = new GridLayout(10,3); Ca i n cazul dispunerii secveniale, dac se folosesc dou argumente suplimentare, putei specifica spaiul pe orizontal i pe vertical care trebuie lsat ntre componente. Urmtoarea instruciune creeaz un tabel cu 10 rnduri, 3 coloane, un spaiu pe orizontal de 5 pixeli i un spaiu pe vertical de 8 pixeli: GridLayout gr2 = new GridLayout(10, 3, 5, 8); Spaiul ntre componentele dispunerii tabelare este implicit 0 pixeli, att pe orizontal ct si pe vertical.

Dispunerea marginal

Dispunerile marginale (border layouts), create pornind de la clasa BorderLayout, mpart un container n cinci seciuni: nord, sud, est, vest i centru. Folosind dispunerea marginal, componentele din cele patru puncte cardinale vor ocupa spaiul de care au nevoie, iar centrul obine spaiul rmas disponibil. De obicei, acest aranjament are ca rezultat o component central de dimensiuni mari, nconjurat de patru componente mai subiri". Dispunerea marginal se obine folosind unul dintre constructorii Borderlayout() sau BorderLayout(int, int). Primul constructor creeaz o dispunere marginal fr nici un spaiu ntre componente. Al doilea constructor specific spaiul pe orizontal, respectiv pe vertical. Dup ce ai creat o dispunere marginal i ai stabilit-o drept administrator curent de dispunere pentru un container, componentele sunt adugate folosind o alt apelare a metodei add() dect cele folosite anterior: add(String, componenta) Al doilea argument al acestei metode este componenta care trebuie adugat n container. Primul argument este un ir care indic zona unde va fi plasat componenta. Exist cinci valori posibile: "North" (nord), "South" (sud), "East" (est), "West" (vest) i "Center" Centru). Urmtoarea instruciune adaug un buton, denumit butonTenninare, n poriunea nordic: add( "North" , butonTerminare) ; Combinarea administratorilor de dispunere Pentru a gsi dispunerea potrivit, de cele mai multe ori trebuie folositi mai multi administratori pentru aceeai interfa. Acest lucru se poate face adugnd mai multe containere ntrun container principal, fiecare dispunnd de propriul administrator de dispunere. Aceste containere se numesc panouri (panels) i sunt derivate din clasa Panel. Panourile sunt containere folosite pentru a grupa diferite componente. Cnd lucrai cu panouri trebuie s ine cont de urmtoarele: Panoul se umple cu componente nainte de a fi introdus ntr-un container mai mare; Panoul posed propriul administrator de dispunere. Crearea unui panou: Panel panou=new Panel(); Panoului i se atribuie o metod de dispunere prin apelarea metodei setLayout(), ca n exemplul: BorderLayout b1=new BorderLayout(); panou.setLayout(b1); Componentele se adaug apoi folosind metoda add().

Dispuneri complexe
Dispunerea n stiv O dispunere n stiv (card layout) difer de celelalte deoarece ascunde vederii unele componente. O dispunere n stiv este un grup de containere sau de componente afiate cte unul o dat. Fiecare container din grup este denumit card (cartel). n mod normal, dispunerea n stiv folosete un panou pentru fiecare cartel. Mai nti se introduc componente n panouri, dup care acestea se introduc n containerul pe care s-a stabilit o dispunere n stiv. O dispunere n stiv se creeaz cu ajutorul clasei CardLayout, apelnd constructorul acesteia: CardLayout cc=new CardLayout(); Pentru a stabili administratorul de dispunere pentru un container se folosete metoda setLayout(). Dup ce ai stabilit un container se folosete metoda add(String, container). Al doilea argument specific containerul sau componenta care reprezint cartela. Dac este vorba de un container acesta trebuie s conin deja toate componentele necesare. Primul argument este un ir care reprezint numele cartelei. Acesta poate fi oricare, ca n exemplul: add(Cartela de optiuni, optiuni) prin care se adaug n container un panou numit optiuni i i se atribuie numele Cartela de optiuni. Dup ce s-a adugat cartela n containerul principal al programului, se poate folosi metoda show() a administratorului de dispunere n stiv, metod ce primete dou argumente: Containerul n care au fost adugate cartelele. Dac containerul este chiar fereastra principal se poate folosi this. Numele cartelei Urmtorul exemplu apeleaz metoda show() a administratorului de dispunere n stiv denumir cc: cc.show(this,Cartela de date) La afiarea unei cartele, cartela afiat anterior este ascuns. Dispunerea tabelar neproporional O astfel de dispunere difer de una tabelar simpl prin urmtoarele: O component poate ocupa mai multe celule ale tabelului Proporiile dintre diferitele rnduri i coloane ale tabelului nu trebuie s fie aceleai Componentele dispuse n cadrul celulelor pot fi aranjate n diverse moduri Pentru a crea un astfel de mod de dispunere se folosesc clasele GridBagLayout i o clas extern GridBagConstraints. Prima este administratorul de dispunere iar a doua este folosit pentru a defini restriciile fiecrei componente. Se parcurg etapele: 1. crearea unui obiect GridBagLayout i definirea sa drept administrator curent 2. crearea unei noi instane a clasei GridBagConstraints 3. definirea restriciilor pentru o component 4. anunarea componentei i a restriciilor sale n administratorul de dispunere 5. introducerea componentei n container Exemplu: GridBagLayout tabel=new GridBagLayout(); GridBagConstraints restrictii = new GridBagConstraints(); setLayout(tabel); Button b=new Button(Salvare); restrictii.gridx=0;

restrictii.gridy=0; restrictii.gridwidth=1; restrictii.gridheight=1; restrictii.weightx=30; restrictii.weighty=30; restrictii.fill= GridBagConstraints.NONE; restrictii.anchor= GridBagConstraints.CENTER; tabel.setConstraints(b,restrictii); add(b); Etapele care trebuie parcurse la dispunerea tabelara neproporional Etapa 1. Proiectarea tabelului Initial se face o proiectare pe hrtie a tabelului, etichetnd celulele tabelului dup coordonatele lor x i y. Astfel, celula din colul de stnga sus are coordonatele 0,0, cea alturat are coordonatele 0,1 .a.m.d. Etapa a doua. Crearea tabelului O variant ar fi s se creeze o metod ajuttoare, care preia mai multe valori i stabilete restriciile pentru acestea. Asftel metoda definireRestrictii() preia apte argumente: un obiect GridBagConstraints i ase valori ntregi, care reprezint variabilele de instan gridx, gridy, gridwidth, gridheight, weightx i weighty. Metoda definireRestrictii este urmtoarea: void definireRestrictii(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) { gbc.gridx=gx; gbc.gridy=gy; gbc.gridwidth=gw; gbc.gridheight=gh; gbc.weightx=wx; gbc.weighty=wy; } Se creeaz apoi metoda init() , n care se creeaz de fapt dispunerea. public void init() {GridBagLayout tabel=new GridBagLayout(); GridBagConstraints restrictii =new GridBagConstraints(); SetLayout(tabel); restrictii.fill=GridBagConstraints.BOTH; } Se vor defini apoi restrictii corespunztoare fiecrei componente din interfa, ca n exemplul urmtor: definireRestrictii(restrictii, 0,0,1,1,100,100); Button eticheta1=new Button(nume); tabel.setConstraints(eticheta1,restrictii); add(eticheta1); Aceste linii vor stabili restriciile pentru un obiect, vor crea un buton, vor asocia acestuia restriciile i l vor aduga n panou. Primele dou argumente reprezint valorile gridx i gridy ale restriciilor. Acestea reprezint chiar coordonatele celulei ce conine componenta. Dac o component ocup mai multe celule se vor introduce coordonatele componentei cea mai din stnga-sus. Urmtoarele argumente reprezint gridwidth i gridheight. Ele nu reprezint laimea i nlimea n pixeli, ci reprezint numrul de celule pe care le ocup componenta. Ultimele dou argumente sunt proporiile weightx i weighty, folosite pentru a stabili proporiile rndurilor i a coloanelor, adic modul de distribuire al spaiului

suplimentar care rmne neutilizat dup amplasarea componentei. Dup stabilirea proporiilor ele pot fi atribuite unui obiect folosind metoda GridBagConstraints(). Etapa a treia: Determinarea proporiilor La determinarea proporiilor se ine cont de obiectele care se extind pe mai multe celule. Acestea trebuie s primeasc valoarea 0 n direcia n care se extind. Etapa a patra. Adugarea i aranjarea componentelor n aceast etap se stabilesc restriciile care arajeaz componentele n cadrul celulei. Exist dou astfel de restricii: fill (umplere) i anchor (ancorare). Restricia fill determin pentru componentele care se pot extinde n orice direcie n ce direcie se face aceast extindere i poate avea una dintre urmtoarele valori: GridBagConstraints.BOTH, care extinde componenta pentru a umple celula n ambele direcii GridBagConstraints.NONE, care determin componenta s fie afiat la cea mai mic dimensiune a sa GridBagConstraints.HORIZONTAL, care extinde componenta pe direcie orizontal GridBagConstraints.VERTICAL, care extinde componenta pe direcie vertical. Implicit restricia fill este NONE. A doua restricie care afecteaz modul n care apare o component ntr-o celul este anchor (ancorare) i ea se aplic doar componentelor care nu umplu ntreaga celul, indicnd funciilor AWT unde s plaseze componenta n cadrul celulei. Valori posibile: GridBagConstraints.NORTH, GridBagConstraints.SOUTH, GridBagConstraints.NORTHEAST, GridBagConstraints.SOUTHWEST, GridBagConstraints.EAST, GridBagConstraints.WEST, GridBagConstraints.SOUTHEAST, GridBagConstraintsNORTHWEST, GridBagConstraints.CENTER. Valoarea implicit este GridBagConstraints.CENTER.

Tratarea evenimentelor
Unul dintre lucrurile pe care le-ai nvat atunci cnd ai creat pentru prima dat un applet este c, atunci cnd acesta ruleaz, n fundal se desfoar o mulime de activiti. Sistemul de ferestre al Java apeleaz automat metode cum ar fi paint(), init() sau start(), atunci cnd este nevoie, fr nici o intervenie din partea dumneavoastr. Ca i programarea applet-urilor, tratarea evenimentelor presupune apelarea automat a unor metode atunci cnd aciunea unui utilizator duce la apariia unui eveniment.

Tipuri de evenimente
Un eveniment este generat ca rspuns la aproape orice aciune pe care o poate ntreprinde un utilizator pe parcursul ciclului de via al unui program Java. O micare a mouse-ului, un clic executat pe un buton, o apsare de tast, toate genereaz un eveniment. n programele dumneavoastr nu trebuie s tratai toate evenimentele ce por aprea. De fapt, v vei ocupa de acele evenimente la care vrei s rspund programul dumneavoastr; restul vor fi ignorate. De exemplu, dac utilizatorul execut un clic cu mouse-ul sau apas o tast, putei face ca programul s rspund la aceste evenimente. Iat cteva dintre evenimentele care pot fi tratate n programele dumneavoastr: Clicuri cu mouse-ul. Apsarea butonului mouse-ului (mouse down), eliberarea acestuia (mouse up) sau apsarea i eliberarea butonului pe aceeai poziie (mouse clic). Micri ale mouse-ului. Cursorul mouse-ului care prsete sau ptrunde pe suprafaa ocupat de o component a interfeei sau tragerea cu mouse-ul (drag - micrile efectuate de cursor atunci cnd butonul mouse-ului este apsat).

Apsri de taste. Apsarea tastei, eliberarea tastei, tastarea (apsarea i eliberarea unei taste). Evenimente ale interfeei utilizator. Execuia de clicuri pe butoane, derularea listelor, afiarea meniurilor derulante i aa mai departe. Metoda handleEvent ()

Tratarea evenimentelor reprezint domeniul n care au aprut cele mai multe modificri n trecerea de la Java 1.02 la Java 2. Evenimentele sunt generate i executate aproximativ n acelai mod, indiferent de versiunea de limbaj pe care o folosii; diferena const n modul cum acestea sunt recepionate i procesate. n Java 1.02, toate evenimentele care apar n ciclul de via al unui program sunt tratate de o metod denumit handleEvent(). Aceasta este definit n clasa Component, care este motenit de java.applet.Applet, devenind astfel disponibil tuturor applet-urilor. Atunci cnd un eveniment este transmis metodei handleEvent (), aceasta apeleaz apoi o metod specific de tratare a evenimentului, n funcie de tipul acestuia. Exemple de astfel de metode specifice sunt mouseDown(), mouseUp() sau keyDown(). Pentru a trata un eveniment n programele dumneavoastr, va trebui s suprascriei una dintre aceste metode specifice. Apoi, la apariia evenimentului respectiv, metoda respectiv va fi apelat. De exemplu, putei suprascrie metoda mouseDown() pentru a afia un mesaj n fereastra Applet. Atunci cnd apare un eveniment de acest tip (apsarea butonului mouse-ului), mesajul va fi afiat.

Tratarea clicurilor de mouse


Unul dintre cele mai des ntlnite evenimente care v-ar putea interesa este efectuarea unui clic cu mouse-ul. Evenimentele de acest tip apar atunci cnd utilizatorul execut un clic cu mouse-ul undeva, pe interfaa programului. Putei intercepta clicurile mouse-ului pentru diferite lucruri simple - de exemplu, pentru a activa sau dezactiva sunetul ntr-un applet, pentru a trece la urmtoarea plan a unei prezentri sau pentru a terge ecranul. De asemenea, clicurile cu mouse-ul pot fi folosite mpreun cu deplasrile acestuia pentru a realiza o form de interaciune mai complex cu utilizatorul. Evenimentele mouse down i mouse up Atunci cnd utilizatorul execut un clic cu mouse-ul, se genereaz dou evenimente: un eveniment mouse down, atunci cnd se apas butonul mouse-ului, i un eveniment mouse up, atunci cnd acesta este eliberat. Aceast divizare permite executarea unor aciuni diferite n cele dou etape ale clicului. Tratarea evenimentelor mouse-ului n applet-ul dumneavoastr este simpl; se suprascrie metoda corespunztoare, care va fi apelat la apariia respectivului eveniment. Iat un exemplu de semntur de metod pentru un eveniment mouse down: public boolean mouseDown(Event evt, int x, int y) { //. . . } Metoda mouseDown() (ca i metoda mouseUp()) primete trei parametri: evenimentul n sine i coordonatele x i y unde a aprut evenimentul respectiv. Argumentul evt reprezint o instan a clasei Event. Toate evenimentele genereaz o instan a clasei Event, care conine informaii privind locul i perioada cnd a avut loc evenimentul, tipul lui, precum i alte informaii. Uneori, existena unui astfel de pointer ctre un obiect Event este folositoare, aa cum vei descoperi mai trziu n aceast seciune.

Coordonatele x i y ale evenimentului, aa cum au fost ele transmise prin argumentele x i y ale metodei mouseDown(), v permit s determinai cu precizie locul unde s-a efectuat , clicul. Deci de exemplu, dac evenimentul mouse down a aprut n zona unui buton grafic, putei activa acel buton. Reinei c putei obine coordonatele x i y i din cadrul obiectului Event; n aceast metod, ele au fost transmise ca argumente separate pentru a se lucra mai uor cu ele.

Tratarea micrilor mouse-ului


Ori de cte ori se deplaseaz mouse-ul, se genereaz un eveniment. Deplasarea mouse-ului de la un capt la altul ale ferestrei applet-ului poate avea ca rezultat generarea a zeci de evenimente. AWT definete dou tipuri distincte de micri ale mouse-ului: "tragerea" mouse-ului (mouse drag), n care micrile se fac innd butonul mouse-ului apsat, i micri simple (mouse move), n care butonul nu este apsat. n plus, ori de cte ori mouse-ul intr pe sau iese de pe suprafaa applet-ului sau a oricrei componente sau container al acestuia, se genereaz evenimente mouse enter, respectiv mouse exit. Pentru fiecare dintre aceste evenimente exist metode speciale care le intercepteaz, aa cum metodele mouseDown() i mouseUp() interceptau clicurile mouse-ului. Evenimentele mouse drag i mouse move Pentru interceptarea i tratarea evenimentelor de deplasare a mouse-ului se folosesc metodele mouseDrag() i mouseMove(). Metoda mouseMove(), care trateaz micrile simple de mouse, adic cele cnd nu este inut apsat butonul mouse-ului, seamn foarte mult cu metodele care tratau clicurile de mouse: public boolean mouseMove(Event evt, int x, int y) { // ... } Metoda mouseDrag() trateaz micrile mouse-ului executate avnd butonul apsat (o micare complet de tragere" - drag - const dintr-un eveniment mouse down, o serie de evenimente mouse drag pentru fiecare pixel pe care se deplaseaz mouse-ul, urmat de un eveniment mouse up, la eliberarea butonului. Metoda mouseDrag() arat astfel: public boolean mouseDrag(Event evt, int x, int y) { // ... } De reinut c n cadrul ambelor metode, mouseMove() i mouseDrag(), argumentele pentru coordonatele x i y reprezint noua poziie a mouse-ului, i nu locul de pornire. Evenimentele mouse enter i mouse exit Metodele mouseEnter() i mouseExit() sunt apelate cnd indicatorul mouse-ului ptrunde sau prsete un applet sau o poriune a acestuia. Att mouseEnter(), ct i mouseExit() posed semnturi similare cu metodele pentru tratarea clicurilor. Acestea primesc trei argumente: obiectul Event i coordonatele x i y ale punctului unde mouse-ul a ptruns n applet sau l-a prsit. Urmtoarele exemple prezint semnturile metodelor mouseEnter() i mouseExit(): public boolean mouseEnter(Event evt, int x, int y) { // . . . } public boolean mouseExit(Event evt, int x, int y) { // ...

} Tratarea evenimentelor de tastatur Un eveniment de tastatur este generat ori de cte ori utilizatorul apas o tast. Prin folosirea acestor evenimente putei memora valorile tastelor apsate de utilizator pentru a executa o anumit aciune sau pentru a obine date de intrare de la utilizatorii applet-ului. Pentru ca evenimentul de tastatur sa fie recepionat de o component, aceasta trebuie s fie selectat (focused - n centrul ateniei"; cu alte cuvinte, s fie acea component a interfeei selectat pentru a primi datele de intrare). Vei nva mai trziu despre aceast selectare a componentelor, atunci cnd vei lucra cu evenimente de selectare (focus events). Selectarea este mai uor de neles dac luai exemplul unei interfee care conine mai multe cmpuri de text. Cursorul plpie n cmpul de text selectat, iar utilizatorul poate introduce text n acel cmp folosind tastatura. Nici un alt cmp nu poate primi date de la tastatur pn cnd nu este selectat. Toate componentele, inclusiv containerele, pot fi configurate pentru a fi selectate. Pentru a indica explicit c o component este selectat pentru a primi date de intrare (input focus), poate fi apelat metoda requestFocus() a componentei, fr argumente. Urmtoarea instruciune selecteaz un obiect Button, denumit terminare: terminare.requestFocus() ; Putei selecta fereastra Applet apelnd metoda requestFocus() a acesteia. Evenimentele key down i key up Pentru a trata un eveniment de tastatur poate fi folosit metoda keyDown(): public boolean keyDown(Event evt, int tasta) { // ... } Valorile generate de evenimentele key down - tast apsat - (i transmise metodei keyDown() drept argumentul tasta) sunt ntregi care reprezint valori Unicode, cum ar fi caractere alfanumerice, taste funcionale, tabulatori, tasta return (retur de car) i aa mai departe. Pentru a le folosi drept caractere (de exemplu, pentru a le tipri) trebuie s le convertii n caractere, astfel: caracterCrt = (char)tasta; Iat un exemplu simplu de metod keyDown(), care nu face altceva dect s afieze tasta pe care ai apsat-o, att ca valoare Unicode, ct i drept caracter : public boolean keyDown(Event evt, int tasta) { System.out.println("Valoare UNICODE: " + tasta) ; System.out.println("Caracter: " + (char) tasta) ; return true; } Ca i n cazul clicurilor de mouse, fiecare eveniment key down are i corespondentul key up tast ridicat. Pentru a intercepta evenimentele key up se folosete metoda keyUp(): public boolean keyUp(Event evt, int tasta) { // ... }

Taste prestabilite Clasa Event ofer un set de variabile de clas care reprezint cteva taste standard nealfanumerice, cum ar fi tastele funcionale sau tastele direcionale (cu sgei). Dac interfaa appletului dumneavoastr folosete aceste taste, putei crea un cod mai lizibil prin testarea acestora n metoda keyDown(), n loc s testai valorile numerice echivalente (de asemenea, dac folosii aceste variabile, codul dumneavoastr va funciona cu mai mare probabilitate pe alte platforme). De exemplu, cnd dorii s testai dac a fost apsat tasta direcional cu sgeata n sus (up arrow), putei folosi urmtoarea secven de cod: if (tasta = Event.UP) { // ... } Deoarece valorile acestor variabile de clas sunt ntregi, putei folosi pentru testarea lor instruciunea switch. n tabelul urmtor se prezint variabilele de clas Event pentru diferite taste, precum i semnificaia acestora. Tastele standard definite n clasa Event. Variabila de clas Event.HOME Event.END Event.PGUP Event.PGDN Event.UP Event.DOWN Event.LEFT Event.RIGHT Event.F1 Event.F2 Event.P3 Event.F4 Event.F5 Event.F6 Event.F7 Event.F8 Event.F9 Event.F10 Event.F11 Event.F12 Tasta reprezentat Tasta Home Tasta End Tasta Page Up Tasta Page Down Tasta Up Tasta Down TastaLeft Tasta Right Tasta F1 Tasta F2 Tasta F3 Tasta F4 TastaF5 Tasta F6 Tasta F7 Tasta F8 Tasta F9 Tasta F10 TastaF11 TastaF12 .

Tratarea evenimentelor componentelor


Tehnicile de tratare a evenimentelor pe care le-ai nvat pn acum sau axat pe interaciunea cu utilizatorul - execuia unui clic cu mouse-ul, apsarea unor taste i altele de acest gen. Exist i altfel de evenimente, care au loc pe componente cum ar fi butoane, zone de text sau alte elemente de interfa. De exemplu, butoanele folosesc evenimente declanate la apsarea lor. Nu trebuie s v intereseze evenimentul mouse down sau mouse up sau locul unde a aprut interaciunea respectiv; componenta se va ocupa de toate aceste evenimente n locul dumneavoastr. Urmtoarele evenimente pot fi generate prin interaciunea cu componentele interfeei:

Evenimente de aciune (action events). Sunt principalele evenimente ale majoritii componentelor interfeei, prin care se indic faptul c acestea au fost "activate". Evenimentele de aciune sunt generate atunci cnd este apsat un buton, cnd se selecteaz sau se deselecteaz o caset de validare sau un buton radio, cnd se alege o opiune dintr-un meniu sau cnd utilizatorul apas tasta Return sau Enter ntr-un cmp de text. Evenimente de selectare sau deselectare a listelor (list select/deselect events). Aceste evenimente sunt generate atunci cnd se selecteaz o caset de validare sau o opiune dintr-un meniu (list). Aceste exemple declaneaz, de asemenea un eveniment de aciune. Evenimente de primire sau cedare a seleciei (got/lost focus events). Aceste evenimente pot fi generate de orice component, fie ca rspuns la un clic de mouse, fie la selecionarea prin tasta Tab. Primirea seleciei (got focus) nseamn c acea component este selecionat i poate fi activat sau poate primi date de intrare. Cedarea seleciei (lost focus) nseamn c s-a selecionat o alt component. Tratarea evenimentelor de aciune

Un eveniment de aciune reprezint cel mai des ntlnit eveniment al unei interfee i, din acest motiv, exist o metod special pentru a-l trata, la fel cum exist metode pentru aciunile de mouse sau de tastatur. Pentru a intercepta un eveniment de aciune generat de o component se definete n applet o metod denumit action(),cu urmtoarea semntur: public boolean action(Event evt, Object arg) { // ... } Aceast metod action() ar trebui s arate asemntor cu metodele de tratare a evenimentelor de mouse sau de tastatur. Ca i acele metode, aceasta primete ca argument un obiect care refer evenimentul respectiv. Ea mai primete, de asemenea, un obiect suplimentar (n acest caz, parametrul arg), care poate fi de orice tip. Tipul acestui al doilea argument al metodei de aciune depinde de componenta interfeei care a generat aciunea. O caracteristic de baz ar fi c este vorba de "orice fel de argument", determinat de componenta nsi, care poate transmite informaiile suplimentare necesare pentru a procesa aciunea respectiv. Tabelul urmtor prezint argumentele suplimentare pentru fiecare tip de component. Componente Tip de argument Ce conine Butoane String Eticheta butonului Casete de validare Boolean ntotdeauna true Butoane radio Boolean ntordeauna true Meniuri de opiuni String Eticheta elementului selectat Cmpuri de text String Textul din cadrul cmpului n cadrul metodei action(), primul lucru care trebuie fcut este s testai care component a generat aciunea (spre deosebire de evenimentele de mouse sau de tastatur, n care aceasta nu conta, deoarece toate componentele puteau genera aciuni). Din fericire, obiectul Event pe care l primii ca argument n apelul metodei action() conine o variabil de instan denumit target (int), care conine o referin ctre obiectul ce a generat evenimentul. Putei folosi operatorul instanceof pentru a afla ce component a generat evenimentul, ca n urmtorul exemplu: public boolean action(Event evt, Object arg) { if (evt.target instanceof textField) return handleText(evt.target); else if (evt.target instanceof Choice); return handleChoice(arg);

// ... return false; } n acest exemplu, metoda action() putea fi generat fie de o component TextField (cmp de text), fie de un meniu cu opiuni; instruciunea if determin care dintre acestea dou a generat evenimentul i apeleaz o alt metod (aici, handleText() sau handlechoice()), care trateaz, de fapt, evenimentul respectiv. (Nici handleText() i nici handleChoice() nu sunt metode AWT; sunt doar exemple de nume ce pot fi folosite drept metode ajuttoare. Se obinuiete s se creeze astfel de metode ajuttoare - helper - aa nct metoda action() s nu devin prea ncrcat cu cod.) Ca i n cazul altor metode de tratare a evenimentelor, action() returneaz o valoare Boolean. La fel, trebuie s returneze true dac va trata evenimentul respectiv i false dac acesta va fi ignorat sau tratat n alt parte. n acest exemplu ai transferat controlul metodelor handleText() sau handleChoice(), care vor returna true sau false, aa ca putei returna false (reinei, vei returna true numai daca metoda proceseaz evenimentul). Pot aprea complicaii dac avei mai multe componente aparinnd toate aceleiai clase - de exemplu, o mulime de butoane. Toate genereaz aciuni i toate sunt instane ale clasei Button. Aici intervine argumentul suplimentar: folosind cteva comparaii simple de iruri, putei folosi etichetele, elementele sau coninutul componentei pentru a determina care dintre ele a generat evenimentul. (Nu uitai s convertii prin cast argumentul n obiectul corespunztor.) public boolean action(Event evt, Object arg) { if (evt.target instanceof Button) { String eticheta = (String)arg; if (eticheta.equals("OK")) // trateaza butonul OK else if (eticheta.equals ("Anulare")) // trateaza butonul Anulare else if (eticheta.equals("Navigare")) // trateaza butonul Navigare // ... } }

Tratarea evenimentelor de selectare


Aa cum am artat mai devreme, evenimentele de aciune sunt de departe cele mai des ntlnite evenimente pe care le vei trata ntr-o interfa. Totui, mai exist i alte elemente pe care le putei folosi n programele dumneavoastr: list select (selecie list), list deselect (deselecie list), got focus (primire selecie) i lost focus (cedare selecie). Pentru evenimentele got focus i lost focus se pot folosi metodele gotFocus() i lostFocus(), care se folosesc la fel ca metoda action(). Iat semnturile lor: public boolean gotFocus(Event evt, Object arg) { // ... } public boolean lostFocus(Event evt, Object arg) { // ... } Pentru evenimentele de selectare i deselectare de liste nu sunt disponibile metode uor de suprascris. Pentr a trata aceste evenimente trebuie folosit metoda handleEvent(), ca n exemplul urmtor: public boolean handleEvent(Event evt) {

if (evt.id == Event.LIST_SELECT) handleSelect(Event); else if (evt.id == Event.LIST_DESELECT) handleDeselect(Event) ; else return super.handleEvent(evt); } n acest extras de cod, Event.LIST_SELECT i Event.LIST_DESELECT reprezint identificatorii oficiali ai evenimentelor de selectare/deselectare liste, iar controlul este transferat ctre dou metode ajuttoare ( handleSelect() i handleDeselect () ), care se presupune c sunt definite n alt parte. Remarcai, de asemenea, apelul ctre super.handleEvent() din final; acesta permite celorlalte evenimente s fie transferate fr probleme ctre metoda handleEvent() original. Evenimente ale zonelor de text Zonele de text prezint aceleai evenimente ca i cmpurile de text. Putei folosi metodele gotFocus() i lostFocus() pentru a intercepta evenimentele de primire/cedare a selecei: public boolean gotFocus(Event evt, Object arg) { // . .. } public. boolean lostFocus(Event evt, Object arg) { // ... } Evenimente ale listelor derulante Listele derulante genereaz trei tipuri de evenimente diferite; selectarea sau deselectarea unui element individual al listei are ca efect un eveniment de selectare/deselectare list, iar dublul clic executat pe un element al listei are ca efect un eveniment de aciune. Putei suprascrie metoda action() pentru a trata elementul din list pe care s-a efectuat dubluclic. Pentru seleciile i deseleciile din list, putei s suprascriei metoda handleEvent() i s testai identificatorii de eveniment LIST_SELECT i LIST_DESELECT. Evenimente ale barelor de derulare Numai pentru diferitele tipuri de micri ale acestora este generat o ntreag gam de evenimente. Pentru toate acestea va trebui s folosii metoda handleEvent(). Tabelul urmtor prezint identificatorii de evenimente care v intereseaz i micrile care declaneaz aceste evenimente. Evenimente ale barelor de derulare Identificatorul evenimentului SCROLL_ABSOLUTE SCROLL_LINE_DOWN SCROLL_LINE_UP SCROLL_PAGE_DOWN SCROLL_PAGE_UP Ce reprezint Generat la deplasarea casetei barei de derulare Generat la selectarea butonului din captul de jos sau din stnga al barei de derulare Generat la selectarea butonului din captul de sus sau din dreapta al barei de derulare Generat la selectarea spaiului aflat dedesubtul (sau la stnga) casetei barei de derulare Generat la selectarea spaiului aflat deasupra (sau

la dreapta) casetei barei de derulare

S-ar putea să vă placă și