Sunteți pe pagina 1din 100

Laborator 1:

Introducere n Java

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 2 octombrie 2011

I.

NOIUNI TEORETICE A. Ce este Java?

Java nu este doar un limbaj de programare ci este i mediu de programare ce ofer utilizatorului att cadrul ct i uneltele necesare pentru a dezvolta aplicaii Java. Limbajul Java poate caracterizat ca un limbaj: 1. simplu: tehnologia Java conine aa numitul Garbage Colector care elibereaz programatorul de grija dezalocrii memoriei. 2. familiar: limbajul Java respect o mare parte a gramaticii i a sintaxei de programare C/C++. 3. robust: un program Java este mai puin supus erorilor datorit celor dou nivele de vericare ale acestuia. Un nivel de vericare este la compilare i unul este la rulare. 4. orientat pe obiecte: spre deosebire de limbajul C++, Java este n ntregime orientat pe obiecte. 5. dinamic: multe decizii privind evoluia programului se iau in momentul rulrii, la runtime. 6. ce asigur un nivel ridicat de securitate: programele Java sunt vericate pas cu pas n timpul rulrii, astfel evitndu-se accesul la zone nepermise. 7. independent de platform: un program Java poate rulat pe orice platform pe care a fost instalat o main virtual Java (Java Virtual Machine ). 8. adaptat pentru multithreading: tehnologia Java permite ca un program s execute mai multe sarcini aparent n acelai timp, utiliznd mai multe re de execuie (thread-uri ). 9. adaptat pentru aplicaii distribuite

B.

Pachetul JDK

Mediul JDK (Java Developers Kit ) conine o serie de biblioteci de clase Java necesare scrierii unui program i un set de utilitare necesare compilrii, execuiei i documentrii unei aplicaii 2

Java. n Java o bibliotec este cunoscut sub numele de package. Package-urile Java incluse n JDK formeaz API (Application Programming Interface ). Mai multe informaii se gsesc aici.

C.

Dezvoltarea i execuia unei aplicaii Java

Paii ce trebuie urmai pentru a putea crea un program Java sunt urmtorii: 1. scrierea codului; 2. compilarea; 3. interpretarea i lansarea n execuie. Aceste operaii sunt prezentate n gura urmtoare:

Figura 1: Etapele dezvoltrii i execuiei unei aplicaii Java stand-alone.

D.

Structura unui program Java

1 package main ; 2 3 public c l a s s MyProgram { 4 5 6 7 } } public s t a t i c void main ( S t r i n g // i n t r u c t i u n i args [ ] ) {

Listing 1: Descriptive Caption Text

linia 1: main reprezint pachetul din care face parte clasa MyProgram. Fizic, un pachet este un director al proiectului.

linia 3: clasa MyProgram are modicatorul de acces public ; linia 4: metoda main are modicatorul de acces public, are ca parametru irul de caractere args i nu returneaz nimic. De asemenea, cuvntul rezervat static determin ca metoda main s depind de clasa MyProgram i nu de o instan a acesteia.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Editarea unei aplicaii Java

Codul surs Java const din unul sau mai multe iere text ce au extensia .java. Pentru scrierea codului se poate folosi orice editor de text. Ca exemplu se folosete codul urmtor:
1 public c l a s s H e l l o W o r l d { 2 3 4 5 } } public s t a t i c void main ( S t r i n g args [ ] ) {

System . o u t . p r i n t l n ( " H e l l o World ! ! ! " ) ;

Listing 2: Descriptive Caption Text

De reinut c numele clasei trebuie s coincid cu numele ierului a crui extensie este .java.

B.

Compilarea unei aplicaii Java

Pasul urmtor este compilarea programului. Acest lucru se realizeaz dintr-o fereastr de sistem cu ajutorul comenzii: javac HelloWorld.java Dac operaia de compilare s-a desfurat cu succes, n acelai director ar trebui s apar un ier cu acelai nume, dar cu extensia .class. n cazul n care ierul amintit anterior nu s-a generat, nseamn c s-au ntmpinat probleme la compilare. O posibil problem ar ca sistemul de operare s nu poat lansa n execuie utilitarul javac. Mesajul de eroare este, n acest caz, javac is not recognized as an internal or external
command, operable program or batch le. Pentru a rezolva aceast eroare trebuie setat variabila

de sistem path pentru a cuprinde i directorul n care se a javac (Exemplu: C:\Program Files \Java \jdk1.6.0_23 \bin). O alt cauz ar putea lipsa pachetului JDK din sistem. Soluia ar instalarea acestuia. Pachetul poate descarcat de la aceast adres. 4

C.

Lansarea n execuie a unei aplicaii Java

Dup compilare s-a obinut HelloWorld.class. Pentru a-l lansa n execuie se folosete comanda:
java HelloWorld . n urma acestei comenzi va aprea n consol mesajul Hello World!!!.

D.

Preluarea parametrilor din linie de comand

Urmtorul exemplu este o aplicaie care spune Hello utilizatorilor ce i dau numele ca parametru de apel al acesteia. Aplicaia va prelua toi aceti parametri din argumentul metodei main numit args. Acesta este un tablou de iruri de caractere ce va conine toi parametrii din linie de comand ce urmeaz dup numele programului.
1 public c l a s s 2 3 4 5 6 7 8 9 10 } } } } for ( int i =0; i <a r g s . l e n g t h ; i ++){ afiseaza fiecare element din tabloul args HelloUsers { args [ ] ) { public s t a t i c void main ( S t r i n g if

( a r g s . l e n g t h == 0 ) { // daca nu s u n t argumente System . o u t . p r i n t l n ( " I n t r o d u c e t i c e l p u t i n unnume " ) ;

System . o u t . p r i n t l n ( " H e l l o , "+a r g s [ i ]+ " ! " ) ; // s e

Listing 3: Descriptive Caption Text

Dup ce programul a fost compilat i a fost obinut ierul class, se lanseaz n execuie astfel:
java Hello Mihai Radu Ana . n consol se aeaz: Hello, Mihai! Hello, Radu! Hellor, Ana!

III.

TEM

Editai, compilai i lansai n execuie aplicaiile: 1. HelloWorld din seciunea II A; 2. HelloUsers din seciunea II D.

Laborator 2:
Instruciuni Java i lucru cu iruri de caractere

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 18 octombrie 2011

I. A.

NOIUNI TEORETICE Instruciuni condiionale 1. Intruciunea if else

Forma general:
if(expresie_condiional) secven_if; else secven_else;

Dac expresie_condiional este evaluat la true, atunci se execut secven_if. n caz contrar, se execut secven_else. Este necesar ca expresie_condiional s e evaluat la o valoare boolean. n plus, prezena structurii else nu este obligatorie i pot exista cazuri de folosire a instruciunii if else n cascad.

2.

Intruciunea switch

Forma general:
switch(expresie_condiie) { case val1: secvena1; <break>; ...; case valN: secvenaN; <break>; <default:> secvena_default; }

Pentru utilizarea acestei instruciuni este necesar ca att tipul de date al lui expresie_condiie ct i cel al valorilor val1, . . . , valN s e din categoria tipurilor numerice: byte, char, short,

int. Astfel c, primul pas const n evaluarea valorii expresiei expresie_condiie. Apoi se compar valoarea evaluat cu prima valoare a lui case, val1. Dac aceast valoare este egal cu val1 atunci se execut secvena1 pn la ntlnirea lui break. Dac instruciunea break nu este prezent, atunci se trece la execuia celorlalte secvene de tipul secvenaN, fr a mai testa celelalte valori din case. n cazul n care valoarea din condiie nu este egal cu nici o valoare din case atunci se execut secvena_default ce urmeaz lui default:. Cazul default permite executarea secvenei de dup el indiferent de valoarea expresiei de evaluat. Acesta poate lipsi.

B.

Instruciuni de ciclare 1. Intruciunea for

Forma general:
for(<secven_iniializare>;<expresie_condiie>;<secven_incrementare>) <secven_repetat>;

Intruciunea for face parte din instruciunile de ciclare cu test iniial.

De reinut c

secven_repetat se execut naintea secven_incrementare i c variabilele denite n secven_iniializare sunt valabile doar n interiorul for-ului. Tot ce este ntre <> poate lipsi, astfel nct putem avea for(;;) pentru a putea realiza un ciclu innit.

2.

Intruciunea while

Forma general:
while(expresie_condiie) secven_repetat;

n execuia instruciunii while, la nceput, se evalueaz expresie_condiie. Dac aceasta are valoarea true atunci se trece la execuia secven_repetat. Dac valoarea este de la bun nceput false, secvena din cadrul buclei nu va mai deloc executat. Se observ c i aceast instruciune face parte din cele de ciclare cu test iniial.

3.

Intruciunea do while

Forma general:
do secven_repetat while(expresie_condiie);

n execuia instruciunii do while, nti se execut secven_repetat i abia apoi se evalueaz expresie_condiie. Astfel, chiar dac expresia de evaluat este fals, secven_repetat tot se execut mcar o dat. De aceea, instruciunea do while face parte din cele de ciclare cu test nal.

C.

Instruciuni de salt

Intruciunea: 1. break este utilizat pentru ntreruperea execuiei instruciunilor de ciclare i a celor switch; 2. continue poate folosit doar n interiorul instruciunilor de ciclare fornd trecerea la un nou ciclu; 3. return este utilizat pentru ieirea forat dintr-o metod.

D.

Lucru cu iruri de caractere

Cele mai cunoscute clase care lucreaz cu iruri de caractere sunt: String, StringBuer.

1.

Clasa String

Cea mai important caracteristic a clasei String este c obiectele o dat iniializate nu se mai pot modica, ecare dintre aceste obiecte indicnd spre o zon diferit de memorie. O alt proprietate a obiectelor de tip String este c pot utilizate impreun cu operatorul +, pentru concatenarea irurilor. Prin concatenare se instaniaz un nou obiect de tip String care va referenia un ir alctuit din irurile alipite cu ajutorul operatorului +. Aceast clas ofer o serie de metode pentru lucru cu iruri de caractere. Aceste metode au n vedere compararea irurilor, cutarea n iruri, amd. Se recomand studierea API-ului. 4

2.

Clasa StringBuer

Un obiect StringBuer reprezint ca i n cazul clasei String un ir de caractere. Diferena ntre cele dou este c primul obiect poate suferi modicri. Acest lucru este posibil datorit metodelor insert() i append() care permit inserarea, respectiv adugarea unor iruri de caractere. Pentru mai multe informaii se recomand studierea API-ului.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Instruciuni Java

Codul surs de mai jos exemplic modul de utilizare al instruciunilor din seciunile I A, I B, I C.
1 import j a v a . u t i l . S c a n n e r ; 2 3 public c l a s s 4 5 TestIntructiuni { args [ ] ) { // cu a j u t o r u l acestei instructiuni se citeste t e x t de l a

public s t a t i c void main ( S t r i n g

S c a n n e r s = new S c a n n e r ( System . i n ) ; tastatura

6 7 8

System . o u t . p r i n t l n ( " I n t r o d u c e t i unnumar : " ) ; int x = s . nextInt ( ) ; // i n x s e va r e t i n e numarul t a s t a t a p e l e a z a metoda t e s t cu p a r a m e t r u x

System . o u t . p r i n t l n ( " R e z u l t a t u l f u n c t i e i e s t e : " + t e s t ( x ) ) ; / s e /

9 10 11 12 13 14 15 16

public s t a t i c

int

t e s t ( int x ) { initializeaza i ++) { v a r i a b i l a suma cu 0

i n t suma = 0 ; // s e for ( int i = 0;

i < 4;

System . o u t . p r i n t l n ( "Am i n t r a t i n n i v e l 1 " ) ; int j = 0; se efectueaza evaluarea expresiei j < x si abia apoi se incrementeaza

while ( j++ < x ) { // i n t a i variabila j

17 18 19 20

System . o u t . p r i n t l n ( "Am i n t r a t i n n i v e l 2 " ) ; System . o u t . p r i n t l n ( " i= " + i + " ; j= " + j ) ; switch ( i ) { // i n cazul in care i =0 , 1 s a u 2 s e din ciclul sare la urmatorul pas si se ignora restul instructiunilor

de dupa c o n t i n u e 21 22 23 24 25 26 27 28 29 30 31 32 } } case 0 : continue ; case 1 : continue ; case 2 : continue ; case 3 : // i n cazul in

curent

( while )

care

i =3 s e

a c t u a l i z e a z a suma s i

apoi

se

iese

fortat

din switch

suma += i+j ; break ;

System . o u t . p r i n t l n ( "Am i e s i t d i n n i v e l 2 " ) ;

33 34 35 36 37 38 } }

} System . o u t . p r i n t l n ( "Am i e s i t d i n n i v e l 1 " ) ; return suma ; // s e iese fortat d i n metoda t e s t

B.

Lucru cu iruri de caractere

Exemplul urmtor evideneaz caracterul imuabil pe care-l au obiectele de tip String. Se citete de la tastatur un ir de caractere i se veric dac acesta coincide cu un alt ir de caractere.
1 import j a v a . u t i l . ; 2 public c l a s s CheckPassword { 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 } } } // i f if ( password . e q u a l s ( u s e r I n p u t ) ) { System . o u t . p r i n t l n ( " Ai t a s t a t : " ) ; System . o u t . p r i n t l n ( u s e r I n p u t ) ; System . o u t . p r i n t l n ( " Dar p a r o l a e s t e : " ) ; System . o u t . p r i n t l n ( p a s s w o r d ) ; public s t a t i c void main ( S t r i n g args [ ] ) {

S c a n n e r s = new S c a n n e r ( System . i n ) ; String String password = " java " ; userInput ;

System . o u t . p r i n t l n ( " Care e p a r o l a ? " ) ; u s e r I n p u t= s . n e x t ( ) ;

( p a s s w o r d == u s e r I n p u t ) { System . o u t . p r i n t l n ( " Ai t r e c u t mai d e p a r t e ! " ) ;

} else { System . o u t . p r i n t l n ( "NU a i t r e c u t mai d e p a r t e ! " ) ;

Dei variabila userInput ar conine aceleai caractere ca variabila password, folosind operatorul == se va aa textul de pe ramura else a instruciunii if. Acest lucru se ntmpl din cauza faptului c se compar adresele de memorie ale variabilelor i nu coninutul de la acele zone de memorie. Decomentai linia 15 i comentai linia 16. Observai ce se intmpl dac variabilele conin acelai ir de caractere.

Urmtorul exemplu citete de la tastatur un ir de caractere i nlocuiete ecare vocal ntlnit cu urmtorul caracter din alfabet. Acesta folosete clasa StringBuer.

1 import j a v a . u t i l . S c a n n e r ; 2 public c l a s s R e p l a c e V o w e l { 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 } } } return s b . t o S t r i n g ( ) ; } for ( int if public s t a t i c String r e p l a c e V o w e l ( S t r i n g word ) { sb este intializata cu v a l o a r e a } public s t a t i c boolean checkVowel ( char c ) { c = C h a r a c t e r . toLowerCase ( c ) ; return ( " a e i o u " . i n d e x O f ( c ) >= 0 ) ; / s e caractere returneaza t r u e daca metoda i n d e x O f aplicata sirului de } public s t a t i c void main ( S t r i n g args [ ] ) {

S c a n n e r s = new S c a n n e r ( System . i n ) ; System . o u t . p r i n t l n ( " I n t r o d u c e t i c u v a n t u l : " ) ; S t r i n g word = s . n e x t L i n e ( ) ; System . o u t . p r i n t l n ( " Cuvantul r e z u l t a t e s t e : "+r e p l a c e V o w e l ( word . toLowerCase ( ) ) ) ;

" a e i o u " impreuna cu p a r a m e t r u c r e t u r n e a z a o v a l o a r e

p o z i t i v a /

StringBuffer

s b = new S t r i n g B u f f e r ( word ) ; / v a r i a b i l a variabilei word / i ++){ / s b s e parcurge caracter

i =0; i <s b . l e n g t h ( ) ;

c a r a c t e r cu c a r a c t e r / al lui sb este verificat i daca este v o c a l a / caracter

( checkVowel ( s b . c h a r A t ( i ) ) ) { / f i e c a r e sb . setCharAt ( i ,

( char ) ( s b . c h a r A t ( i ) +1) ) ; / s e pune pe din a l f a b e t /

pozitia

i n sb urmatorul

III.

TEM

1. Rulai programele din seciunea II. 2. Citii un ir de caractere de la tastatur. Folosind intruciunea switch, realizai un meniu pentru urmtoarele cerine: (a) s se aeze lungimea irului de caractere; (b) s se returneze ultima poziie pe care se ntlnete caracterul a; (c) s se numere de cte ori apare n irul de caractere secvena abc; (d) s se verifce dac irul de caractere este palindrom. (e) s se tearg toate caracterele de pe poziiile pare. Implementai cerinele de la punctele 2a pana la 2e.

Laborator 3:
Introducere n Programarea Orientat pe Obiecte

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 23 octombrie 2011

I.

NOIUNI TEORETICE A. Clase i obiecte

Unul dintre conceptele care denete programarea orientat pe obiecte este obiectul. Obiectul este caracterizat prin stare, modelat de atributele unei clase, i prin comportament, modelat de metodele unei clase. Un alt concept este clasa. Clasa este o colecie de obiecte care partajeaz aceeai lista de atribute informaionale (de stare) i comportamentale. Aadar, aceasta reprezint att structura unui obiect, ct i funcionalitatea acestuia. Mai mult, n acest context se spune c obiectul este o instan a unei clase. Forma general a unei clase:
[lista_Modicatori] class NumeClasa[extends NumeClasaDeBaza][implements lista_Interfata] { corp clasa }

Deniia unei clase trebuie s conin obligatoriu cuvntul cheie class, numele clasei i corpul clasei prins ntre acolade. Toi ceilali termeni pot lipsi. Vom discuta despre aceti termeni la momentul potrivit.

B.

Suprancrcarea metodelor

Forma general a unei metode:


[lista_Modicatori] tip_de_returnat numeMetoda([lista_parametrii]) { corp metoda }

O metod se denete prin semntur i prin corp. Semntura const n tipul returnat, numele metodei i lista de parametri, pe cnd corpul metodei este reprezentat de instruciuni. n Java, n aceeai clas, se pot deni metode cu acelai nume, dar cu semnturi diferite. Diferena poate consta n numrul de parametri, n tipul de date al acestora sau n ambele. Acest

proces se numete suprancrcare. Este important de reinut c Java nu ia n considerare tipul valorii returnate pentru a face diferenierea metodelor suprancrcate. Motivul pentru care se folosesc acest gen de metode este c se elimin nevoia de a deni metode complet diferite care s fac n principiu acelai lucru. De asemenea, suprancrcarea face posibil comportarea diferit a metodelor n funcie de argumentele primite.

C.

Constructori

ntr-o clas, pe lng atribute i metode, se pot deni i constructori. Acetia sunt un tip de metod special cu urmtoarele caracteristici: numele lor trebuie s e identic cu cel al clasei din care fac parte; nu au tip de returnat.
[lista_Modicatori] NumeClasa([lista_parametrii]) { corp constructor }

Constructorii sunt utilizai pentru instanierea unui obiect care face parte dintr-o anumit clas i sunt apelai n funcie de variabilele pe care le primesc ca parametru. n cazul n care nu se declar niciun constructor(doar n acest caz) compilatorul creeaz un constructor implicit, avnd numele clasei, fr niciun parametru formal i avnd corpul constructorului fr instruciuni. Metodele constructor pot i ele suprancrcate, la fel ca metodele obinuite, pentru a crea un obiect care are proprieti specice n funcie de argumentele transmise prin operatorul new.

D.

Motenire

Unul dintre principiile programrii orientate pe obiecte este motenirea. Acest principiu se bazeaz pe extinderea comportamentului unei clase existente prin denirea unei clase noi care motenete coninutul primei clase la care se adaug noi proprieti i funcionaliti. Clasa existent, care va motenit, se numete clasa de baz, clas printe sau superclas.

Clasa care realizeaz extinderea se numete subclas, clas derivat, clas descendent sau clas copil. Cuvntul predenit care se utilizeaz pentru motenire este extends.
[lista_Modicatori] class NumeSubclasa [extends NumeClasaDeBaza] { corp subclasa }

n ce privete tipul de motenire, n Java este permis doar cea simpl. Adic, o subclas poate extinde o singur superclas. n aceeai ordine de idei, o superclas poate motenit de mai multe subclase diferite. Motenirea multipl nu este permis n Java, dar este simulat cu ajutorul interfeelor. Acest aspect l vom trata ulterior. Prin operaia de derivare, constructorii clasei de baz nu se motenesc, n schimb ecare constructor al clasei derivate apeleaz un constructor al clasei de baz. Acest apel se poate face implicit(adugat de compilator) sau explicit. Apelul explicit se face prin intermediul cuvntului cheie super. n plus, constructorii se apeleaz n ordinea derivrii, de la superclas la sublcas.
public class NumeSubclasa extends NumeClasaDeBaza { NumeSubclasa(){ super(); //alte instructiuni constructor } }

II.

PREZENTAREA LUCRRII DE LABORATOR Suprancrcarea metodelor i constructorilor

A.

Codul surs urmtor exemplic conceptul de clas i obiect, mpreun cu ideea de suprancrcare att a constructorilor unei clase, ct i a metodelor unei clase. Clasa Point are ca atribute coordonatele in plan ale unui punct i calculeaz distana ntre dou puncte. Metoda care descrie funcionalitatea clasei Point (computeDistance()) este suprancrcat. Acest lucru s-a realizat prin schimbarea numrului de parametri ai acesteia i tipul lor.(observai linia de cod 29)

1 public c l a s s 2 3 4 5

Point {

public double x , y ;

public P o i n t ( ) { // c o n s t r u c t o r // this e s t e un c u v a n t obiectul cheie

fara ce

parametri reprezinta obiectul curent al clasei , i n t r u c a t nu s e s t i e cum s e

numeste 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 } } public S t r i n g } } // metoda e s t e } } } } this . x = 0; this . y = 0;

// c o n s t r u c t o r cu 2 p a r a m e t r i ;

constructorul a fost

supraincarcat

public P o i n t ( double x , double y ) { this . x = x ; this . y = y ;

// c o n s t r u c t o r cu un p a r a m e t r u ; public P o i n t ( double x ) { this . x = x ; this . y = 0;

constructorul a fost

supraincarcat

// metoda c a l c u l e a z a

distanta

i n t r e 2 puncte

aflate

in

plan

public s t a t i c double c o m p u t e D i s t a n c e ( P o i n t p1 , // s e folosesc metode a l e c l a s e i Math d i n

P o i n t p2 ) { java . lang 2) ) ;

pachetul

return Math . s q r t ( Math . pow ( p1 . x p2 . x ,

2 ) + Math . pow ( p1 . y p2 . y ,

supraincarcata

public s t a t i c double c o m p u t e D i s t a n c e ( double x1 , double y1 , double x2 , double y2 ) { return Math . s q r t ( Math . pow ( x1 x2 , 2 ) + Math . pow ( y1 y2 , 2) ) ;

public s t a t i c double c o m p u t e D i s t a n c e ( P o i n t p1 ) { / metoda e s t e return Math . s q r t ( Math . pow ( p1 . x , 2 ) + Math . pow ( p1 . y , 2) ) ;

s u p r a i n c a r c a t a /

toString (){

return " x= "+x+" ; y= "+y ;

Urmtoarea clas creeaz obiecte de tipul Point. Aceste obiecte sunt instaniate n moduri diferite. De asemenea, se apeleaz metoda static computeDistance() cu parametri diferii.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 System . o u t . p r i n t l n ( " C a l c u l e a z a d i s t a n t a i n t r e P2 s i P3 : "+P o i n t . c o m p u t e D i s t a n c e ( p2 , p3 ) ) ; System . o u t . p r i n t l n ( " C a l c u l e a z a d i s t a n t a i n t r e P2 s i P3 : "+P o i n t . c o m p u t e D i s t a n c e ( p2 . x , p2 . y , p3 . x , p3 . y) ) ; TestPoint { args ) { public s t a t i c void main ( S t r i n g [ ] P o i n t p1 = new P o i n t ( ) ; System . o u t . p r i n t l n ( " I n s t a t i e r e o b i e c t p r i n c o n s t r u c t o r f a r a p a r a m e t r i : P1 : "+p1 . t o S t r i n g ( ) ) ; P o i n t p2 = new P o i n t ( 2 , 2) ;

System . o u t . p r i n t l n ( " I n s t a t i e r e o b i e c t p r i n c o n s t r u c t o r cu 2 p a r a m e t r i : P2 : "+p2 . t o S t r i n g ( ) ) ; P o i n t p3 = new P o i n t ( 3 ) ; System . o u t . p r i n t l n ( " I n s t a t i e r e o b i e c t p r i n c o n s t r u c t o r cu 1 p a r a m e t r u : P3 : "+p3 . t o S t r i n g ( ) ) ;

12 13 14 } }

System . o u t . p r i n t l n ( " C a l c u l e a z a d i s t a n t a i n t r e P ( 0 , 0 ) s i P2 : "+P o i n t . c o m p u t e D i s t a n c e ( p2 ) ) ;

B.

Motenire

Pentru a exemplica principiul motenirii se d clasa de baz Fruct.


1 public c l a s s F r u c t { 2 3 4 5 6 7 8 9 // metoda g e t T i p F r u c t mostenesc 10 11 12 13 } } final String getTipFruct () { e s t e una de t i p final , adica a c e a s t a nu mai p o a t e fi m o d i f i c a t a de clasele care o } public F r u c t ( S t r i n g tipFruct ) { private S t r i n g tipFruct ;

this . tipFruct = tipFruct ; System . o u t . p r i n t l n ( " C o n s t r u c t o r F r u c t . . . " ) ;

return t h i s . t i p F r u c t ;

Clasa Para este subclas a clasei Fruct. Para este un fruct, aadar se respect principiul motenirii. n clasa Para se adaug noi atribute informaionale (greutate, culoare ) i un nou comportament reprezentat de metodele getGreutate(), getCuloare().
1 public c l a s s Para extends F r u c t { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 } } public S t r i n g getCuloare () { } // m e t o d e l e s u n t publice si deci pot fi vazute si in afara clasei , spre d e o s e b i r e de a t r i b u t e } public Para ( S t r i n g super ( t i p F r u c t ) ; t i p F r u c t , double g r e u t a t e , // a p e l a r e S t r i n g forma ) { clasei de baza cu p a r a m e t r u l tipFruct // a t r i b u t e l e sunt private , deci domeniul lor de vizibilitate se afla doar i n cadrul clasei Para

p r i v a t e double g r e u t a t e ; private S t r i n g culoare ;

explicita a constructorului

System . o u t . p r i n t l n ( " C o n s t r u c t o r Para . . . " ) ; this . greutate = greutate ; t h i s . c u l o a r e = forma ;

public double g e t G r e u t a t e ( ) { return g r e u t a t e ;

return c u l o a r e ;

Clasa TestFruct instaniaz un obiect de tip Para, implicit de tip Fruct. De aceea avem acces i la metoda getTipFruct() care nu aparine propriu-zis clasei Para. 6

1 public c l a s s 2 3 4 5 6 7 8 } }

TestFruct { args ){ // r e f e r i n t a de tipul para c l a s a de baza sublclasa

public s t a t i c void main ( S t r i n g [ ]

Para obPara = new Para ( " p a r a " , 3 , " g a l b e n " ) ;

System . o u t . p r i n t l n ( " Tip F r u c t : "+obPara . g e t T i p F r u c t ( ) ) ; System . o u t . p r i n t l n ( " g r e u t a t e : "+obPara . g e t G r e u t a t e ( ) ) ; System . o u t . p r i n t l n ( " c u l o a r e : "+obPara . g e t C u l o a r e ( ) ) ;

// a p e l a r e metoda d i n // a p e l a r e metoda d i n

Observai n urma rulrii aplicaiei ordinea n care se apeleaz constructorii.

III.

TEM

1. S se construiasc o clas Fractie care s implementeze operaiile de adunare, scdere, nmulire, mprire i simplicare. S se foloseasc aceast clas ntr-un program. 2. S se construiasc o clas Forma2D i o clas Cerc care motenete clasa Forma2D. S se aeze lungimea cercului i suprafaa acestuia.

Laborator 4:
Continuare Programare Orientat pe Obiecte

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 29 octombrie 2011

I. A.

NOIUNI TEORETICE Suprascrierea metodelor

O clas derivat poate declara o metod cu aceeai semntur cu a unei metode din clasa de baz. Metoda din clasa derivat substituie astfel metoda din clasa de baz. Aceast tehnic se numete suprascriere. Cu alte cuvinte, la apelul metodei suprascrise din clasa derivat se va executa metoda declarat n clasa derivat. Dac se dorete apelul metodei ce aparine clasei de baz, atunci n metoda din clasa descendent se folosete cuvntul cheie super urmat de operatorul . i numele metodei suprascrise. Sunt cazuri n care suprascrierea unei metode nu este dorit. Acest lucru se poate realiza prin adugarea cuvntului cheie nal. Astfel c, o metod declarat nal n superclas nu poate suprascris n subclas. Diferena ntre o metod suprascris i una suprancrcat este c n cazul celei suprascrise semntura este identic(att numrul parametrilor ct i tipul acestora).

B.

Clasa Object

n Java, toate clasele formeaz o anumit structur arborescent, care are ca rdcin clasa Object. Implicit, aceasta este superclasa tuturor claselor i nu are o clas printe. Metodele principale ale clasei Object sunt: clone Semntura aceste metode este: protected Object clone() i returneaz o clon a obiectului cruia i se aplic, deci un obiect cu aceeai stare i acelai comportament. Cu toate acestea, obiectul rezultat nu este tocmai identic deoarece adresa de memorie ctre care face referin este diferit de cea a obiectului original. Dup ce se execut instruciunea b=a.clone(), n care a i b sunt referine la obiecte, expresia a==b va avea valoarea false, deoarece valorile variabilelor referin a si b sunt diferite, n timp ce expresia a.equals(b) va ntoarce valoarea true, deoarece cele dou obiecte comparate au coninuturi identice.

equals Semntura metodei este public boolean equals(Object obj) i returneaz valoarea true dac i numai dac obiectele comparate sunt ntr-adevr identice; adic obiectele au acelai coninut i aceeai adres de memorie. hashCode Semntura metodei este public int hashCode() i returneaz un ntreg care este folosit de Java pentru a diferenia dou obiecte. Se recomand ca atunci cnd se dorete suprascrierea metodei equals(), s se suprascrie i metoda hashcode(). Este important ca dou obiecte egale conform metodei equals() s aib aceleai hashcode-uri. toString Semntura metodei este public String toString() i returneaz un ir de caractere de forma java.lang.Object@hashCode n care hashCode este exprimat n hexazecimal. Acest ir de caractere reprezint obiectul cruia i se aplic. De aceea, se recomand suprascrierea metodei toString() n toate subclasele clasei Object pentru ca mesajul s poat neles cu mai mult uurin. Pentru mai multe informaii se recomand citirea API-ului.

C.

Clase i metode abstracte

Forma general a unei clase abstracte este:


[modicator_acces] abstract class NumeClasa{ }

O clas abstract este utilizat pentru modelarea unor concepte abstracte i poate reprezenta doar clasa de baz n procesul de motenire. Un lucru important de reinut atunci cnd se lucreaz cu clase abstracte este acela c o clas abstract nu poate instaniat. Alte caracterisitici ale unor clase de acest fel sunt urmtoarele: pot implementa constructori; pot avea atribute ce suport modicri;

pot avea metode abstracte. O metod abstract este o metod ce nu are corp (instruciuni) i care ntr-o clas descendent a clasei abstracte trebuie implementat. Dac metoda declarat abstract n clasa de baz nu este implementat n subclas, atunci trebuie declarat din nou abstract. Astfel i subclasa devine una abstract. pot avea i metode clasice (corpul acestora este implementat n clasa abstract); dei clasele abstracte nu pot instaniate, se pot declara obiecte de tipul claselor abstracte i s e instaniate de clasele derivate.

D.

Interfee

Forma general a unei interfee este:


[modicator_acces] interface NumeInterfata [extends lista_interfete] { }

O interfa este un fel de clas abstract cu diferena c ntr-o interfa nici o metod declarat nu are voie s aib corp. Interfeele sunt utilizate pentru a separa implementarea de deniia metodelor. Spre deosebire de o clas abstract, o interfa nu poate deni un constructor, iar atributele existente sunt implicit declarate ca ind statice i nale, acestea devenind constante. Iar spre deosebire de o clas obinuit, o interfa poate moteni mai multe interfee (intervine ideea de motenire multipl). Forma general a unei clase care motenete o interfa sau o list de interfee este:
[modicator_acces] class NumeClasa [extends NumeSuperclasa] implements lista_interfete{ }

De aici se poate trage concluzia c o clas poate implementa una sau mai multe interfee. De asemenea, se pstreaz regula de la clasele abstracte cum c o clas care motenete o interfa trebuie s i implementeze toate metodele. Dac acest lucru un se ntmpl, atunci n clas metodele devin abstracte.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Suprascrierea metodelor

Se d clasa Superclasa care conine o singur metod. Clasa Subclasa motenete Superclasa i suprascrie metoda aseazaDescriere. Observai semnturile metodelor; sunt identice.
1 public c l a s s 2 3 4 5 } } Superclasa { public void a f i s e a z a D e s c r i e r e ( ) { System . o u t . p r i n t l n ( " a p e l a r e a f i s e a z a D e s c r i e r e d i n s u p e r c l a s a . . . " ) ;

1 public c l a s s 2 3 4 5 6 7 } }

S u b c l a s a extends S u p e r c l a s a {

public void a f i s e a z a D e s c r i e r e ( ) { // a p e l a r e e x p l i c i t a a metodei din c l a s a de baza

// s u p e r . a f i s e a z a D e s c r i e r e ( ) ; System . o u t . p r i n t l n ( " a p e l a r e a f i s e a z a D e s c r i e r e d i n s u b c l a s a . . . " ) ;

n clasa descendent, n metoda suprascris se poate apela metoda original (din clasa de baz) folosind cuvntul cheie super. Decomentai linia de cod numrul 4 din Subclasa i observai ce se aeaz la urmtoarea rulare.
1 public c l a s s 2 3 4 5 6 7 8 9 10 } } TestSuprascriere { args ){ public s t a t i c void main ( S t r i n g [ ] Superclasa

s u p e r C l a s a = new S u p e r c l a s a ( ) ;

S u b c l a s a s u b C l a s a = new S u b c l a s a ( ) ; superClasa . a f i s e a z a D e s c r i e r e () ; subClasa . a f i s e a z a D e s c r i e r e ( ) ; superClasa = subClasa ; superClasa . a f i s e a z a D e s c r i e r e () ; System . o u t . p r i n t l n ( ) ;

System . o u t . p r i n t l n ( ) ;

B.

Clasa Object

Clasa Point are dou atribute de tipul double i suprascrie metodele clone, equals, hashCode i toString ale clasei Object. Observai n linia de cod 1 cuvintele implements Cloneable. Orice clas care extinde clasa Object i care i suprascrie metodele trebuie s implementeze interfaa Cloneable. Despre interfee se discut pe larg n seciunile I D i II D. Pentru a respecta proprietile metodei hasCode, de a returna un numr ntreg care s diferenieze dou obiecte diferite, se implementeaz un algoritm care produce un astfel de numr. n 5

exemplul prezentat (linia de cod 30), algoritmul const n nmulirea cu un numr prim i nsumarea membrilor obiectului. Cu ct algoritmul matematic este mai complex cu att regulile hashCode sunt respectate n mai multe cazuri.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 } } public S t r i n g toString (){ } public i n t hashCode ( ) { double r e s u l t = 1 7 ; r e s u l t = 37 r e s u l t + t h i s . x ; r e s u l t = 37 r e s u l t + t h i s . y ; return ( i n t ) r e s u l t ; / s e de t i p double , f a c e un c a s t iar la tipul int , intrucat variabila result i n t / e s t e una } if public boolean e q u a l s ( O b j e c t o b j ) { if ( o b j == t h i s ) return true ; // r e f e r i n t e egale } protected P o i n t clone () { } public void s e t Y ( double y ) { this . y = y ; } public void s e t X ( double x ) { this . x = x ; P o i n t implements C l o n e a b l e { p r i v a t e double x , y ;

P o i n t pObj = new P o i n t ( ) ; pObj . x = t h i s . x ; pObj . y = t h i s . y ; return pObj ; // o b i e c t u l pObj a r e membrii identici cu cei ai obiectului curent

( ! ( obj instanceof Point ) ) return f a l s e ; // o b j nu e s t e de // s e tipul Point adica obj este convertit la tipul Point

Point p = ( Point ) obj ; if ( t h i s . x != p . x return f a l s e ; return true ; ||

f a c e un d o w n c a s t i n g ,

t h i s . y != p . y ) diferita

// c o o r d o n a t a x s a u y e s t e

f u n t i a hashCode r e t u r n e a z a o v a l o a r e de t i p

return " x= "+x+" ; y= "+y ;

Clasa TestObject creeaz un obiect de tipul Point, i seteaz proprietile i i apeleaz metodele.
1 public c l a s s 2 3 4 5 6 7 8 9 TestObject { args ){ public s t a t i c void main ( S t r i n g [ ] P o i n t p1 = new P o i n t ( ) ; p1 . s e t X ( 3 ) ; p1 . s e t Y ( 4 ) ; P o i n t p1Clone = p1 . c l o n e ( ) ; System . o u t . p r i n t l n ( " P1 : "+p1 . t o S t r i n g ( ) ) ; System . o u t . p r i n t l n ( " Clona l u i P1 : "+p1Clone . t o S t r i n g ( ) ) ; if ( p1 . e q u a l s ( p1Clone ) )

10 11 12 13 14 15 } }

System . o u t . p r i n t l n ( " O b i e c t e l e s u n t i d e n t i c e ! " ) ; e l s e System . o u t . p r i n t l n ( " O b i e c t e l e nu s u n t i d e n t i c e ! " ) ; System . o u t . p r i n t l n ( " Hashcode u l l u i P1 e s t e : "+p1 . hashCode ( ) ) ; System . o u t . p r i n t l n ( " Hashcode u l c l o n e i l u i P1 e s t e : "+p1Clone . hashCode ( ) ) ;

C.

Clase i metode abstracte

Pentru a exemplica utilizarea claselor i metodelor abstracte vom folosi clasa Produs. S presupunem c vrem s derivm un numr mai mare de clase din Produs : Carte, RamaFoto, etc. Se observ c acestea au n comun preul, o descriere i eventual o reducere a preului n funcie de anumite proprieti ale ecrui produs n parte. n acest caz, obiecte de genul Carte sau RamaFoto trebuie s fac parte din clase care motenesc o superclas comun, Produs. Mai mult, ar trebui ca Produs s implementeze metodele aseazaDescriere i calculeazaReducere. Pentru c implementarea metodelor depinde de tipul obiectului i proprietilor acestuia, metodele se declar abstracte n clasa Produs.
1 public a b s t r a c t c l a s s Produs { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 } // m e t o d e l e // e l e vor a b s t r a c t e nu au c o r p fi implementate in clasele copil ale clasei Produs } public double g e t P r e t U n i t a r ( ) { return p r e t U n i t a r ; } Produs ( double p r e t U n i t a r ) { this . pretUnitar = pretUnitar ; p r i v a t e double p r e t U n i t a r ;

public a b s t r a c t void a f i s e a z a D e s c r i e r e ( ) ; public a b s t r a c t double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) ;

Clasa Carte extinde clasa Produs i implementeaz metodele abstracte ale acesteia n modul ei propriu. La fel se ntmpl i pentru clasa RamaFoto.
1 public c l a s s C a r t e extends Produs { 2 3 4 5 6 7 8 9 } public C a r t e ( double p r e t U n i t a r , super ( p r e t U n i t a r ) ; this . t i t l u = t i t l u ; this . autor = autor ; String titlu , String autor ) { private S t r i n g titlu , autor ;

10 11 12 13 14 15 16 17 18 19 20 }

// metoda a f i s e a z a D e s c r i e r e

este

implementata i n

sublclasa

public void a f i s e a z a D e s c r i e r e ( ) { System . o u t . p r i n t l n ( " T i t l u c a r t i i e s t e : "+ t h i s . t i t l u +" , i a r a u t o r u l e s t e : "+ t h i s . a u t o r ) ; }

// metoda c a l c u l e a z a R e d u c e r e

este

implementata i n

sublclasa

public double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) { System . o u t . p r i n t l n ( " C a l c u l e a z a r e d u c e r e d i n C a r t e . . . " ) ; return } 0.0;

1 public c l a s s RamaFoto extends Produs { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 } } // metoda c a l c u l e a z a R e d u c e r e este implementata i n sublclasa } // metoda a f i s e a z a D e s c r i e r e este implementata i n sublclasa } public RamaFoto ( double p r e t U n i t a r , super ( p r e t U n i t a r ) ; this . lungime = lungime ; this . latime = latime ; int lungime , int latime ) { private int lungime , latime ;

public void a f i s e a z a D e s c r i e r e ( ) { System . o u t . p r i n t l n ( " Lungimea r a m e i e s t e : "+ t h i s . l u n g i m e+" , i a r l a t i m e a e s t e : "+ t h i s . l a t i m e ) ;

public double c a l c u l e a z a R e d u c e r e ( i n t p r o c e n t ) { System . o u t . p r i n t l n ( " C a l c u l e a z a r e d u c e r e i n RamaFoto i n f u n c t i e de l a t i m e s i l u n g i m e . . . " ) ; return 0.0;

Clasa TestProdus creeaz un vector de obiecte de tipul Produs i calculeaz preul total al tuturor produselor declarate. Cum un obiect dintr-o clas abstract nu poate instaniat cu tipul clasei abstracte, se instaniaz cu tipul subclaselor, n acest caz Carte i RamaFoto.
1 public c l a s s T e s t P r o d u s { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 } System . o u t . p r i n t l n ( " P r e t u l t o t a l a l p r o d u s e l o r e s t e : "+p r e t T o t a l ) ; } double p r e t T o t a l = 0 . 0 ; for ( int i =0; i <l i s t a P r o d u s e . l e n g t h ; i ++){ pentru ca a c e a s t a se afla in clasa parinte . } public s t a t i c void main ( S t r i n g [ ] Produs [ ] for ( int if args ) {

l i s t a P r o d u s e = new Produs [ 4 ] ; i =0; i <l i s t a P r o d u s e . l e n g t h ; i este i ++){ se c r e e a z a un o b i e c t de tipul Carte

( i % 2 == 0 ) { // daca

par a t u n c i

l i s t a P r o d u s e [ i ] = new C a r t e ( 1 2 . 3 , } e l s e { // daca i e s t e impar a t u n c i se

" F u n d a t i a "+i ,

" I s a a c Asimov " ) ; t i p u l RamaFoto

c r e e a z a un o b i e c t de

l i s t a P r o d u s e [ i ] = new RamaFoto ( 5 . 5 , 20 i , 15 i ) ;

// putem a v e a a c c e s

l a metoda g e t P r e t U n i t a r ( )

double p r e t P r o d u s O r i g i n a l = l i s t a P r o d u s e [ i ] . g e t P r e t U n i t a r ( ) ; double r e d u c e r e = l i s t a P r o d u s e [ i ] . c a l c u l e a z a R e d u c e r e ( i ) ; p r e t T o t a l += p r e t P r o d u s O r i g i n a l r e d u c e r e ; listaProduse [ i ] . afiseazaDescriere () ;

20 21 }

D.

Interfee

Avem interfaa IPersoana n care se a deniia unei metode.


1 public i n t e r f a c e I P e r s o a n a { 2 3 } public S t r i n g returneazaNumePersoana ( ) ;

Interfaa IStudent motenete interfaa IPersoana, implicit i metoda unic a acesteia.


1 public i n t e r f a c e 2 3 } I S t u d e n t extends I P e r s o a n a { public boolean v e r i f i c a S t u d e n t I n t e g r a l i s t ( ) ;

Clasa Student implementeaz interfaa IStudent, deci implementeaz att metodele acesteia, ct i pe cele ale interfeei pe care IStudent o motenete.
1 public c l a s s S t u d e n t implements I S t u d e n t { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 } } // s e i m p l e m e n t e a z a metoda m o s t e n i t a de I S t u d e n t d i n I P e r s o a n a public S t r i n g returneazaNumePersoana ( ) { } } return f a l s e ; // s e i m p l e m e n t e a z a metoda d i n I S t u d e n t public boolean v e r i f i c a S t u d e n t I n t e g r a l i s t ( ) { if ( t h i s . medieNote >= 5 ) { return true ; } public S t u d e n t ( S t r i n g nume , double medieNote ) { t h i s . nume = nume ; t h i s . medieNote = medieNote ; S t r i n g nume ; double medieNote ;

return t h i s . nume ;

Clasa TestStudent creeaz un obiect de tipul Student i veric dac studentul este integralist sau nu, and un mesaj corespunztor.
1 public c l a s s 2 3 4 5 6 TestStudent { args ) { 6.3) ; public s t a t i c void main ( S t r i n g [ ]

S t u d e n t s t u d e n t = new S t u d e n t ( " I o n e s c u Radu " , if ( student . v e r i f i c a S t u d e n t I n t e g r a l i s t () )

System . o u t . p r i n t l n ( s t u d e n t . r e t u r n e a z a N u m e P e r s o a n a ( )+" e s t e i n t e g r a l i s t " ) ; else

7 8 9 } }

System . o u t . p r i n t l n ( s t u d e n t . r e t u r n e a z a N u m e P e r s o a n a ( )+" nu e s t e i n t e g r a l i s t " ) ;

III.

TEM

1. Folosind conceptul de clase i metode abstracte creai o aplicaie care calculeaz pentru un cub i pentru o sfera: aria totala; volumul; centrul de greutate. Pentru acestea vei avea nevoie de: cub (reprezentat de 8 puncte); sfer (reprezentat de 2 puncte: centrul i un punct de pe margine); punct (reprezentat de cele 3 coordonate n spatiu: x, y i z); metoda care calculeaz distana dintre 2 puncte aate n spaiu. Aceasta este necesar pentru aarea lungimii unei laturi.

10

Laborator Nr. 5:
Structuri de date 1

Intocmit de: Dobrina s Alexandra Indrum ator: Asist. Drd. Danciu Gabriel
October 28, 2011

I.

NOT IUNI TEORETICE A. Array

Un sir de date sau un array este o structur a ce cont ine valori multiple de acela si tip de data. Lungimea unui sir de date se stabile ste la crearea array-ului si va xa pe ntreaga existent a a acestuia. De regul a, primul element se a a pe pozit ia 0, iar ultimul pe pozit ia n 1, unde n reprezint a num arul de elemente din sir.

1.

Declararea unui sir de date

In Java, declararea unui array se face astfel: tip_de_date [] nume_sir; a tipul de date atribuit sirului (int, oat, char, String, sau orice tip referint a), unde, tip de date reprezint iar nume sir reprezint a numele variabilei n care se stocheaz a sirul. Odat a ce sirul de date a fost declarat, acesta se poate instant ia. Pentru instat iere se folose ste operatorul new. De exemplu, pentru un sir de date de tipul int, cu 3 elemente, declararea si instant ierea acestuia se face astfel: int [] s; s = new int[3]; sau: int [] s=new int[3] Setarea valorilor pentru elementele sirului s creat, se face astfel: s[0]=14; s[1]=2; s[2]=12; sau, elementelor li se pot atribui valori nc a de la instant iere: int[] s = {14,2,12}; Pentru atribuirea de valori ale unui sir, se pot folosii si instruct iunile repetitive. De exemplu, n cazul In care se cite ste un sir de la tastatur a, atribuirea valorilor se poate face astfel:
1 2 3 4 5 6 B u f f e r R e a d e r s t d i n = new B u f f e r R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; i n t [ ] s = new i n t [ 5 ] ; f o r ( i n t i =0; i < 5; i ++) { s [ i ]= I n t e g e r . p a r s e I n t ( s t d i n . r e a d L i n e ( ) ) ; }

Declararea unui array de un tip de date referint a se face n acela si mod ca si pentru sirurile de tipul de date primitive. Doar c a un astfel de sir va avea ca elemente obiectele unei clase. Astfel c a, dac a se d a o clas a cu numele Country , un sir de elemente din aceast a clas a se declar a astfel:
1 2 3 4 5 6 7 8 9 10 c l a s s Country { S t r i n g name ; long p o p u l a t i o n ; } p u b l i c c l a s s CountryDemo { p u b l i c s t a t i c void main ( S t r i n g [ ] {

args )

11 12 13 14 15 16 17 18

Country [ ] s i r = new Country [ 2 ] ; s i r [ 0 ] . name = I t a l i a ; s i r [ 0 ] . population = 600000000000 l ; s i r [ 1 ] . name = F r a n t a ; s i r [ 1 ] . population = 650000000000 l ; } }

2.

Declararea sirurilor multidimensionale

Deoarece un sir de date poate cont ine referint e c atre alte obiecte, este posibil ca un sir s a cont in a referint e si catre alte siruri. In acest caz, se spune c a se folosesc siruri multidimensionale. Cele mai comune siruri multimensionale sunt matricile. Exemplu de sir multidimensional: int matrix[][] = new int[3][2]; matrix[0][1] = 12; In acest caz se d a un sir bidimensional, astfel: 3 siruri n care sunt ret inute siruri de c ate dou a elemente de tip int. Accesarea elementelor unui astfel de sir se face prin precizarea tuturor indicilor ( n cazul acesta sunt 2 indici). Nu este obligatoriu ca toate sub sirurile s a aib a aceea si dimensiune. In exemplul urm ator este prezentat un sir multidimensional n care sub sirurile au dimensiuni diferite:
1 2 3 4 5 6 float sir sir sir sir [0] [1] [2] [3] sir [ ] [ ] = = = = new new new new = new f l o a t [ 4 ] [ ] ; float float float float [5]; []{2.3 f ,5 ,6.7 f ,11}; []{1 f , 4 . 2 f ,7 f , 4 . 1 f ,10 f ,9 f }; [20];

B.

Clasa Vector

Clasa Vector face parte din pachetul java.util si reprezint a o clas a special a pentru lucrul cu sirurile de elemente. Cele mai uzuale metode folosite pentru declararea si crearea unui astfel de sir sunt: Vector v = new Vector(); //sau Vector v = new Vector(5);//se creeaza un vector de 5 elemente

1.

Metode si operat ii specice clasei V ector

Deoarece manipularea elementelor unui sir este o operat ie ce necesit a mult a munc a, clasa V ector are denite o serie de metode si operat ii ce pot de folos:
Metoda Operat ia specic a add() Adauga un element intr-un vector. addAll() Adauga o colectie de elemente intr-un vector. addElement() asemenea metodei add(). capacity() Returneaza capacitatea adica marimea sirului intern. clear() sterge toate elementele unui vector. clone() Creeaza o clona a vectorului. contains() Verica daca un vector contine un element. containsAll() Verica daca un vector contine o colectie. copyInto() Copiaza elementele unui vector intr-un array. elementAt() Returneaza elementul de la pozitia specicata. elements() Returneaza un obiect al vectorului care permite vizitarea tuturor cheilor vectorului. ensureCapacity() Verica si se asigura ca marimea buer-ului intern sa e de o anumita marime. equals() verica egalitatea cu un obiect. rstElement() returneaza primul element. get() returneaza un element de la o anumita pozitie. indexOf() cauta prima aparitie a unui element in sir. insertElementAt() Insereaza un element in sir. isEmpty() verica daca un vector este gol. iterator() returneaza un iterator, adica un obiect ce permite vizitarea elementelor din sir. lastElement() Returneaza ultimul element din sir. lastIndexOf() Cauta pozitia ultimului element din sir care este egal cu obiectul specicat. listIterator() Returneaza un obiect care permite ca toate elementele sa e vizitate secvential. remove() Sterge un anumit element din vector. removeAll() Sterge toate elementele specicate in colectia data ca parametru. removeAllElements() Sterge toate elementele din sir si seteaza marimea acestui cu zero. set() Schimba un element de la o anumita pozitie. setElementAt() Acelasi lucru ca si set. setSize() modica marimea buer-ului intern. size() returneaza numarul de elemente din sir. subList() returneaza o sectiune din sir. toArray() returneaza elementele vectorului ca array. trimToSize() taie o portiune din sir, astfel ca el sa ramana de marimea specicata.

C.

Clasa Stack

Stiva este o structur a de date de tipul LIF O (Last In, First Out). Clasa Stack este considerat a a ,,copilul clasei V ector. ns a are denite o serie de operat ii specice stivelor. Ad augarea elementelor. Aceasta operatiune se face prin metoda push():

public Object push(Object element) S tergerea unui element Aceasta operatiune se va face prin apelul functiei pop(): public Object pop() Vericare dac a stiva este goal a public boolean empty() Preluarea elementului din v arful stivei public Object peek() C autarea unui element n stiv a public int search(Object element) Exemplu de utilizare a clasei Stack :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import j a v a . u t i l . S t a c k ; public c l a s s S t i v a { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) { S t a c k s = new S t a c k ( ) ; s . push ( P r i m u l e l e m e n t ) ; s . push ( Al d o i l e a e l e m e n t ) ; s . push ( Al t r e i l e a e l e m e n t ) ; System . o u t . p r i n t l n ( Next : + s . p e e k ( ) ) ; s . push ( Al System . o u t . s . push ( Al s . push ( Al System . o u t . patrulea element ) ; p r i n t l n ( s . pop ( ) ) ; c i n c i l e a element ) ; s a s e l e a element ) ; println ( s ) ;

i n t c o u n t = s . s e a r c h ( Al d o i l e a e l e m e n t ) ; w h i l e ( c o u n t != 1 && c o u n t > 1 ) { s . pop ( ) ; c o u n t ; } System . o u t . p r i n t l n ( s . pop ( ) ) ; System . o u t . p r i n t l n ( s . empty ( ) ) ; System . o u t . p r i n t l n ( s ) ; } }

II.

TEME DE LABORATOR

1. Se consider a un sir de elemente ce cont ine n numere reale. Se spune c a dou a elemente ale sale formeaz a o ,,pereche n dezordine dac a sunt ndeplinite simultan condit iile: i<j a[i] > a[j ], unde1 i < n si 1 < j n S a se creeze un program care a seaz a perechile n dezordine din sir si num arul lor. Exemplu: Pentru n=4 si sirul (1, 13,2,4), se va a sa: 13 2 13 4 2 2. Se consider a dou a tablouri bidimensionale de dimensiuni identice (nxm). S a se a seze transpusa matricei sum a. Transpusa unei matrice se obt ine prin schimbarea liniilor cu coloanele. 3. Determinat i suma maxim a care se poate forma cu m numere distincte dintr-un vector ce cont ine n valori ntregi. Dac a sirul cont ine mai put in de m valori distincte se va a sa mesajul Imposibil. Pentru rezolvarea problemei se va folosi clasa V ector. 4. Folosind o stiv a, realizat i si a sat i programul dumneavoastr a dintr-o zi, pe ore. Eliminat i act iunile pe care le efectuat i p an a la ora 14 si a sat i ceea ce urmeaz a s a facet i la ora 15.

Laborator Nr. 5:
Structuri de date 2

Intocmit de: Dobrina s Alexandra Indrum ator: Asist. Drd. Danciu Gabriel
November 3, 2011

I.

NOT IUNI TEORETICE A. Liste

Lista reprezint a cea mai simpl a structur a de date nl ant uit a. Se folosesc doua tipuri de liste: liste simplu nl ant uite; liste dublu nl ant uite;

B.

Liste simplu nl ant uite

Pot denite ca ind o secvent a de obiecte alocate dinamic, n ecare obiect se p astr anduse at at informat ia util a c at si o referint a c atre succesorul sau din list a. Exist a o multitudine de moduri prin care se poate implementa aceast a structur a de date, ns a cel mai utilizat mod este prin denirea unei clase cu doi membri, unul n care se ret ine informa ia util a si unul In care se ret ine adresa urm atorului element din list a.
1 2 3 4 5 6 7 8 9 10 11 12 public class LinkedList { int data ; LinkedList public

next ; {

LinkedList ()

data = 0 ; next = null ; } }

Se observ a c a membrul next este de acela si tip de date ca si clasa, acesta pentru c a urm atorul element din list a este tot de acest tip de date. Pe l ang a ace sti membri se mai pot ad auga si alt ii care s a cont in a diverse informat ii, n funct ie de aplicat ia care cere utilizarea unei astfel de structuri. Urm atorul exemplu ilustreaz a crearea si a sarea unei liste simplu nl ant uite. Init ial a fost creat un element cu ajutorul constructorului, informaat ia din acest element a primit valoarea 23, iar pentru crearea urm atorului element s-a instant iat membrul next, s.a.m.d. Aceast a operat ie poate numit a ,,alipirea urm atorului element de elementul curent. Pentru a parcurge lista se folose ste un iterator.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 c l a s s LinkedListDemo { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) { L i n k e d L i s t l i s t = new L i n k e d L i s t ( ) ; l i s t . d a t a =23; l i s t . n e x t = new L i n k e d L i s t ( ) ; l i s t . next . data = 1 0 ; l i s t . n e x t . n e x t = new L i n k e d L i s t ( ) ; l i s t . next . next . data = 4 9 ; // p a r c u r g e r e a listei de la primul element

LinkedList i t e r a t o r = l i s t ; do { System . o u t . p r i n t l n ( i t e r a t o r . d a t a ) ; } w h i l e ( ( i t e r a t o r = i t e r a t o r . n e x t ) != n u l l ) ; } }

Un alt mod de folosire al listelor nl ant uite este prin declararea si ret inerea primului element din list a:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class LinkedList2 { int data ; LinkedList2 LinkedList2 public

next ; head ; {

LinkedList2 ()

head = t h i s ; next = null ; d a t a =0; } public LinkedList2 ( LinkedList2 head ) {

t h i s . head = head ;

17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55

next = null ; d a t a =0; } }

// / / / / / / / / / / / / / / / / / / / / / / / / / / / /

class

LinkedList2Demo { static void main ( S t r i n g args [ ] ) {

public

L i n k e d L i s t 2 l i s t = new L i n k e d L i s t 2 ( ) ; l i s t . head = l i s t ; l i s t . d a t a =23; l i s t . n e x t = new L i n k e d L i s t 2 ( l i s t ) ; l i s t . next . data = 1 0 ; l i s t . n e x t . n e x t = new L i n k e d L i s t 2 ( l i s t ) ; l i s t . next . next . data = 4 9 ; // p a r c u r g e r e a l i s t e i de l a p r i m u l w h i l e ( l i s t . n e x t != n u l l ) { System . o u t . p r i n t l n ( l i s t . d a t a ) ; l i s t = l i s t . next ; } System . o u t . p r i n t l n ( l i s t . d a t a ) ; l i s t = l i s t . head ; while ( l i s t . next != n u l l ) { element

System . o u t . p r i n t l n ( l i s t . d a t a ) ; l i s t = l i s t . next ; } System . o u t . p r i n t l n ( l i s t . d a t a ) ; } }

Se observ a c a prin ret inerea primunul element al listei se poate ajunge mult mai repede si mai u sor la primul element din list a. De asemenea, se poate observa c a acest mod de construire al unei liste nu este ecient, deoarece, n cazul unei liste cu sute sau chiar mii de elemente ad augarea noilor elemente va imposibil de realizat. De aceea, ad augarea unui element nou precum si stergerea unui element sunt operat ii specice pentru lucrul cu liste al aturi de modicarea informat iei utile, modicarea leg aturii dintre elemente, c autarea unui element n liste, aarea pozit iei unui element.
C. Liste dublu nl ant uite

In cazul n care se dore ste parcurgerea listei si n celalalt sens ( si nu doar de la predecesor la succesor), avem lista dublu nl ant uit a. Aceasta p astreaz conceptele listei simplu nl ant uite, cu specicarea c a ecare element al listei mai cont ine o referint a si c atre elementul precedent. Un mod de declararea al unei astfel de liste este urm atorul:
1 2 3 4 5 6 7 8 9 10 11 12 13 public c l a s s Nod { p r i v a t e Nod n e x t ; p r i v a t e Nod p r e v ; private int data ; p u b l i c Nod ( i n t { this . data = this . next = this . prev = } } data , data ; next ; prev ; Nod n e x t , Nod p r e v )

Operat ile specice lister simplu nl ant uite se ment in si pentru listele dublu, doar c a trebuie s a se tin a cont si de leg atura prev.
D. Framework -ul Java pentru Colect ii

Java pune la dispozit ia utilizatorilor o serie de interfet e si clase ce pot folosite pentru crearea si utilizarea diferitelor colect ii de date. Printre acestea amintim: interfat a Collection - are denite metode pentru o serie de operat ii ce se aplic a unei colect ii (detalii aici) 3

interfat a Iterator - iteratorul este acel obiect ce permite parcurgerea colect iilor (detalii aici) interfat a List - interfat a ce implementeaz a Collection. Exist a dou a clase ce implementeaz a aceast a interfat a: ArrayList si LinkedList. Interfat a List ofer a posibilitatea de a lucra ordonat, deci permite p astrarea secvent ial a a elementelor dintr-o colect ie (detalii aici) clasa ArrayList - clasa este echivalentul clasei Vector, dar sub forma unei colect ii. Un ArrayList este o colect ie de elemente indexate ntr-o anumit a ordine, dar nu neap arat sortate. (detalii) clasa LinkedList - aceasta este implementarea listei dublu nl ant uite. (detalii)

E.

Mult imi - Interfat a Set

Interfat a Set reprezint a un grup de elemente f ar a duplicate. Nu exist a o condit ie anume ce impune acest lucru, ci implement arile din clasele Set, sunt cele care impun aceasta condit ie. Interfat a Set deriv a din Collections, deci va implementa acelea si metode ca si aceast a interfat a. Un element, aat deja n mult ime, nu mai poate modicat. API-ul interfet ei se poate g asii aici

F.

Clasa HashSet

Face parte din interfat a Set si are ca operat ii specice urm atoarele: ad augarea elementelor; stergerea elementelor; vericare dac a lista este goal a; vericare daca un anumit obiect este cont inut tn list a; Un exemplu de utilizare al clasei HashSet este urm atorul:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import j a v a . u t i l . A r r a y L i s t ; class Point { public public public int int x; y; ( int x , int y) {

Point

this . x = x ; this . y = y ; } public if boolean equ als ( Object o) {

( ! ( o instanceof Point ) ) return f a l s e ; Point pt = ( Point ) o ; return ( ( p t . x == t h i s . x ) && } public int hashCode ( ) {

( p t . y==t h i s . y ) ) ;

return }

17 t h i s . x +23 t h i s . y +43;

public S t r i n g t o S t r i n g ( ) { return x = +x+ y = +y + } } // / / / / / / / / / / / / / / / / / / / public { public Set class static Multimi void main ( S t r i n g args [ ] )

i d = + hashCode ( )+ \ n ;

s e t = new H a s h S e t ( ) ;

// Adaug i n m u l t i m e s e t . add ( new P o i n t ( 1 , 2 ) ) ; s e t . add ( new P o i n t ( 2 , 1 ) ) ; s e t . add ( c ) ;

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73

// S t e r g un e l e m e n t s e t . remove ( c ) ;

din

multime

// Marimea u n e i m u l t i m i int s i z e = set . s i z e () ; System . o u t . p r i n t l n ( s i z e ) ; // Adaug un e l e m e n t c e e x i s t a s e t . add ( new P o i n t ( 1 , 2 ) ) ; // f a r a a a v e a i n s a e f e c t size = set . size () ; System . o u t . p r i n t l n ( s i z e ) ; // V e r i f i c a m d a c a un e l e m e n t e s t e d e j a i n m u l t i m e boolean b = s e t . c o n t a i n s ( new P o i n t ( 2 , 1 ) ) ; // t r u e System . o u t . p r i n t l n ( b ) ; b = set . contains (c) ; System . o u t . p r i n t l n ( b ) ; // false deja

// Parcurgem m u l t i m e a Iterator it = set . iterator () ; while ( i t . hasNext ( ) ) { // s i a f i s a m e l e m e n t e l e Object element = i t . next ( ) ; System . o u t . p r i n t l n ( e l e m e n t ) ; } } }

II.

TEME DE LABORATOR

1. Editat i, compilat i si lansat i n execut ie aplicat ile prezentate la I B. 2. Creat i o list a dublu nl ant uit a si a sat i-o. 3. Editat i, compilat i si lansat i n execut ie aplicat ile prezentate la I F. 4. Se d a o clas a de numere complexe. Folosind clasa HashSet creat i o list a n care s a se ret in a numere complexe. Ad augat i minim 5 astfel de numere si realizat i un meniu prin care s a se rezolve urm atoarele cerint e: A sat i dimensiunea listei. Vericat i daca un num ar citit exist a n list a. Dac a nu exist a, ad augat i-l si a sat i noua lungime a listei. Eliminat i un num ar din list a. A sati suma numerelor din list a. A sat i elementele listei.

Laborator 7:
Tratarea excepiilor n Java

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 13 noiembrie 2011

I.

NOIUNI TEORETICE A. Ce este o excepie?

O excepie este un eveniment care apare n execuia unui program i care ntrerupe evoluia normal a acestuia. ncercarea de a soluiona aceste excepii folosind metode clasice duce la creterea semnicativ a complexitii codului, ceea ce afecteaz, n mod indirect, corectitudinea codului i claritatea acestuia. De aceea, cei care au creat limbajul Java s-au gndit la un sistem de tratare a excepiilor ce permite programatorului: tratarea excepiilor la un nivel superior celui n care apar; propagarea excepiilor la nivelele superioare n mod ierarhic; tratarea unitar a excepiilor de acelai tip.

B.

Ierarhia excepiilor

Pentru a crea un obiect excepie, Java pune la dispoziia programatorului o ierarhie de clase, aat n pachetul java.lang, ierarhie ce poate observat n imaginea de mai jos.

Figura 1: Ierarhia simplicat a claselor de tip excepie din pachetul java.lang

Dup cum se poate observa din gura de mai sus, clasa Throwable are doi descendeni: clasa Error i clasa Exception. Nici una nu adaug metode suplimentare, dar au fost introduse n acest fel pentru a delimita dou tipuri fundamentale de excepii ce pot aprea ntr-o aplicaie Java. Clasa Error corespunde excepiilor ce nu mai pot recuperate de ctre programator. Apariia unei astfel de excepii nseamn c a aprut o eroare deosebit de grav i aceasta determin terminarea programului. Dei este datoria programatorului s arunce i s trateze excepiile aprute, excepiile de tipul Error nu trebuie tratate n acest fel. Ele sunt utilizate de maina virtual Java (JVM). Clasa Exception este, de fapt, cea utilizat efectiv de programator n procesul de tratare a excepiilor. Att aceast clas ct i descendenii ei se ocup de excepii ce pot rezolvate de ctre program, fr oprirea acestuia. Exist o mare varietate de clase derivate din Exception care pot utilizate. Lista complet se a aici.

C.

Aruncarea unei excepii

Aruncarea unei excepii se face cu ajutorul cuvntului cheie throw n felul urmtor:
throw <obiectExceptie>

sau
throw new <clasaExceptie>(Mesaj)

unde <obiectExceptie> i new <clasaExceptie>(Mesaj) sunt instane ale clasei Throwable sau ale unei clase derivate din aceasta. O metod poate arunca mai multe excepii, ns prin aruncarea unei excepii se iese din metod fr a mai executa instruciunile care urmau. n cazul n care o metod arunc o excepie, e prin throw, e prin apelul unei alte metode, fr a avea o secven try - catch de prindere, atunci aceast metod trebuie s specice clar acest lucru.
public void <numeMetoda> throws <classException1>, <classException2>, . . . { ... throw <obExceptie1> ... throw <obExceptie2>

... }

D.

Prinderea unei excepii

O dat ce o excepie a fost aruncat, ea trebuie prins. Acest lucru se poate realiza cu ajutorul unui bloc try-catch, a crui form general este prezentat mai jos:
try{ //cod ce poate arunca o exceptie } catch(<classExcept1> <idExcept1>){ //handler exceptie de tip <classExcept1> } catch(<classExcept2> <idExcept2>){ //handler exceptie de tip <classExcept2> } ... nally{ //secventa de cod executata oricum }

Dup cum se poate observa, structura de prinderere a excepiilor poate delimitat n trei blocuri: try Secvena de cod din acest bloc poate arunca, n anumite condiii, excepii. n cazul n care se arunc o exepie, execuia secvenei din blocul try se ntrerupe i se declaneaz procedura de tratare a excepiei. n caz contrar, secvena de cod din interiorul blocului se execut n ntregime, controlul ind predat primei instruciuni de dupa blocul try-catch. catch Numite i handlere de excepii, blocurile catch trateaz excepiile. n momentul n care apare o excepie n blocul try, se parcurge lista blocurilor catch n ordinea n care apar n codul surs. n cazul n care excepia corespunde unui bloc catch, se execut secvena de 4

cod care corespunde blocului respectiv i cutarea ia sfrit, considerndu-se c excepia a fost rezolvat. Dup cum se poate observa, pot exista mai multe blocuri catch, acest lucru subliniind faptul c se pot trata excepii de mai multe tipuri. Important este ca acestea s e introduse n ordinea copil - printe pentru c blocurile catch se parcurg secvenial. nally Blocul nally cuprinde secvena de cod care se execut n nal, indiferent dac a aprut o situaie de excepie sau nu. Este obligatoriu ca blocul try s e urmat de cel puin un bloc catch sau nally.

E.

Crearea propriilor excepii

n dezvoltarea unei aplicaii Java pot exista cazuri n care excepiile aprute s nu poat tratate de clasele de excepie deja existente n pachetele Java (java.util, java.io, java.net). Astfel, dezvoltatorii de aplicaii sunt nevoii s-i creeze propriile clase de excepie. Acest lucru se poate realiza foarte uor i anume, crend clase care extind clasa Throwable sau clase descendente ale acesteia. Se recomand, dintre subclasele lui Throwable, s se extind clasa Exception. Clasa Error este specic erorilor grave, care duc la terminarea execuiei programului, i este puin probabil s avem nevoie de ea.

II. A.

PREZENTAREA LUCRRII DE LABORATOR

Exemple de programe ce demonstreaz lucrul cu excepiile

1. Programul urmtor conine funcia main() care apeleaz metoda metoda1() avnd ca parametru un numr ntreg. Funcia metoda1() va arunca o excepie n cazul n care parametru trimis este diferit de 0, altfel funcia se va executa pn la capt. Observai ce se aeaz pentru i=0 i pentru i=1; cnd se execut funcia metoda1() pn la capt i cnd nu. De asemenea, observai i prezena blocului nally.
1 public c l a s s 2 3 4 5 TestExceptions1 { args ) { public s t a t i c void main ( S t r i n g [ ] for ( int try { System . o u t . p r i n t l n ( " \n Caz "+i ) ; i = 0; i <= 1 ; i ++) {

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 } } } // metoda1 } } }

// a p a r i t i a metoda1 ( i ) ;

exceptiei

se

realizeaza

prin

apelul

m e t o d e i metoda1

System . o u t . p r i n t l n ( " \n S f a r s i t c a z "+i ) ; } catch ( E x c e p t i o n ex ) { // t r a t a r e a // a p e l a r e a exceptiei functiei intalnite i n metoda1 clasei Exception

getMessage ( ) a

System . o u t . p r i n t l n ( "A a p a r u t o e x c e p t i e . M e s a j u l e i e s t e : "+ex . g e t M e s s a g e ( ) ) ; } finally { System . o u t . p r i n t l n ( " Se e x e c u t a b l o c u l f i n a l l y " ) ;

specifica

prin

intermediul

cuvantului

cheie

" throws " ce

tipuri

de

exceptii

arunca

p r i v a t e s t a t i c void metoda1 ( i n t

i ) throws E x c e p t i o n {

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda1 " ) ; if ( i != 0 ) { // a r u n c a r e a exceptiei de tipul Exception

throw new E x c e p t i o n ( " e x c e p t i e d i n metoda1 " ) ;

System . o u t . p r i n t l n ( "Am i e s i t d i n metoda1 " ) ;

2. Acest program conine funcia main() care apeleaz funcia metoda1(), care, la rndul ei apeleaz funcia metoda2() ce poate arunca o excepie. Observai c ambele funcii (metoda1() i metoda2()) specic ce tip de excepie arunc (Throwable). Dei blocul try-catch are mai multe blocuri catch, excepia aprut este tratat de blocul corespunztor acesteia, adic Throwable. Acest clas conine diverse metode care pot ajuta programatorul n localizarea excepiei. Despre acestea putei citi aici.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 12 13 14 TestExceptions2 { args ) { public s t a t i c void main ( S t r i n g [ ] for ( int try { System . o u t . p r i n t l n ( " \n Caz " + i ) ; metoda1 ( i ) ; System . o u t . p r i n t l n ( " \n S f a r s i t c a z " + i ) ; } catch ( E x c e p t i o n ex ) { System . o u t . p r i n t l n ( "A a p a r u t o e x c e p t i e E x c e p t i o n . M e s a j u l e i e s t e : " + ex . g e t M e s s a g e ( ) ) ; } catch ( Throwable exTh ) { System . o u t . p r i n t l n ( "A a p a r u t o e x c e p t i e Throwable i n main " ) ; / a p e l a r e a metodei printStackTrace ( ) a unei s t i v e LIFO , p a r c u r s e de e x c e p t i e / clasei Throwable c a r e afiseaza , conform i = 0; i <= 1 ; i ++) {

principiului 15 16 17 18 19 20 21 } } } informatii

despre

locatiile

exTh . p r i n t S t a c k T r a c e ( System . o u t ) ; } finally { System . o u t . p r i n t l n ( " Se e x e c u t a b l o c u l f i n a l l y d i n main " ) ;

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 } } } System . o u t . p r i n t l n ( "Am i e s i t d i n metoda2 " ) ; p r i v a t e s t a t i c void metoda2 ( i n t i ) throws Throwable { } p r i v a t e s t a t i c void metoda1 ( i n t i ) throws Throwable {

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda1 " ) ; metoda2 ( i ) ; System . o u t . p r i n t l n ( "Am i e s i t d i n metoda1 " ) ;

System . o u t . p r i n t l n ( "Am i n t r a t i n metoda2 " ) ; if ( i != 0 ) { throw new Throwable ( " e x c e p t i e d i n metoda2 " ) ;

3. Programul urmtor este unul didactic ntruct arunc clase de excepie descendente ale clasei RuntimeException. Nu este obligatoriu ca acest gen de excepii s e prinse (tratate), dar exemplul a fost introdus pentru o mai bun nelegere a mecanismului de aruncare/prindere a excepiilor. Dup cum se poate observa la o prim rulare a programului, va prins prima excepie, NumberFormatException. Comentai, respectiv decomentai, secvene de cod din program, astfel nct s obinei, pe rnd, toate excepiile tratate. De asemenea, programul conine o metod callException() ce primete ca parametru un tip de dat excepie. Aceasta apeleaz cteva dintre metodele implementate de clasele de tip excepie. Metodele respective au rolul de a oferi mai multe informaii despre locaia i tipul de excepie aprut.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 System . o u t . p r i n t l n ( " \n A r i t h m e t i c E x c e p t i o n " ) ; System . o u t . p r i n t l n ( " \n N u l l P o i n t e r E x c e p t i o n " ) ; String s t r 3 = null ; System . o u t . p r i n t l n ( " \n S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n " ) ; String s t r 2 = " abcde " ; System . o u t . p r i n t l n ( " \n A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n " ) ; int s i r [ ] = { 1 , 2 , 3 , 4 }; TestExceptions3 { args ) { public s t a t i c void main ( S t r i n g [ ] try { System . o u t . p r i n t l n ( " \nNumber Format E x c e p t i o n " ) ; String s t r 1 = " 123 r " ;

Integer n = Integer . parseInt ( str1 ) ;

s i r [ 6 ] = 3;

char c 1 = s t r 2 . c h a r A t ( 1) ;

System . o u t . p r i n t l n ( s t r 3 . l e n g t h ( ) ) ;

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 } } } }

i n t n2 = 1 2 / 0 ;

} catch ( NumberFormatException n f e x ) { System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e NumberFormatException . . . " ) ; callException ( nfex ) ; } catch ( A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n a r r a y E x ) { System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n . . . " ) ; c a l l E x c e p t i o n ( arrayEx ) ; } catch ( S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n s t r E x ) { System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e S t r i n g I n d e x O u t O f B o u n d s E x c e p t i o n . . . " ) ; c a l l E x c e p t i o n ( strEx ) ; ; } catch ( N u l l P o i n t e r E x c e p t i o n nullEx ) {

System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e N u l l P o i n t e r E x c e p t i o n . . . " ) ; c a l l E x c e p t i o n ( nullEx ) ; } catch ( A r i t h m e t i c E x c e p t i o n aEx ) { System . o u t . p r i n t l n ( " T r a t a r e e x c e p t i e A r i t h m e t i c E x c e p t i o n . . . " ) ; c a l l E x c e p t i o n ( aEx ) ;

p r i v a t e s t a t i c void c a l l E x c e p t i o n ( R u n t i m e E x c e p t i o n r t e x ) { System . o u t . p r i n t l n ( " M e s a j u l s t a n d a r d a l e x c e p t i e i : " ) ; System . o u t . p r i n t l n ( r t e x ) ; System . o u t . p r i n t l n ( " M e s a j u l e x c e p t i e i : " ) ; System . o u t . p r i n t l n ( r t e x . g e t M e s s a g e ( ) ) ; System . o u t . p r i n t l n ( " M e s a j u l l o c a l : " ) ; System . o u t . p r i n t l n ( r t e x . g e t L o c a l i z e d M e s s a g e ( ) ) ; System . o u t . p r i n t l n ( " \ n S t a c k t r a c e : " ) ; r t e x . p r i n t S t a c k T r a c e ( System . o u t ) ;

B.

Crearea propriilor excepii

Crearea propriilor excepii se face prind crearea unei clase obinuite, dar care motenete clasa Exception. Clasa urmtoare face exact acest lucru. IncompatibleMatrixException conine doi constructori, unul fr parametri i unul cu un parametru i care apeleaz constructorul clasei de baz.
1 public c l a s s 2 3 4 5 6 7 8 9 } } public I n c o m p a t i b l e M a t r i x E x c e p t i o n ( S t r i n g m e s s a g e ) { super ( m e s s a g e ) ; public I n c o m p a t i b l e M a t r i x E x c e p t i o n ( ) { } I n c o m p a t i b l e M a t r i x E x c e p t i o n extends E x c e p t i o n {

Clasa prezentata mai jos, declar dou matrici de dimensiuni diferite i se ncearc nmulirea acestora. Metoda multiplyMatr() este apelat n cadrul unui bloc try i veric dac dou matrici 8

sunt compatibile. n cazul n care numrul de coloane ale primei matrici este diferit de numrul de linii ale celei de-a doua, atunci se arunc excepia creat anterior, IncompatibleMatrixException.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 } } } // cod d e s t i n a t pt inmultirea matricilor p r i v a t e s t a t i c void m u l t i p l y M a t r ( i n t [ ] [ ] if ( matr1 [ 0 ] . l e n g t h != matr2 . l e n g t h ) { throw new I n c o m p a t i b l e M a t r i x E x c e p t i o n ( " m a t r i c i i n c o m p a t i b i l e p t i n m u l t i r e " ) ; matr1 , int [ ] [ ] matr2 ) throws I n c o m p a t i b l e M a t r i x E x c e p t i o n { } } try { m u l t i p l y M a t r ( matr1 , matr2 ) ; TestMatrixException { args ) { public s t a t i c void main ( S t r i n g [ ] int [ ] [ ] matr1 , matr2 ;

matr1 = new i n t [ 2 ] [ 3 ] ; matr2 = new i n t [ 4 ] [ 4 ] ;

} catch ( I n c o m p a t i b l e M a t r i x E x c e p t i o n imEx ) { System . o u t . p r i n t l n ( " M e s a j u l e s t e : "+imEx . g e t M e s s a g e ( ) ) ; imEx . p r i n t S t a c k T r a c e ( System . o u t ) ;

III.

TEM

1. Rulai toate programele prezentate ca exemplu n seciunea II. 2. Realizai un program n care s se testeze captarea i tratarea excepiilor generate la calcularea a cel puin 10 funcii matematice din clasa Math aat n pachetul java.lang. Folosii blocuri de catch specice pentru ecare funcie n parte.

Laborator Nr. 8:
Fluxuri Java

Intocmit de: Dobrina s Alexandra Indrum ator: Asist. Drd. Danciu Gabriel
November 15, 2011

I.

NOT IUNI TEORETICE

Fluxurile Java pun la dispozit ie modalitatea prin care o aplicat ie permite citirea unor informat ii care se g asesc pe o surs a extern a, respectiv trimiterea unor informat ii c atre o destinat ie extern a. Informat ia se poate g asi oriunde: ntr-un sier pe disc, n ret ea, n memorie sau n alt program si poate de orice tip: date primitive, obiecte, imagini, sunete, etc. Mai mult, prin uxuri este posibil a comunicarea ntre dou a sau mai multe re de execut ie ale aceleia si aplicat ii. Fluxurile sunt secvent e de octet i. Indiferent de tipul informat iilor, citirea/scrierea lor de pe un mediu extern, respectiv pe un mediu extern respect a urm atorii algoritmi: Citirea: deschide canal comunicatie; cat timp (mai sunt informatii) { citeste informatie; } inchide canal comunicatie; Scrierea: deschide canal comunicatie cat timp (mai sunt informatii) { scrie informatie; } inchide canal comunicatie;
A. Fluxuri pentru lucrul cu siere

Fluxurile pentru lucrul cu siere sunt cele mai u sor de nteles. Clasele care implementeaz a aceste uxuri sunt urmatoarele:
FileReader caractere FileWriter caractere FileInputStream octeti FileOutputStream octeti

Constructorii acestor clase accept a ca argument un obiect prin care se specic a sierul folosit. Acesta poate un sir de caractere, un obiect de tip File sau un obiect de tip FileDescriptor. Constructorii clasei FileReader (vezi si API): public FileReader( String fileName ) throws FileNotFoundException public FileReader( File file ) throws FileNotFoundException public FileReader( FileDescriptor fd ) Constructorii clasei FileWriter (vezi si API): public public public public FileWriter( FileWriter( FileWriter( FileWriter( String fileName ) throws IOException File file ) throws IOException FileDescriptor fd ) String fileName, boolean append ) throws IOException

Constructorii clasei FileOutputStream (vezi si API):

FileOutputStream(File file) throws FileNotFoundException FileOutputStream(File file, boolean append) throws FileNotFoundException FileOutputStream(FileDescriptor fd) FileOutputStream(String name) throws FileNotFoundException FileOutputStream(String name, boolean append) throws FileNotFoundException Constructorii clasei FileInputStream (vezi si API): InputStreamReader(InputStream in) InputStreamReader(InputStream in, Charset cs) InputStreamReader(InputStream in, CharsetDecoder dec) InputStreamReader(InputStream in, String charsetName)

throws UnsupportedEncodingException

Cei mai uzuali constructori sunt cei care primesc ca argument numele sierului. Ace stia pot provoca except ii de tipul FileNotFoundException n cazul n care sierul cu numele specicat nu exist a. Din acest motiv orice creare a unui ux de acest tip trebuie facut a tntr-un bloc try....catch sau metoda n care sunt create uxurile respective trebuie s a arunce except ii de tipul FileNotFoundException sau de tipul superclasei IOException. Urm atoarele programe copiaz a cont inutul unui sier ntr-un alt sier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import j a v a . i o . ; p u b l i c c l a s s Copy1 { p u b l i c s t a t i c void main ( S t r i n g [ ] FileReader FileWriter args ) throws I O E x c e p t i o n {

i n = new F i l e R e a d e r ( i n . t x t ) ; o u t = new F i l e W r i t e r ( o u t . t x t ) ;

int c ; while ( ( c = i n . r e a d ( ) ) out . w r i t e ( c ) ; in . close () ; out . c l o s e ( ) ; } }

!= 1)

Se observ a ca metoda main arunc a except ii de tipul IOException, deci nu este necesar a folosirea blocurilor try....catch. Pentru citirea si scrierea din\ n siere s-au folosit clasele FileReader si textitFileWriter In urm atorul exemplu este exemplicat modul de lucru cu clasele FileInputStream si FileOutputStream, precum si folosirea blocurilor try...catch.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 import j a v a . i o . ; p u b l i c c l a s s Copy2 { p u b l i c s t a t i c void main ( S t r i n g FileInputStream in ; FileOutputStream out ; i n t ok ; try { i n = new F i l e I n p u t S t r e a m ( a r g s [ 0 ] ) ; try { o u t = new FileOutputStream ( args [ 1 ] ) ; ok = 0 ; w h i l e ( ok != 1) { try { ok = i n . r e a d ( ) ; o u t . w r i t e ( ok ) ; System . o u t . p r i n t ( ( char ) ok ) ; } catch ( I O E x c e p t i o n e ) { System . o u t . p r i n t l n ( e . g e t M e s s a g e ( ) ) ; System . e x i t ( 1 ) ; } } } catch ( I O E x c e p t i o n e ) { System . o u t . p r i n t l n ( e . g e t M e s s a g e ( ) ) ; System . e x i t ( 1 ) ; } } catch ( F i l e N o t F o u n d E x c e p t i o n e ) { System . o u t . p r i n t l n ( e . g e t M e s s a g e ( ) ) ; System . e x i t ( 1 ) ; } } } args [ ] ) {

Se recomand a folosirea claselor FileReader si FileWriter atunci c and se citesc sau se scriu siruri de caractere. Pentru citirea sirurilor de octet i(de exemplu pentru imagini) se vor folosii clasele FileOutputStream si FileInputStream.
B. Citirea si scrierea cu ajutorul buer-elor

Sunt folosite pentru a introduce o zon a tampon tn procesul de scriere/citire a informat iilor, reduc and astfel numarul de accese la dispozitivul ce reprezint a sursa original a de date. Sunt mult mai eciente dec at uxurile f ar a buer si din acest motiv se recomand a folosirea lor ori de c ate ori este posibil. Clasele pentru citirea/scrierea cu zon a tampon sunt:
BueredReader caractere BueredWriter caractere BueredInputStream octeti BueredOutputStream octeti

Clasele BueredReader si BueredInputStream citesc tn avans date si le memoreaz a sntr-o zon a tampon. Atunci c and se execut a o operat ie read(), octetul citit va preluat din buer. In cazul n care buer-ul este gol citirea se face direct din ux si, odata cu citirea octetului, vor memorati n buer si octet ii care i urmeaz a. Similar, se lucreaz a si cu clasele BueredWriter si BueredOutputStream. Fluxurile de citire/scriere cu buer sunt uxuri de procesare si sunt folosite prin suprapunere cu alte uxuri. Exemplu de folosire a zonei tampon pentru realizarea citirii din sier: BufferedInputStream out = new BufferedInputStream(new FileInputStream("out.dat"), 1024) Constructorii clasei BueredReader sunt: BufferedReader( Reader in ) BufferedReader( Reader in, int dim_buffer ) Constructorii clasei BueredWriter sunt: BufferedWriter( Writer out ) BufferedWriter( Writer out, int dim_buffer ) Constructorii clasei BueredInputStream sunt: BufferedInputStream( InputStream in ) BufferedInputStream( InputStream in, int dim_buffer ) Constructorii clasei BueredOutputStream sunt: BufferedOutputStream( OutputStream out ) BufferedOutputStream( OutputStream out, int dim_buffer )

In cazul constructorilor n care dimensiunea buer-ului nu este specicat a, aceasta prime ate valoarea implicit a de 512 octet i. Metodele acestor clase sunt cele uzuale de tipul read si write (vezi API Reader, API Writer). Pe l ang a acestea, clasele pentru scriere prin buer mai au si metoda ush care gole ste explicit zona tampon chiar dac a aceasta nu este plin a. Exemplu pentru folosirea zonelor tampon:
1 2 3 4 B u f f e r e d W r i t e r o u t = new B u f f e r e d W r i t e r ( new F i l e W r i t e r ( o u t . d a t ) , octeti f o r ( i n t i =0; i < 1024; i ++) o u t . w r i t e ( i ) ; // b u f f e r u l nu e s t e p l i n > i n f i s i e r nu s a s c r i s o u t . f l u s h ( ) ; // b u f f e r u l e s t e g o l i t > datele se scriu in f i s i e r 1024) ; //am c r e a t un flux cu buffer de 1024

nimic

C.

Intr ari/Ie siri formatate

Orice program Java are: o intrare standard; o ie sire standard; o ie sire standard pentru erori; In general intrarea standard este tastatura, iar ie sirea standard este ecranul. Intrarea si ie sirea standard sunt de fapt, obiecte pre-create ce descriu uxuri de date pentru citirea respectiv scrierea la dispozitivele standard ale sistemului. Aceste obiecte sunt denite publice n clasa System si sunt:
Variabila Semnicat ie Tip ux

System.in ux standard de intrare InputStream System.out ux standard de ie sire PrintStream System.err ux standard pentru a sarea erorilor PrintStream

Fluxul standard de iesire se folose ste pentru a sarea datelor pe ecran, n modul consola: tem.out.println(mesaj). Fluxul standard pentru a sarea erorilor se folose ste similar: catch (IOException e) { System.err.println("Eroare de intrare/iesire!") }

Sys-

Fluxurile de ie sire pot folosite, a sadar f ar a probleme deoarece tipul lor este PrintStream, clasa primitiv a pentru scrierea efectiv a a datelor. In schimb, uxul standard de intrare System.out, de tip InputStream care este o clasa abstract a, deci pentru a-l putea utiliza va trebui s a-l folosim mpreuna cu un ux de procesare a datelor sau cu orice alt ux ce permite citirea efectiva a datelor. Uzual, se folose ste metoda readLine pentru citirea datelor de la tastatur a si din acest motiv vom folosi intrarea standard mpreun a cu o clasa de procesare care implementeaz a metoda readLine. Exemplul tipic este: BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Introduceti o linie:"); String linie = stdin.readLine() System.out.println(linie); Exemplu: un program care aseaza liniile introduse de la tastatura
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import public java . io . ; class Afisare static { args ) {

public

void main ( S t r i n g [ ]

B u f f e r e d R e a d e r s t d i n = new B u f f e r e d R e a d e r ( new I n p u t S t r e a m R e a d e r ( System . i n ) ) ; String s ; try { w h i l e ( ( s = s t d i n . r e a d L i n e ( ) ) . l e n g t h ( ) != 0 ) System . o u t . p r i n t l n ( s ) ; // P r o g r a m u l s e o p r e s t e cu o l i n i e v i d a } catch ( I O E x c e p t i o n e ) { e . printStackTrace () ; } } }

Se observ a c a metoda readLine poate provoca exceptii de tipul IOException.

II.

TEME DE LABORATOR

1. Intr-un sier se reg asesc pe prima linie dimensiunile nxm ale unei matrice, iar pe urm atoarele linii elementele matricei corespunzatoare dimensiunilor date. S a se citeasc a de la tastatur a nc a o matrice de dimensiune mxn si s a se scrie ntr-un alt sier produsul celor doua matrici.(Se vor folosi clasele FileWriter, FileReader, iar citirea de la tastatur a se va face folosind clasa BueredReader ) 2. S a se citeasc a de la tastatur a un user si o parol a. Acestea se vor compara cu nregistr arile existente n sierul parole.txt. Dac a user-ul si parola se reg asesc printre acestea (pe aceea si linie), se va a sa mesajul acces permis, dac a se reg ase ste doar user-ul, iar parola este gre sit a se va a sa parola gresita si se va mai cere introducerea parolei nc a o dat a, dar nu mai mult de 3 ori, dac a se atinge acest prag se va a sa mesajul cont blocat. In caz contrar se reia procesul de introduce a datelor, dar nu mai mult de 5 ori. Dac a se atinge limita de 5 intr ari se va a sa mesajul Nu ai cont. Inregistreaza-te. (Se vor folosi clasele FileInputStream si FileOutputStream.) Exemplu de date in sierul parole.txt: user user gigi parolaMea user1 parola1 3. Intr-un sier numit clienti.txt sunt memorate date despre client ii unui magazin virtual. Pe ecare linie se ret ine numele, prenumele si v arsta client ilor. Se cere s a se a seze num arul si lista client ilor majori si num arul client ilor minori. !!! Pentru toate problemele se vor folosii mecanisme de aruncare a except ilor.

Laborator 9:
Fire de execuie

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

I. A.

NOIUNI TEORETICE Ce este un r de execuie?

nainte de a deni conceptul de r de execuie sau thread, ne vom opri asupra conceptului de multitasking. Acesta se refer la capacitatea unui computer de a executa mai multe programe (task-uri, procese) n acelai timp. Avnd n vedere aceast noiune, putem deni conceptul de multithreading care se refer la execuia mai multor secvene de cod n acelai timp, n cadrul aceluiai program. O astfel de secven de cod se numete r de execuie sau thread. Un thread se execut n contextul unui program i nu poate tratat dect n cadrul unui program. Exemplele prezentate pn acum au dispus de un sigur r de execuie, adic de o singur structur secvenial de instruciuni.

B.

Lucrul cu re de execuie

Limbajul Java pune la dispoziia programatorului, in pachetul java.lang, dou clase i o interfa pentru lucrul cu thread-uri: clasa Thread : lucru cu thread-uri ca entiti separate; clasa ThreadGroup: crearea unor grupuri de thread-uri n vederea tratrii acestora n mod unitar; interfaa Runnable : lucru cu thread-uri ca entiti separate.

1.

Crearea unui thread derivnd clasa Thread

Operaiile urmtoare reprezint numrul minim de pai ce trebuie ndeplinii pentru lucrul cu un thread creat prin motenirea clasei Thread: 1. crearea unei clase obinuite care motenete clasa Thread.
class MyThread extends Thread{ }

2. suprascrierea metodei public void run() a clasei Thread n clasa derivat, MyThread. Instruciunile din aceast metod trebuie s implementeze ceea ce se dorete ca thread-ul s fac. Aceasta poate apela alte metode, folosi alte clase i declara variabile ca orice metod.Metoda run() este apelat atunci cnd se execut un thread. Pentru a nelege mai bine se face o paralel cu metoda main. Aceasta care este apelat atunci cnd se execut o aplicaie Java. Mai mult, atunci cnd JVM este pornit, se pornete o dat cu ea un thread care apeleaz metoda main. 3. instanierea unui obiect thread prin intermediul operatorului new ;
MyThread obThread = new MyThread();

4. pornirea thread-ului instaniat prin apelul metodei start() motenit din clasa Thread.
obThread.start();

Urmrii un exemplu de lucru cu thread-uri prin derivarea clasei Thread n seciunea II A.

2.

Crearea unui thread implementnd interfaa Runnable

Operaiile care trebuie ndeplinite pentru a putea crea un thread prin implementarea interfeei Runnable sunt urmtorele: 1. crearea unei clase care s implementeze interfaa Runnable.
class MyRunnable implements Runnable { }

2. clasa care implementeaz interfaa Runnable trebuie s suprascrie toate metodele denite n aceasta, dar cum interfaa conine doar metoda run(), ea este singura metod ce trebuie suprascris. Metoda run() implementeaz ceea ce se dorete ca thread-ul s fac. 3. se instaniaz un obiect al clasei create utiliznd operatorul new.
MyRunnable myRunnableObj = new MyRunnable();

4. se instaniaz un obiect al clasei Thread utiliznd un constructor ce are ca i parametru un obiect de tipul clasei care implementeaz interfaa Runnable.
Thread thread = new Thread(myRunnableObj);

5. se pornete thread-ul.
thread.start();

Pentru o mai bun nelegere urmrii exemplul prezentat n seciunea II B.

3.

Clasa Thread vs interfaa Runnable

Clasa Thread denete o serie de metode ce pot suprascrise de clasa ce deriv din Thread. Singura care trebuie suprascris obligatoriu este run(). ns, aceast condiie se impune i in cazul clasei care implementeaz interfaa Runnable. Aadar, dac nu se dorete suprascrierea altor metode din Thread, atunci este mai bine s folosim a doua metod. Mai mult, cum n Java nu este permis motenirea multipl, creare unui thread prin implementarea interfeei Runnable devine un avantaj pentru c acel thread poate s moteneasc funcionaliti denite n alte clase Java.

C.

Controlul unui r de execuie

Un thread se poate aa la un moment dat ntr-una din strile urmtoare: nou creat, n execuie, blocat, terminat. Clasa Thread conine o serie de metode ce controleaz execuia unui thread. Iat cteva dintre cele mai importante: Nume metod String getName() int getPriority() boolean isAlive() void join() void run() Descriere se obine numele thread-ului se obine prioritatea thread-ului determin faptul c un thread mai este n execuie sau nu foreaz un thread s atepte terminarea altuia entry point pentru un thread

static void sleep(long millis) suspend execuia unui thread pentru millis milisecunde void start() void stop() ncepe execuia unui r printr-un apel run() oprete execuia unui thread

Pentru mai multe informaii despre metodele clasei Thread consultai API-ul clasei.

D.

Prioriti

Aparent thread-urile se execut simultan, dar la un moment dat doar un singur thread are acces la resursele de sistem. Fiecare thread obine o perioad de timp n care are acces la resurse, accesul fcndu-se n mod organizat de ctre un planicator. Una dintre regulile pe care se bazeaz planicatorul o reprezint mecanismul de prioriti. Avnd n vedere cele spuse mai sus, ecrui thread i se asociaz un nivel de prioritate (un numr ntreg). Cu ct acest nivel este mai mare cu att thread-ul va avea prioritate mai mare la resurse. Dac totui mai multe thread-uri au acelai nivel de prioritate, mecanismul de prioriti d dreptul de execuie ecruia printr-un algoritm circular. Lucrul cu prioriti este exemplicat n seciunea II D.

E.

Sincronizarea relor de execuie

Exist cazuri n care mai multe thread-uri acceseaz aceeai resurs aparent n acelai timp. Pentru a evita astfel de situaii, care pot crea confuzie, limbajul Java ofer conceptul de monitor. Acest lucru se realizeaz prin declararea unor metode, blocuri de cod ale unui obiect synchronized. Modicatorul synchronized permite unui singur thread accesul, la un moment dat, la acele metode sau blocuri de cod ale obiectului. Aadar, dac un thread apelez o metod synchronized a unui obiect, un alt thread nu are acces la ea pn cnd primul thread nu a terminat-o de executat. Exemplul este prezentat n seciunea II E.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Crearea unui thread derivnd clasa Thread

Exemplul este destul de simplu i nu necesit explicaii suplimentare o dat ce au fost urmrii paii din seciunea I B 1.
1 public c l a s s MyThread extends Thread { 2 3 4 5 6 7 public void run ( ) { System . o u t . p r i n t l n ( " \ t b e g i n run method . . . " ) ; while ( countDown >=0){ System . o u t . p r i n t l n ( " \ t \ t S t e p s l e t f t t o do : "+countDown ) ; p r i v a t e i n t countDown = 1 0 ;

8 9 10 11 12 } } }

countDown ;

System . o u t . p r i n t l n ( " \ t end run method ! " ) ;

1 public c l a s s DemoThread { 2 3 4 5 6 7 8 9 10 11 } } public s t a t i c void main ( S t r i n g [ ] args ) {

System . o u t . p r i n t l n ( " b e g i n main . . . " ) ; MyThread obThread = new MyThread ( ) ; System . o u t . p r i n t l n ( " s t a r t t h e t h r e a d " ) ; obThread . s t a r t ( ) ; System . o u t . p r i n t l n ( " s t i l l i n main . . . " ) ;

Un singur lucru pare s e curios: apariia mesajului still in main... imediat dup mesajul start the thread. Acest lucru se ntmpl din cauza faptului c metoda main are propriul su r de execuie n care ruleaz. Prin apelul metodei start() a thread-ului se cere mainii virtuale Java crearea i pornirea unui nou thread. Din acest moment JVM preia controlul execuiei programului crend contextul necesar unui thread i n acest context se apeleaz metoda run(). Ca urmare se iese imediat din metoda start().

B.

Crearea unui thread implementnd interfaa Runnable

Exemplul prezentat mai jos este puin mai complex n sensul c protm de avantajele implementrii unei interfee, putnd totui moteni orice alt clas.
1 public c l a s s 2 3 4 5 } } Display { public void p r i n t M e s s a g e ( S t r i n g m e s s a g e ) { System . o u t . p r i n t l n ( m e s s a g e ) ;

Clasa MyRunnable motenete clasa Display, dar beneciaz de proprietile unei clase de tip thread prin implementarea interfeei Runnable. Unele dintre mbuntirile ce sunt aduse programului sunt mutarea instanierii thread-ului (se trimite ca parametru obiectul curent, deci un obiect de tipul MyRunnable) i pornirea acestuia n constructorul clasei MyRunnable.
1 public c l a s s MyRunnable extends D i s p l a y implements Runnable { 2 3 4 5 public MyRunnable ( ) { p r i v a t e i n t countDown = 1 0 ; p r i v a t e Thread t h r e a d ;

6 7 8 9 10 11 12 13 14 15 16 17 18 19 } } }

t h r e a d = new Thread ( t h i s ) ; System . o u t . p r i n t l n ( " s t a r t t h e t h r e a d " ) ; thread . s t a r t () ;

public void run ( ) { p r i n t M e s s a g e ( " \ t b e g i n run method . . . " ) ; while ( countDown >= 0 ) { p r i n t M e s s a g e ( " \ t \ t S t e p s l e t f t t o do : " + countDown ) ; countDown ; } p r i n t M e s s a g e ( " \ t end run method ! " ) ;

Clasa DemoRunnable instaniaz un obiect de tipul MyRunnable. Astfel se apeleaz constructorul unde se creeaz i se pornete thread-ul.
1 public c l a s s DemoRunnable { 2 3 4 5 6 7 } } public s t a t i c void main ( S t r i n g [ ] args ) {

System . o u t . p r i n t l n ( " b e g i n main . . . " ) ; MyRunnable myRunnableObj = new MyRunnable ( ) ; System . o u t . p r i n t l n ( " s t i l l i n main . . . " ) ;

C.

Controlul unui r de execuie

Exemplul urmtor prezint modul de utilizare al metodelor clasei Thread. Clasa MyThread motenete clasa Thread i creeaz un constructor cu un parametru ce apeleaz constructorul clasei de baz. Metoda run() este identic cu cea din exemplele anterioare.
1 public c l a s s MyThread extends Thread { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 } } } System . o u t . p r i n t l n ( " \ t end run method ! " ) ; public void run ( ) { System . o u t . p r i n t l n ( " \ t b e g i n run method . . . " ) ; while ( countDown >=0){ } public MyThread ( S t r i n g name ) { super ( name ) ; p r i v a t e i n t countDown = 5 ;

System . o u t . p r i n t l n ( " \ t \ t S t e p s l e t f t t o do : "+countDown ) ; countDown ;

Clasa DemoThread creeaz dou thread-uri. Pe primul l pornete i l suspend pentru 4000 de milisecunde. Observai starea n care se a thread-ul dup suspendarea temporar a acestuia 7

(apelul metodei isAlive()). Apoi, se pornete thread-ul al doilea i se blocheaz resursele acestuia pn cnd se reia execuia lui (apelul metodei resume()). Observai starea thread-ului dup apelul metodei suspend(). n cele din urm, se foreaz blocarea thread-ului principal pn cnd myThread2 ii termin execuia (linia de cod 29).
1 public c l a s s DemoThread { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 } } } myThread2 . s l e e p ( 1 0 0 0 ) ; System . o u t . p r i n t l n ( " end main t h r e a d ! ! ! " ) ; myThread2 . s l e e p ( 2 0 0 0 ) ; myThread2 . resume ( ) ; try { myThread2 . j o i n ( ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { e . printStackTrace () ; System . o u t . p r i n t l n ( " b e f o r e main t h r e a d s l e e p s " ) ; Thread . s l e e p ( 2 0 0 0 ) ; System . o u t . p r i n t l n ( " a f t e r main t h r e a d h a s s l e p t " ) ; } MyThread myThread2 = new MyThread ( " t h r e a d 2 " ) ; System . o u t . p r i n t l n ( myThread2 . getName ( ) ) ; myThread2 . s t a r t ( ) ; myThread1 . s u s p e n d ( ) ; if ( myThread2 . i s A l i v e ( ) ) { System . o u t . p r i n t l n ( myThread2 . getName ( )+" i s a l i v e ! " ) ; } else { System . o u t . p r i n t l n ( myThread2 . getName ( )+" i s t e r m i n a t e d ! " ) ; } } if ( myThread1 . i s A l i v e ( ) ) { System . o u t . p r i n t l n ( myThread1 . getName ( )+" i s a l i v e ! " ) ; } else { System . o u t . p r i n t l n ( myThread1 . getName ( )+" i s t e r m i n a t e d ! " ) ; public s t a t i c void main ( S t r i n g [ ] a r g s ) throws I n t e r r u p t e d E x c e p t i o n {

System . o u t . p r i n t l n ( " b e g i n main t h r e a d . . . " ) ; MyThread myThread1 = new MyThread ( " t h r e a d 1 " ) ; myThread1 . s t a r t ( ) ; System . o u t . p r i n t l n ( myThread1 . getName ( ) ) ; try { myThread1 . s l e e p ( 4 0 0 0 ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { e . printStackTrace () ;

D.

Prioriti

Clasa PriorityThread implementeaz interfaa Runnable i are un constructor cu un parametru ce seteaz nivelul de prioritate al thread-ului i care instaniaz un obiect de tip thread, prezent ca atribut al clasei. Metoda run() apeleaz metoda toString() a clasei Thread ct timp atributul countDown este mai mare ca 0.
1 public c l a s s 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 } } } System . o u t . p r i n t l n ( " \ t end run method ! " ) ; public void run ( ) { thread . s e t P r i o r i t y ( p r i o r i t y ) ; System . o u t . p r i n t l n ( " \ t b e g i n run method . . . " ) ; while ( countDown >=0){ } public P r i o r i t y T h r e a d ( i n t priority ) { P r i o r i t y T h r e a d implements Runnable { p r i v a t e i n t countDown = 5 ; private int priority ;

public Thread t h r e a d ;

this . p r i o r i t y = p r i o r i t y ; t h r e a d = new Thread ( t h i s ) ;

System . o u t . p r i n t l n ( t h r e a d . t o S t r i n g ( )+" countDown : "+countDown ) ; countDown ;

Clasa DemoPriority creeaz dou obiecte de tipul PriorityThread cu parametri declarai ca i constante n clasa Thread. Se pornete execuia acestora i thread-ul principal este obligat s atepte terminarea execuiei celor dou thread-uri anterioare nainte de a deveni inactiv. Observai ordinea n care se pornesc thread-urile i ordinea n care se execut.
1 public c l a s s D e m o P r i o r i t y { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 } } } System . o u t . p r i n t l n ( " end main t h r e a d ! ! ! " ) ; public s t a t i c void main ( S t r i n g [ ] args ) {

System . o u t . p r i n t l n ( " b e g i n main t h r e a d . . . " ) ; P r i o r i t y T h r e a d t h r e ad M i n = new P r i o r i t y T h r e a d ( Thread . MIN_PRIORITY) ; P r i o r i t y T h r e a d threadMax = new P r i o r i t y T h r e a d ( Thread . MAX_PRIORITY) ; threadMin . t h r e a d . s t a r t ( ) ; threadMax . t h r e a d . s t a r t ( ) ; try { threadMax . t h r e a d . j o i n ( ) ; threadMin . t h r e a d . j o i n ( ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { System . o u t . p r i n t l n ( " i n t e r r u p t e d e x c e p t i o n " ) ;

E.

Sincronizarea relor de execuie

Clasa MySynchronized are un constructor cu doi parametri. Unul este de tip String i reprezint numele thread-ului, iar cel de-al doilea este un numr ntreg. Constructorul este cel care instaniaz thread-ul i tot el este cel care l pornete. Observai cele dou metode care folosesc modicatorul synchronized. Prima metod l folosete ca modicator al funciei, iar ce-a de-a doua metod, cea ntre comentarii, l folosete ca i bloc. Important de reinut este c n varianta bloc synchronized se aplic doar pe obiecte.
1 public c l a s s MySynchronized implements Runnable { 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 } } public void run ( ) { System . o u t . p r i n t l n ( t h r e a d . getName ( ) + " s t a r t i n g . " ) ; System . o u t . p r i n t l n ( " \ t t h e numer o f "+t h r e a d . getName ( )+" i s : "+add ( ) ) ; System . o u t . p r i n t l n ( t h r e a d . getName ( ) + " t e r m i n a t i n g . " ) ; } / } } ++c o u n t ; r e t u r n count ; / p u b l i c i n t add ( ) { ( thread ) { } } ++c o u n t ; return c o u n t ; public synchronized i n t add ( ) { c o u n t ++; try { Thread . s l e e p ( 1 0 0 0 ) ; } catch ( I n t e r r u p t e d E x c e p t i o n e ) { System . o u t . p r i n t l n ( " main t h r e a d i n t e r r u p t e d " ) ; } public MySynchronized ( S t r i n g name , this . count = count ; int count ) { private int count ; p r i v a t e Thread t h r e a d ;

t h r e a d = new Thread ( t h i s , name ) ; thread . s t a r t () ;

synchronized c o u n t ++; try {

Thread . s l e e p ( 1 0 0 0 ) ; } catch ( InterruptedException e ) { System . o u t . p r i n t l n ( " main t h r e a d interrupted ") ;

Clasa DemoSynchronized creeaz dou obiecte de tipul MySynchronized.


1 public c l a s s DemoSynchronized {

10

2 3 4 5 6 7 8 }

public s t a t i c void main ( S t r i n g [ ]

args ) {

System . o u t . p r i n t l n ( " b e g i n main t h r e a d . . . " ) ; MySynchronized t h r e a d 1 = new MySynchronized ( " t h r e a d 1 " , 1 ) ; MySynchronized t h r e a d 2 M y S y n c r o n i z e d = new MySynchronized ( " t h r e a d 2 " , 2 ) ; System . o u t . p r i n t l n ( " b e g i n main t h r e a d . . . " ) ; }

III.

TEM

1. Realizai un program care creeaz cel puin dou re de execuie ce calculeaz produsul elementelor aceluiai vector. Elementele vectorului se vor citi din ierul in.txt, iar rezultatul se va aa ntr-un alt ier, out.txt. Cerine de implementare: pentru calculul produsului folosii synchronized (ori modicatorul de acces ori ca bloc); pentru implementarea thread-urilor putei folosi oricare dintre cele dou metode prezentate n laborator; att pentru lucrul cu iere ct i pentru lucrul cu thread-uri se vor folosi mecanisme de tratare a excepiilor.

11

Laborator Nr. 10:


Interfet e grafice n Java

Intocmit de: Dobrina s Alexandra Indrum ator: Asist. Drd. Danciu Gabriel
November 30, 2011

I.

NOT IUNI TEORETICE

Interfat a grac a, - GUI, este un termen cu nt eles larg care se refer a la toate tipurile de comunicare dintre un program si utilizatorii s ai. Aceasta este o particularizare a interfet ei cu utilizatorul - UI, prin care se ntelege interact iune dintre un program si utilizatorii s ai. A sadar, UI se refer a nu numai la ceea ce utilizatorul vede pe ecran ci si la toate mecanismele de comunicare ntre acesta si program. Limbajul Java pune la dispozit ie numeroase clase pentru implementarea diverselor funct ionalit a ti UI, ns a n continuare sunt prezentate acelea care permit realizarea unei intefet e grace cu utilizatorul (GUI). Biblioteca de clase care ofer a servicii grace se numeste java.awt, AWT ind prescurtarea de la Abstract Window Toolkit. In principiu, crearea unei aplicat ii grace presupune urm atoarele: Crearea unei suprafet e de a sare (cum ar o fereastr a) pe care vor a sezate obiectele grace care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc); Crearea si a sezarea obiectelor grace pe suprafat a de a sare n pozi iile corespunz atoare; Denirea unor act iuni care trebuie s a se execute n momentul c and utilizatorul interact ioneaz a cu obiectele grace ale aplicat iei; ,,Ascultarea evenimentelor generate de obiecte n momentul interact iunii cu utilizatorul si executarea act iunilor corespunz atoare a sa cum au fost ele denite. Printr-o component a grac a se nt elege un obiect care are o reprezentare grac a ce poate a sat a pe ecran si care poate interact iona cu utilizatorul. Exemple de componente sunt ferestrele, butoanele, bare de delare, etc. In general, toate componentele sunt dente de clase proprii ce se gasesc n pachetul java.awt. Vezi API aici. Crearea obiectelor grace nu realizeaz a automat si a sarea lor pe ecran. Mai nt ai ele trebuie a aezate pe o suprafat a de a sare, care poate o fereastr a sau suprafat a unui applet, si vor deveni vizibile n momentul n care suprafat a pe care sunt a sate va vizibil a. In general, toate componentele sunt dente de clase proprii ce se g asesc n pachetul java.awt, clasa Component este o superclas a abstract a a tuturor acestor clase. Ierarhia acestor clase este sumarizat a n diagrama de mai jos.

Din cauza modului de imlementare a meniurilor pe diferite sisteme de operare, acestea nu au putut integrate ca obiecte de tip Component. Superclasa cu ajutorul c areia se pot crea meniuri este MenuComponent, iar subclasele sale sunt:

A.

Suprafet e de a sare

Suprafat a pe care se a seaz a obiectele grace se nume ste suprafat a de a sare sau container si reprezint a o instant a a unei clase obtinut a prin extensia superclasei Container. O parte din ierarhia a carei r ad acin a este Container este prezentat a n gura de mai jos:

Componentele ad augate sunt memorate ntr-o list a, iar pozit iile lor din aceast a list a vor deni ordinea de transpunere a acestora n cadrul containerului. Dac a nu este specicat niciun index la ad augarea unei componente, atunci ea va ad augat a pe ultima pozitie a listei.

1.

Ad augarea unei componente

Clasa Container pune la dispozit ie metoda add pentru ad augarea unei componente pe o suprafat a de a sare. O component a nu poate apart ine dec at unui singur container, ceea ce nseamn a c a pentru a muta un obiect dintr-un container n altul trebuie s a-l eliminam mai nt ai de pe containerul init ial. Eliminarea unei componente de pe un container se face cu metoda remove. Exemplu de butoane ad augate ntr-un container:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import j a v a . awt . ; public c l a s s Test1 { p u b l i c s t a t i c void main ( S t r i n g args [ ] ) { frame

// c r e e z c o n t a i n e r u l o b i e c t de t i p Frame f = new Frame ( O f e r e a s t r a ) ; // s e t e z modul de d i p u n e r e a ob . f . s e t L a y o u t ( new FlowLayout ( ) ) ; pe

suprafata

ferestrei

// c r e e z c e l e doua b u t o a n e B u t t o n b1 = new B u t t o n ( OK ) ; B u t t o n b2 = new B u t t o n ( C a n c e l ) ; // adaug p r i m u l f . add ( b1 ) ; f . pack ( ) ; // adaug a l f . add ( b2 ) ; f . pack ( ) ; buton pe suprafata ferestrei

doile

buton

pe

suprafata

ferestrei

// a f i s e z f e r e a s t r a f . show ( ) ; } }

(o

fac

vizibila )

2.

Gestionarea pozit ion arii componentelor ntr-un container

Un gestionar de pozi sionare layout manager este un obiect care controleaz a dimensiunea si aranjarea (pozit ia) componentelor unui container. A sadar, modul de aranjare a componentelor pe o suprafat a de a sare nu este o caracteristic a a clasei Container. Fiecare obiect de tip Container, sau o extensie a lui (Applet, Frame, Panel) are asociat un obiect care se ocup a cu dispunerea componentelor pe suprafat a sa. Toate clasele care instant iaz a obiecte pentru gestionarea pozit ion arii implementeaz a interfat a LayoutManager. La instant ierea unui container se creeaz a implicit un gestionar de pozit ionare asociat acestuia. De exemplu, pentru o fereastr a (un obiect de tip Window sau o subclasa a sa) gestionarul implict este de tip BorderLayout, n timp ce pentru un container de tip Panel este o instanta a clasei FlowLayout. Cei mai utilizat i gestionari din pachetul java.awt sunt: FlowLayout BorderLayout GridLayout CardLayout GridBagLayout Detalii despre modul de utilizare a gestionarilor de pozit ionare se g asesc aici.
B. Gruparea componentelor (Clasa Panel)

Plasarea componentelor direct pe suprafat a de a sare poate deveni incomod a n cazul n care avem multe obiecte grace. Din acest motiv se recomand a gruparea obiectelor grace nrudite ca funct ii astfel nc at s a putem siguri c a, indiferent de gestionarul de pozit ionare al suprafet ei de a sare, ele se vor g asi mpreun a. Gruparea componentelor se face folosind panel-uri. Un panel este cel mai simplu model de container. El nu are o reprezentare vizibil a, rolul s au ind de a oferi o suprafat a de a sare pentru componente grace, inclusiv pentru alte panel-uri. Clasa care instant iaz a aceste obiecte este Panel, extensie a superclasei Container. Pentru a aranja corespunzator componentele grupate ntr-un panel, acestuia i se poate specica un gestionar de pozit ionare anume, folosind metoda setLayout. Gestionarul implicit pentru containerele de tip Panel este FlowLayout. A sadar, o aranjare ecient a a componentelor unei ferestre nseamn a: gruparea componentelor ,, nfr a tite (care nu trebuie sa e despartie de gestionarul de pozitionare al ferestrei) n panel-uri; aranjarea componentelor unui panel, prin specicarea acestuia a unui gestionar de pozit ionare corespunz ator; aranjarea panel-urilor pe suprafat a ferestrei, prin specicarea gestionarului de pozit ionare al ferestrei. Exemplu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import j a v a . awt . ; public c l a s s Test2 { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( P a n e l ) ; Panel panel panel panel panel f f f f p a n e l = new P a n e l ( ) ; . s e t L a y o u t ( new FlowLayout ( ) ) ; . add ( new L a b e l ( Text : ) ) ; . add ( new T e x t F i e l d ( , 2 0 ) ) ; . add ( new B u t t o n ( R e s e t ) ) ; {

. add ( p a n e l , B o r d e r L a y o u t .NORTH) ; . add ( new B u t t o n ( OK ) , B o r d e r L a y o u t . EAST) ; . add ( new B u t t o n ( C a n c e l ) , B o r d e r L a y o u t .WEST) ; . pack ( ) ;

f . show ( ) ; } }

C.

Componente grace

Unele dintre cele mai utilizate componente grace sunt: etichetele, butoanele, c ampurile de text, listele derulante, etc. O list a complet a a claselor cu ajutorul c arora se denesc componentele grace, precum si propriet a tile lor se g ase ste aici.

1.

Clasa Label

Un obiect de tip Label (etichet a) reprezint a o component a pentru plasarea unui text pe o suprafat a de a aare. O eticheta este formata dintr-o singura linie de text static ce nu poate modicat de catre utilizator, dar poate modicat din program. Exemplu: Cinci etichete si ad augate ntr-un container.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import j a v a . awt . ; public c l a s s TestLabel { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( T e s t L a b e l ) ; f . s e t L a y o u t ( new B o r d e r L a y o u t ( ) ) ;

L a b e l nord , sud , e s t , v e s t , c e n t r u ; n o r d = new L a b e l ( Nord , L a b e l .CENTER) ; s u d = new L a b e l ( Sud , L a b e l .CENTER) ; e s t = new L a b e l ( E s t , L a b e l . RIGHT) ; v e s t = new L a b e l ( V e s t , L a b e l . LEFT) ; c e n t r u = new L a b e l ( C e n t r u , L a b e l .CENTER) ; centru . setBackground ( Color . yellow ) ; c e n t r u . s e t F o n t ( new Font ( A r i a l , Font . BOLD, f f f f f f . add ( nord , B o r d e r L a y o u t .NORTH) ; . add ( sud , B o r d e r L a y o u t . SOUTH) ; . add ( e s t , B o r d e r L a y o u t . EAST) ; . add ( v e s t , B o r d e r L a y o u t .WEST) ; . add ( c e n t r u , B o r d e r L a y o u t .CENTER) ; . pack ( ) ;

14) ) ;

f . show ( ) ; } }

2.

Clasa Button

Un obiect de tip Button se folose ste pentru plasarea unui buton etichetat pe o suprafata de asare. Exemplu: Doua butoane ad augate pe o fereastr a;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import j a v a . awt . ; public c l a s s TestButton { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( B u t t o n ) ; f . s e t L a y o u t ( new FlowLayout ( ) ) ; f . s e t S i z e (200 , 200) ;

B u t t o n b1 = new B u t t o n ( OK ) ; b1 . s e t B o u n d s ( 3 0 , 3 0 , 5 0 , 7 0 ) ; b1 . s e t F o n t ( new Font ( A r i a l , Font . BOLD, 1 4 ) ) ; b1 . s e t B a c k g r o u n d ( j a v a . awt . C o l o r . o r a n g e ) ; f . add ( b1 ) ; B u t t o n b2 = new B u t t o n ( C a n c e l ) ; b2 . s e t B o u n d s ( 1 0 0 , 3 0 , 7 0 , 5 0 ) ; b2 . s e t F o r e g r o u n d ( j a v a . awt . C o l o r . b l u e ) ; f . add ( b2 ) ; f . pack ( ) ; f . show ( ) ; } }

3.

Clasa Checkbox

Un obiect de tip Checkbox reprezint a o component a care are dou a st ari : selectat a sau neselectat a. Este folosit pentru a prelua anumite opt iuni de la utilizator.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

import

j a v a . awt . ;

p u b l i c c l a s s TestCheckBox { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( CheckBox ) ; f . s e t L a y o u t ( new G r i d L a y o u t ( 5 , 1 ) ) ; f . s e t S i z e (200 , 200) ; Label label1 Label label2

l a b e l 1 = new L a b e l ( I n g r e d i e n t e P i z z a : , . setBackground ( Color . orange ) ; l a b e l 2 = new L a b e l ( ) ; . setBackground ( Color . lightGray ) ; c b x 1 = new Checkbox ( c a s c a v a l ) ; c b x 2 = new Checkbox ( s u n c a ) ; c b x 3 = new Checkbox ( a r d e i ) ;

L a b e l .CENTER) ;

Checkbox Checkbox Checkbox f f f f f

. add ( l a b e l 1 ) ; . add ( l a b e l 2 ) ; . add ( c b x 1 ) ; . add ( c b x 2 ) ; . add ( c b x 3 ) ;

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

4.

Clasa Choice

Un obiect de tip Choice dene ste o list a de opt iuni din care utilizatorul poate selecta una singur a. La un moment dat, din ntreaga list a doar o singura opt iune este vizibil a, cea selectat a n momentul curent.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import j a v a . awt . ; public c l a s s Choice { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( C h o i c e ) ; f . s e t L a y o u t ( new G r i d L a y o u t ( 4 , 1 ) ) ; f . s e t S i z e (200 , 200) ; L a b e l l a b e l = new L a b e l ( A l e g e t i label . setBackground ( Color . red ) ; Choice culori culori culori culori c u l o r i = new C h o i c e ( ) ; . add ( Rosu ) ; . add ( Verde ) ; . add ( A l b a s t r u ) ; . s e l e c t ( Rosu ) ;

culoarea ) ;

f . add ( l a b e l ) ; f . add ( c u l o r i ) ; f . pack ( ) ; f . show ( ) ; } }

5.

Clasa TextField

Un obiect de tip TextField dene ste un control de editare a textului pe o singur a linie. Este util pentru interogarea utilizatorului asupra unor valori.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import j a v a . awt . ; public c l a s s TestText { p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) Frame f = new Frame ( Text ) ; f . s e t L a y o u t ( new G r i d L a y o u t ( 3 , 1 ) ) ; f . s e t S i z e (200 , 200) ; f . setBackground ( Color . lightGray ) ;

T e x t F i e l d nume = new T e x t F i e l d ( , 3 0 ) ; T e x t F i e l d p a r o l a = new T e x t F i e l d ( , 1 0 ) ; p a r o l a . setEchoChar ( ) ; P a n e l p1 = new P a n e l ( ) ; p1 . s e t L a y o u t ( new FlowLayout ( FlowLayout . LEFT) ) ; p1 . add ( new L a b e l ( Nume : ) ) ; p1 . add ( nume ) ; P a n e l p2 = new P a n e l ( ) ; p2 . s e t L a y o u t ( new FlowLayout ( FlowLayout . LEFT) ) ;

21 22 23 24 25 26 27 28 29 30 31 32 33

p2 . add ( new L a b e l ( P a r o l a : ) ) ; p2 . add ( p a r o l a ) ; L a b e l a c c e s = new L a b e l ( I n t r o d u c e t i f . add ( p1 ) ; f . add ( p2 ) ; f . add ( a c c e s ) ; f . pack ( ) ; f . show ( ) ; } } numele si parola ! , L a b e l .CENTER) ;

II.

TEMA

1. Compilat i si rulat i aplicat ile prezentate. Modicat i programele astfel nc at s a se pun a n evident a toate tipurile de ,,aranjare a componentele pe container. 2. Realizat i un program, pe o anumit a tem a, n care s a utilizat i c at mai multe diintre componentele ce pot ad augate pe un container. Folosit i cel put in o component a care nu a fost prezentat a n acest laborator(vedet i API-ul.) 3. Realizat i o interfat a pentru un calculator. Vezi calculatorul din Windows. Container-ul va trebui s a cont in a butoanele pentru cifre, butoanele pentru operat ii aritmetice, ,,fereastra pentru a sare, precum si alte butoane necesare efectu arii calculelor aritmetice..

Laborator 11:
Evenimente generate de componente AWT

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 4 decembrie 2011

I.

NOIUNI TEORETICE

Unei componente grace i este asociat: o form (ceea ce este aat pe ecran); o serie de evenimente la care poate rspunde (micri de mouse, apsare de taste); un model obiectual de responsabil cu prelucrarea evenimentului (ceea ce face componenta propriu-zis).

A.

Ce este un eveniment?

La aciunea utilizatorului asupra unei componente grace, JVM genereaz aa numitele evenimente. Evenimentul este de fapt o instan a unei clase Java, instan care conine o serie de informaii despre aciune.

B.

Modelul de evenimente

Modelul de lucru cu evenimente prezentat n aceast documentaie (modelul jdk1.1) conine o surs, care poate genera un eveniment, i unul sau mai muli delegai. Sursa poate oricare dintre componentele grace. Delegaii, numii i handleri, sunt cei responsabili de rspunsul la eveniment (cei care prelucreaz informaia provenit de la eveniment). Mai mult, ei sunt denii de programator i datorit acestui model de implementare a evenimentelor, pot orice ce clas ce implementeaz o interfa corespunztoare evenimentului respectiv. Pe lng implementarea clasei delegat, programatorul este responsabil de asocierea acesteia cu sursa de evenimente. Aceast asociere se poate face printr-o metod a sursei (a componentei grace), metod dependent de tipul delegatului ce trebuie conectat.

Figura 1: Modelul de evenimente jdk1.1

C.

Tipuri de evenimente

Diferite surse (componente grace) pot genera diferite tipuri de evenimente. ActionEvent : indic dac a avut loc o aciune denit de o component; ComponentEvent : clasa rdcin a evenimentelor; indic dac o component i-a modicat dimensiunea, vizibilitatea sau dac a fost mutat; ContainerEvent : specic dac s-a modicat coninutul unui container n urma adugrii sau eliminrii unei componente; KeyEvent : precizeaz dac s-a apsat sau nu o tast; MouseEvent : precizeaz dac a avut loc o aciune de genul apasarea unei taste a mouse-ului, amd.; MouseMotionEvent : precizeaz dac a avut loc o aciune de genul micare de mouse; WindowEvent : eveniment generat n momentul n care s-a deschis/inchis, activat/dezactivat o fereastr. 3

Pentru a rspunde unui eveniment este necesar crearea unuia sau mai multor handlere de eveniment (delegai) i asocierea lor cu componenta corespunztoare. Pentru crearea unui handler e nevoie de implementarea unei anumite interfee (n funcie de tipul evenimentului) ntr-o anumit clas. Asocierea handler - component se face prin intermediul unor metode ale clasei Component, n funcie de tipul evenimentului. Component grac Interfa Component ComponentListener KeyListener MouseListener Metode de asociere handler - component addComponentListener(ComponentListener l) addKeyListener(KeyListener l) addMouseListener(MouseListener l)

MouseMotionListener addMouseMotionListener(MouseMotionListener l) Button CheckBox Choice List ActionListener ItemListener ComponentListener TextField ActionListener TextListener ComponentListener Window Frame Dialog FileDialog MenuItem Menu PopupMenu ActionListener addActionListener(ActionListener l) ComponentListener ContainerListener WindowListener addActionListener(ActionListener l) addItemListener(ItemListener l) cele de la clasa Component addActionListener(ActionListener l) addTextListener(TextListener l) cele de la clasa Component cele de la clasa Component addContainerListener(ContainerListener l) addWindowListener(WindowListener l) ActionListener ItemListener addActionListener(ActionListener l) addItemListener(ItemListener l)

Interfa ActionListener

Metode ce trebuie implementate actionPerformed(ActionEvent e)

ComponentListener componentResized(ComponentEvent e) componentMoved(ComponentEvent e) componentShown(ComponentEvent e) componentHidden(ComponentEvent e) MouseListener mouseClicked(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) MouseMotionListener mouseDragged(MouseMotionEvent e) mouseMoved(MouseMotionEvent e) KeyListener keyTyped(KeyEvent e) keyPressed(KeyEvent e) keyReleased(KeyEvent e) WindowListener windowOpened(WindowEvent e) windowClosed(WindowEvent e) windowActivated(WindowEvent e) etc.

D.

Componenta FileDialog

Clasa FileDialog este o clas derivat din clasa Dialog, iar aceasta din urm derivat din clasa Window. FileDialog este aadar o fereastr, fereastr utilizat pentru selecia unui ier. Aceasta aeaz un arbore ce reprezint structura ierarhic a directoarelor i ierelor i permite utilizatorului cutarea n aceast structur i selecia unui ier. Exist dou tipuri de ferestre FileDialog : fereastr de tipul load i una de tipul save. Primul tip permite doar selecia unui ier existent, pe cnd al doilea tip ofer i posibilitatea crerii unui ier nou. O dat un ier selectat, fereastra se nchide automat.

Pentru a ti mai multe despre aceast clas se recomand citirea API-ului.

E.

Componente AWT de lucru cu meniuri

Clasa MenuBar este utilizat pentru a crea o bar de meniuri. Aceast bar de meniuri poate asociat doar unei ferestre grace de tipul Frame utiliznd metoda setMenuBar(MeniuBar mb) a clasei Frame. O bar de meniuri este utilizat ca i cadru n care se adaug componente de tip Menu. API-ul clasei se a aici. Clasa MenuItem reprezint clasa ce implementez un meniu. La selecia unui meniu acesta genereaz un eveniment de tipul ActionEvent care poate preluat de un handler de tipul ActionListener. API-ul clasei se a aici. Clasa Menu este derivat din MenuItem i este componenta ce ofer posibilitatea crerii unei structuri verticale de meniuri. n plus fa de clasa MenuItem, clasa Menu poate crea o component cadru n care se pot adug alte meniuri (componente de tip MenuItem ). API-ul clasei se a aici. Clasa MenuShortcut nu reprezint o component grac, dar este corelat lucrului cu meniuri. Aceasta este utilizat pentru a asocia unei componente de tip MenuItem o combinaie de taste. API-ul clasei se a aici.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Evenimentul ActionEvent

Componenta Button creeaz imaginea unui buton asupra cruia se poate aciona prin apsare (cu ajutorul mouse-ului sau a tastaturii). La apsarea acestui tip de component se va genera un eveniment de tipul ActionEvent care poate tratat de programator printr-un handler nregistrat la aceast component. Handler-ul n acest caz este reprezentat de clasa MyButtonListener. Dup instanierea unui obiect de acest tip, programatorul trebuie s asocieze respectivul obiect instaniat cu componenta Button (addActionListener()). Observai c naintea acestui pas, componentei Button i s-a setat un ir care va nscris n obiectul eveniment de tip ActionEvent ce se genereaz cnd se apas butonul. Acest lucru a fost realizat prin apelarea metodei setActionCommand().
1 import j a v a . awt . ;

2 import j a v a . awt . e v e n t . A c t i o n L i s t e n e r ; 3 4 public c l a s s T e s t B u t t o n { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 } } f . pack ( ) ; f . s e t V i s i b l e ( true ) ; b = new Button ( " A u r e v o i r " ) ; f . add ( b ) ; b . setActionCommand ( " E x i t " ) ; b . addActionListener ( actionListener ) ; b = new Button ( " GoodDay " ) ; f . add ( b ) ; b . addActionListener ( actionListener ) ; ActionListener a c t i o n L i s t e n e r = new M y B u t t o n L i s t e n e r ( ) ; Button b = new Button ( " B o n j o u r " ) ; f . add ( b ) ; b . setActionCommand ( " B o n j o u r " ) ; public s t a t i c void main ( S t r i n g [ ] args ) {

Frame f = new Frame ( " F e r e a s t r a Buton " ) ; f . s e t L a y o u t ( new FlowLayout ( ) ) ;

b . addActionListener ( actionListener ) ;

Pentru crearea handler-ului sau delegatului acestui eveniment, programatorul trebuie s implementeze interfaa ActionListener ntr-o clas (MyButtonListener ). Metoda ce trebuie suprascris n acest caz este actionPerformed(). De asemenea, observai folosirea metodei getActionCommand care returneaz informaia setat n clasa TestButton.
1 import j a v a . awt . e v e n t . ; 2 3 public c l a s s M y B u t t o n L i s t e n e r implements A c t i o n L i s t e n e r { 4 5 6 7 8 9 10 11 12 13 14 } } } public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t a e ) { String if s = a e . getActionCommand ( ) ;

( s . equals ( " Exit " ) ) { System . e x i t ( 0 ) ;

} else

if

( s . e q u a l s ( " Bonjour " ) ) {

System . o u t . p r i n t l n ( " Good Morning " ) ; } else { System . o u t . p r i n t l n ( s + " c l i c k e d " ) ;

B.

Evenimentul KeyEvent

Clasa urmtoare creez o etichet i o component de tip text pe care le adaug ntr-o fereastr. La apasarea oricrei taste se declanseaz un eveniment de tipul KeyEvent. Evenimentul este tratat de ctre handler-ul MyKeyListener i a fost asociat componentei de tip text prin intermediul metodei addKeyListener().
1 import j a v a . awt . ; 2 import j a v a . awt . e v e n t . K e y L i s t e n e r ; 3 4 public c l a s s TestKey { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 } } f . pack ( ) ; f . s e t V i s i b l e ( true ) ; f . add ( t x t F i e l d , f . add ( l a b e l , B o r d e r L a y o u t .CENTER) ; L a b e l l a b e l = new L a b e l ( " S c r i e : " ) ; TextField t x t F i e l d = new T e x t F i e l d ( 2 0 ) ; k e y L i s t e n e r = new MyKeyListener ( ) ; public s t a t i c void main ( S t r i n g [ ] args ) {

Frame f = new Frame ( " F e r e a s t r a keyEvent " ) ;

KeyListener

t x t F i e l d . addKeyListener ( keyListener ) ;

B o r d e r L a y o u t .NORTH) ;

ntruct handler-ul implementeaz interfaa KeyListener trebuie s-i suprascrie toate metodele. S-a scris cod doar pentru metoda keyPressed() care se va apela doar n momentul apsrii unei taste.
1 import j a v a . awt . e v e n t . ; 2 3 public c l a s s MyKeyListener implements K e y L i s t e n e r { 4 5 6 7 8 9 10 11 12 13 14 15 16 17 } @Ove rrid e public void k e y R e l e a s e d ( KeyEvent a r g 0 ) {} @Ove rrid e public void keyTyped ( KeyEvent a r g 0 ) {} } @Ove rrid e public void k e y P r e s s e d ( KeyEvent keyEvent ) { char i = keyEvent . getKeyChar ( ) ; String s t r = Character . toString ( i ) ;

System . o u t . p r i n t l n ( " Key p r e s s e d : "+ s t r ) ;

C.

Evenimentul MouseEvent

Exemplul de mai jos creaz dou etichete i un buton. La apsarea butonului se va aa n consol suma numerelor coninute de etichete.
1 import j a v a . awt . ; 2 import j a v a . awt . e v e n t . ; 3 4 public c l a s s T e s t M o u s e C l i c k { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 } } f . pack ( ) ; f . s e t V i s i b l e ( true ) ; Button b u t t o n = new Button ( " C l i c k Me" ) ; M o u s e L i s t e n e r m o u s e L i s t e n e r = new MyMouseListener ( l a b e l X , button . addMouseListener ( mouseListener ) ; f . add ( button , B o r d e r L a y o u t .SOUTH) ; labelY ) ; L a b e l l a b e l Y = new L a b e l ( " 2 " ) ; f . add ( l a b e l Y , B o r d e r L a y o u t .NORTH) ; public s t a t i c void main ( S t r i n g [ ] args ) {

Frame f = new Frame ( " F e r e a s t r a mouse c l i c k " ) ;

L a b e l l a b e l X = new L a b e l ( " 1 " ) ; f . add ( l a b e l X , B o r d e r L a y o u t .CENTER) ;

Clasa handler se numete MyMouseListener i suprascrie toate metodele interfeei MouseListener, dar scrie cod efectiv doar pentru metoda care se declaneaz n momentul apsrii unei taste a mouse-ului. Aceast metod preia informaiile coninute de etichetele transmise ca parametru la instanierea handler-ului i aeaz n consol.
1 import j a v a . awt . L a b e l ; 2 import j a v a . awt . e v e n t . ; 3 4 public c l a s s MyMouseListener implements M o u s e L i s t e n e r { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 @Ove rrid e public void mouseEntered ( MouseEvent a r g 0 ) {} @Ove rrid e public void m o u s e E x i t e d ( MouseEvent a r g 0 ) {} } @Ove rrid e public void m o u s e C l i c k e d ( MouseEvent mouseEvent ) { int x = I n t e g e r . p a r s e I n t ( labelX . getText ( ) ) ; int y = I n t e g e r . p a r s e I n t ( labelY . getText ( ) ) ; System . o u t . p r i n t l n ( x+" + "+y+" = " +(x+y ) ) ; } public MyMouseListener ( L a b e l x , this . labelX = x ; this . labelY = y ; Label y ) { Label labelX , labelY ;

23 24 25 26 27 }

@Ove rrid e public void m o u s e P r e s s e d ( MouseEvent a r g 0 ) {} @Ove rrid e public void m o u s e R e l e a s e d ( MouseEvent a r g 0 ) {}

D.

Componenta FileDialog

La pornirea aplicaiei se va deschide o fereastr FileDialog de tipul load cu numele Choose a le. Structura de directoare din care se pornete este D:\.
1 import j a v a . awt . ; 2 3 public c l a s s 4 5 6 7 8 9 10 11 } } TestFileDialog { args ) {

public s t a t i c void main ( S t r i n g [ ]

Frame f r a m e = new Frame ( " T e s t f i l e D i a l o g " ) ; FileDialog f i l e D i a l o g = new F i l e D i a l o g ( frame , " Choose a f i l e " , F i l e D i a l o g .LOAD) ;

f i l e D i a l o g . s e t D i r e c t o r y ( "D: \ \ " ) ; f r a m e . addWindowListener ( new M y F i l e D i a l o g L i s t e n e r ( f i l e D i a l o g ) ) ; f r a m e . s e t V i s i b l e ( true ) ;

n urma implementrii interfeei WindowListener trebuie suprascrise o sumedenie de metode (vezi al doilea tabel din sectiunea I C). Cum exemplul are scris cod doar pentru metoda windowOpened() care se va apela n momentul n care se deschide fereastra, dorim s nu mai suprascriem toate celelalte metode asa cum au fost denite in exemplele anterioare. Astfel c se motenete clasa WindowAdapter. Clase de tipul Adapter exist pentru ecare eveniment n parte.
1 import j a v a . awt . F i l e D i a l o g ; 2 import j a v a . awt . e v e n t . ; 3 / am f o l o s i t 4 obligati c l a s a WindowAdapter p e n t r u a s u p r a s c r i e W i n d o w L i s t e n e r / d o a r anumite metode s i nu t o a t e cum am f i fost

daca implementam i n t e r f a t a

5 public c l a s s 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 } } @Ove rrid e } FileDialog

M y F i l e D i a l o g L i s t e n e r extends WindowAdapter { fileDialog ;

public M y F i l e D i a l o g L i s t e n e r ( F i l e D i a l o g this . f i l e D i a l o g = f i l e D i a l o g ;

fileDialog ) {

public void windowOpened ( WindowEvent e ) { f i l e D i a l o g . s e t V i s i b l e ( true ) ; String if fileName = f i l e D i a l o g . g e t F i l e () ;

( f i l e N a m e == n u l l ) System . o u t . p r i n t l n ( " You c a n c e l l e d t h e c h o i c e " ) ;

else System . o u t . p r i n t l n ( " You c h o s e " + f i l e N a m e ) ;

10

E.

Componente AWT de lucru cu meniuri

Clasa de mai jos realizeaz o bara de meniuri care conine elementele urmtoare: File cu submeniul format din: Open, Exit i Edit cu submeniul format din Undo. Att Exit ct i Undo au i un shortcut creat cu clasa MenuShortcut. Explicaiile suplimentare le avei trecute n comentariu.
1 import j a v a . awt . ; 2 import j a v a . awt . e v e n t . ; 3 4 public c l a s s TestMenu { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 } } f r a m e . s e t V i s i b l e ( true ) ; // s e asociaza componentele grafice cu h a n d l e r u l MyActionListener // s e seteaza informatiile ce vor fi transmise h a n d l e r u l u i o d a t a cu d e c l a n s a r e a evenimentului // s e adauga fiecare componente MenuItem i n componenta Menu c o r e s p u n z a t o a r e // s e creeaza o b i e c t e de t i p u l MenuItem // s e c r e e a z a componente Menu c a r e s e adauga i n b a r a de m e n i u r i // s a c r e a t si s a a d a u g a t o b a r a de m e n i u r i in fereastra public s t a t i c void main ( S t r i n g [ ] args ) {

Frame f r a m e = new Frame ( " Meniu " ) ; // s e seteaza dimendiunea 100) ; ferestrei

frame . s e t S i z e ( 1 0 0 ,

MenuBar myMenuBar = new MenuBar ( ) ; f r a m e . setMenuBar ( myMenuBar ) ;

Menu myFileMenu = new Menu ( " F i l e " ) ; Menu myEditMenu = new Menu ( " E d i t " ) ; myMenuBar . add ( myFileMenu ) ; myMenuBar . add ( myEditMenu ) ;

MenuItem myFileOpenMenuItem = new MenuItem ( " Open . . . " ) ; / s e foloseste clasa MenuShortcut p t crearea unei c o m b i n a t i i de t a s t e pt a c c e s a r e a

c o m p o n e n t e i MenuItem E x i t / MenuItem myFileExitMenuItem = new MenuItem ( " E x i t " , new MenuShortcut ( KeyEvent .VK_X) ) ; MenuItem myEditUndoMenuItem = new MenuItem ( " Undo " , new MenuShortcut ( KeyEvent .VK_Z) ) ;

myFileMenu . add ( myFileOpenMenuItem ) ; myFileMenu . a d d S e p a r a t o r ( ) ; myFileMenu . add ( myFileExitMenuItem ) ; myEditMenu . add ( myEditUndoMenuItem ) ;

myFileOpenMenuItem . setActionCommand ( " open " ) ; myFileExitMenuItem . setActionCommand ( " e x i t " ) ; myEditUndoMenuItem . setActionCommand ( " undo " ) ;

ActionListener

a c t i o n L i s t n e r = new M y A c t i o n L i s t e n e r ( ) ;

myFileOpenMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ; myFileExitMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ; myEditUndoMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ;

11

Clasa handler MyActionListener :


1 import j a v a . awt . e v e n t . ; 2 3 public c l a s s 4 5 6 7 8 9 10 11 12 13 14 15 16 } } } @Ove rrid e public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { S t r i n g cmd = e . getActionCommand ( ) ; if ( cmd . e q u a l s ( " open " ) ) { System . o u t . p r i n t l n ( " open " ) ; } else if ( cmd . e q u a l s ( " e x i t " ) ) { M y A c t i o n L i s t e n e r implements A c t i o n L i s t e n e r {

System . e x i t ( 0 ) ; } else if ( cmd . e q u a l s ( " undo " ) ) {

System . o u t . p r i n t l n ( " undo " ) ;

III.

TEM

1. Continuai exerciiul 3 din Laborator10.pdf n felul urmtor: Implementai funcionalitile calculatorului (operaiile aritmetice specicate). Calculatorul va efectua operaiile att la apasarea butoanelor cu ajutorul mouse-ului ct i la apsarea tastelor corespunztoare de pe tastatur. Pe lng cerinele de implementare ale interfeei specicate n laboratorul anterior, adugai o bar de meniu asemntoare cu cea a calculatorului din Windows. (File: Exit Ctrl+X; Edit: Copy Ctrl+C, Paste Ctrl+V). Pentru nota 10 implementai i funcionalitile meniului.

12

Laborator 12:
Interfee grafice n Java Componente Swing

ntocmit de: Adina Neculai ndrumtor: Asist. Drd. Gabriel Danciu 11 decembrie 2011

I.

NOIUNI TEORETICE

Swing este o librrie a limbajului Java, librrie ce este considerat o extensie a lui AWT. Swing conine componente noi i mbuntite care sporesc funcionalitatea i nfiarea GUI-ului n Java. Pachetul din care vom lua componentele necesare se numete javax.swing. Cteva dintre caracteristicile care au fost adugate n acest pachet sunt urmtoarele: S-au introdus componente diverse cum ar : tabele, arbori, slider-e, bare de progres, componente text; componentele Swing au tooltip-uri plasate deasupra lor. Un tooltip este o fereastr de tipul popup care apare temporar deasupra unei componente atunci cnd cursorul mouse-ului se a pe componenta respectiv. Acestea sunt utilizate pentru a oferi mai multe informaii despre componenta n cauz. Privii n imaginea urmtoare relaia dintre clasele pachetului awt i clasele pachetului swing :

Figura 1: Ierarhia claselor Swing i relaia cu clasele AWT

Avnd n vedere faptul c librria Swing a fost construit peste AWT, paii ce trebuie urmai pentru a realiza o aplicaie grac n Java rmn aceiai: Crearea unei suprafee de aare pe care vor aezate componentele grace (butoane, controale de editare, texte, etc); Crearea i aezarea obiectelor grace pe suprafaa de aare n poziiile corespunztoare; Denirea unor aciuni care trebuie s se execute n momentul cnd utilizatorul interacioneaz cu obiectele grace ale aplicaiei; Ascultarea evenimentelor generate de obiecte n momentul interaciunii cu utilizatorul i executarea aciunilor corespunztoare aa cum au fost ele denite.

A.

Componente grace Swing

Cele mai folosite componente grace sunt reprezentate n gura urmtoare:

Figura 2: Ierarhia componentelor Swing

B.

Componente meniu n Swing

Bara de meniu poate creat cu ajutorul clasei JMenuBar care permite adugarea componentelor de tipul JMenu pentru a construi meniul propriu-zis. JMenu este o fereastr popup care conine componente JMenuItem i care este aat atunci cnd utilizatorul selecteaz o component JMenuBar. n plus, o component JMenu poate conine JSeparator. Clasa JMenuItem realizeaz de fapt un buton din lista care se aeaz utilizatorului atunci cnd acesta selecteaz o component JMenu. Clasele sale copil sunt: JCheckBoxMenuItem, JMenu, JRadioButtonMenuItem. De ce i JMenu ? Pentru c un JMenu poate conine ca JMenuItem un submeniu. Nu consider necesar explicarea componentelor JCheckBoxMenuItem, JRadioButtonMenuItem. Urmrii exemplul prezentat n seciunea II D.

II.

PREZENTAREA LUCRRII DE LABORATOR A. Componenta JLabel

Exemplul de mai jos creeaz o multitudine de etichete Swing, aranjndu-le n moduri diferite. Ce se poate observa este c, spre deosebire de etichetele AWT, cele Swing pot introduce i imagini pe lng textul propriu-zis. De asemenea, se vor folosi aceiai gestionari de poziie din pachetul AWT. n acest caz avem FlowLayout. Imaginile se vor aduga cu ajutorul clasei ImageIcon al crei constructor conine ca i parametru un String ce reprezint calea ctre imaginea dorit. Metoda makeLabel() returneaz un obiect JLabel, obiect instaniat cu irul de caractere Smile concatenat cu numrul etichetei, iar al doilea parametru reprezint obiectul imagine. Tot n metoda makeLabel se seteaz poziia irului de caractere pe vertical i pe orizontal cu ajutorul unor numere ntregi primite ca parametru. Aceste numere ntregi sunt de fapt constante ale clasei JLabel.
1 import j a v a . awt . ; 2 import j a v a x . s w i n g . ; 3 4 public c l a s s LableExample { 5 6 7 public s t a t i c void main ( S t r i n g [ ] args ) { public s t a t i c Icon i c o n = new I m a g e I c o n ( " r e s u r s e / s m i l e . g i f " ) ;

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 } } }

JFrame f r a m e = new JFrame ( " L a b e l Example " ) ; frame . s e t S i z e ( 3 5 0 , 200) ;

f r a m e . s e t L a y o u t ( new FlowLayout ( ) ) ;

JLabel [ ]

l a b e l s = new J L a b e l [ 9 ] ; J L a b e l . LEFT, 0) ; 1) ; 2) ; 3) ; 4) ; 5) ; 6) ; 7) ; 8) ;

l a b e l s [ 0 ] = makeLabel ( J L a b e l . TOP, l a b e l s [ 1 ] = makeLabel ( J L a b e l . TOP, l a b e l s [ 2 ] = makeLabel ( J L a b e l . TOP,

J L a b e l .CENTER, J L a b e l . RIGHT,

l a b e l s [ 3 ] = makeLabel ( J L a b e l .CENTER, l a b e l s [ 4 ] = makeLabel ( J L a b e l .CENTER, l a b e l s [ 5 ] = makeLabel ( J L a b e l .CENTER, l a b e l s [ 6 ] = makeLabel ( J L a b e l .BOTTOM, l a b e l s [ 7 ] = makeLabel ( J L a b e l .BOTTOM, l a b e l s [ 8 ] = makeLabel ( J L a b e l .BOTTOM,

J L a b e l . LEFT,

J L a b e l .CENTER, J L a b e l . RIGHT, J L a b e l . LEFT,

J L a b e l .CENTER, J L a b e l . RIGHT,

// d e z a c t i v e a z a

eticheta 0

l a b e l s [ 0 ] . setEnabled ( false ) ;

// s e

dezactiveaza

eticheta

1.

In

a c e s t caz ,

se

seteaza

alta

imagine

l a b e l s [ 1 ] . setEnabled ( false ) ; l a b e l s [ 1 ] . s e t D i s a b l e d I c o n ( new I m a g e I c o n ( " r e s u r s e / no . g i f " ) ) ;

// m o d i f i c a

distanta

intre

imagine

si

text

la

etichetele

si

l a b e l s [ 2 ] . setIconTextGap ( 1 5 ) ; l a b e l s [ 3 ] . setIconTextGap ( 0 ) ;

// s e adauga for ( int

etichetele i < 9;

in

fereastra

i = 0;

i ++) {

f r a m e . add ( l a b e l s [ i ] ) ; }

f r a m e . s e t V i s i b l e ( true ) ;

public s t a t i c JLabel

J L a b e l makeLabel ( i n t v e r t ,

int

horiz , icon ,

int contor ) {

l = new J L a b e l ( " S m i l e " + c o n t o r ,

S w i n g C o n s t a n t s .CENTER) ;

l . setVerticalTextPosition ( vert ) ; l . setHorizontalTextPosition ( horiz ) ; l . setBorder ( BorderFactory . createLineBorder ( Color . blue ) ) ; return l;

B.

Componentele JTextField i JTextPassword

Componentele text au fost mbuntite n pachetul Swing. Dac n pachetul AWT nu era permis crearea unui cmp text n care s se seteze poziionarea scrisului, iat c JTextField face posibil acest lucru (linia de cod 15 i 19).
1 import j a v a x . s w i n g . ; 2 import j a v a . awt . ; 3 4 public c l a s s T e x t F i e l d E x a m p l e {

5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 } } f r a m e . pack ( ) ; f r a m e . s e t V i s i b l e ( true ) ; f r a m e . add ( p ) ; p . add ( l a s t N a m e L a b e l ) ; p . add ( lastNameTF ) ; p . add ( f i r s t N a m e L a b e l ) ; p . add ( firstNameTF ) ; p . add ( p a s s w o r d L a b e l ) ; p . add ( passwordTF ) ; J P a n e l p = new J P a n e l ( ) ; p . s e t L a y o u t ( new G ri dL ay ou t ( 3 , 1) ) ; J P a s s w o r d F i e l d passwordTF = new J P a s s w o r d F i e l d ( ) ; J T e x t F i e l d firstNameTF = new J T e x t F i e l d ( ) ; firstNameTF . s e t F o n t ( new Font ( " i t a l i c " , Font . ITALIC , 13) ) ; J T e x t F i e l d lastNameTF = new J T e x t F i e l d ( 1 5 ) ; lastNameTF . s e t F o n t ( new Font ( " b o l d " , Font . BOLD, 12) ) ; J L a b e l l a s t N a m e L a b e l = new J L a b e l ( " L a s t Name " , S w i n g C o n s t a n t s . LEFT) ; J L a b e l f i r s t N a m e L a b e l = new J L a b e l ( " F i r s t Name " , S w i n g C o n s t a n t s .CENTER) ; J L a b e l p a s s w o r d L a b e l = new J L a b e l ( " Password " , S w i n g C o n s t a n t s . RIGHT) ; public s t a t i c void main ( S t r i n g [ ] args ) {

JFrame f r a m e = new JFrame ( " T e x t F i e l d Example " ) ;

lastNameTF . s e t H o r i z o n t a l A l i g n m e n t ( J T e x t F i e l d . RIGHT) ;

firstNameTF . s e t H o r i z o n t a l A l i g n m e n t ( J T e x t F i e l d .CENTER) ;

C.

Componenta JButton

Exemplul prezentat mai jos aeaz ntr-o fereastr trei butoane. Primul conine doar text, cel de-al doilea conine doar o imagine, iar cel de-al treilea conine i text i o imagine. Toate cele trei butoane au fost create cu ajutorul clasei JButton. Mai mult, numele aprut pe cel de-al treilea buton are subliniat prima liter, iar la combinaia de taste ALT i prima liter butonul este selectat. Acest lucru este posibil datorit metodei setMnemonic() a clasei JButton care primete ca parametru prima liter a numelui de pe buton. Astfel butonul rspunde att la click-urile de mouse ct i la combinaia ALT+prima liter. Observai ce se aeaz atunci cnd plasai mouse-ul deasupra butoanelor. Depistai liniile de cod care realizeaz acest lucru.

1 import j a v a . awt . ; 2 import j a v a x . s w i n g . ; 3 4 public c l a s s ButtonExample { 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 } } f r a m e . s e t V i s i b l e ( true ) ; f r a m e . add ( p a n e l , B o r d e r L a y o u t .NORTH) ; p a n e l . add ( c u t B u t t o n ) ; p a n e l . add ( copyButton ) ; p a n e l . add ( p a s t e B u t t o n ) ; S t r i n g buttonName = " P a s t e " ; String icon = " resurse / paste . g i f " ; JButton c u t B u t t o n = new JButton ( " Cut " ) ; c u t B u t t o n . s e t T o o l T i p T e x t ( " T o o l t i p : buton c u t " ) ; JButton copyButton = new JButton ( new I m a g e I c o n ( " r e s u r s e / copy . g i f " ) ) ; copyButton . s e t T o o l T i p T e x t ( " T o o l t i p : buton copy " ) ; J P a n e l p a n e l = new J P a n e l ( ) ; p a n e l . s e t L a y o u t ( new FlowLayout ( FlowLayout . LEFT) ) ; public s t a t i c void main ( S t r i n g args [ ] ) {

JFrame f r a m e = new JFrame ( " JButton Example " ) ; frame . s e t S i z e ( 3 0 0 , 100) ;

f i n a l char key = buttonName . c h a r A t ( 0 ) ; JButton p a s t e B u t t o n = new JButton ( buttonName , new I m a g e I c o n ( i c o n ) ) ; p a s t e B u t t o n . setMnemonic ( key ) ; p a s t e B u t t o n . s e t T o o l T i p T e x t ( " T o o l t i p : buton p a s t e " ) ;

D.

Componente Meniu

Clasa MenuExample aeaz o fereastr ce conine o bar de meniu cu dou componente meniu. Prima component meniu mai conine, ns, alte obiecte meniu i un submeniu. n acest exemplu, meniul este aat pe vertical datorit metodei setLayout() care este apelat de ctre componenta JMenuBar cu parametrul GridLayout n linia de cod 19. Observai c asemenea componentelor JButton i JLabel, i JMenuItem poate conine imagini. De asemenea, meniul prezint separatori ntre componentele diferite ale unui JMenu (liniile de cod 36, 50 i 58).
1 import j a v a . awt . G ri dL ay ou t ; 2 import j a v a x . s w i n g . ; 3 4 public c l a s s MenuExample { 5

6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36

public s t a t i c void main ( S t r i n g JFrame f r a m e ; JMenuBar menuBar ; JMenu menu , submenu ; JMenuItem menuItem ;

s [])

JRadioButtonMenuItem rbMenuItem ; JCheckBoxMenuItem cbMenuItem ;

f r a m e = new JFrame ( " Menu example " ) ; frame . s e t S i z e ( 2 0 0 , 200) ;

// s e

c r e e a z a b a r a de meniu

menuBar = new JMenuBar ( ) ; menuBar . s e t L a y o u t ( new G ri dL ay ou t ( 2 , 1 ) ) ;

// s e

construieste

p r i m u l meniu

menu = new JMenu ( "Un Meniu " ) ; menuBar . add ( menu ) ;

// un grup de componente JMenuItems menuItem = new JMenuItem ( " Doar t e x t " ) ; menu . add ( menuItem ) ;

menuItem = new JMenuItem ( " S i t e x t s i i m a g i n e " , new I m a g e I c o n ( " r e s u r s e / r o l l i n g . g i f " ) ) ; menu . add ( menuItem ) ;

menuItem = new JMenuItem ( new I m a g e I c o n ( " r e s u r s e / r o l l i n g . g i f " ) ) ; menu . add ( menuItem ) ;

// un grup de componente r a d i o buton menu . a d d S e p a r a t o r ( ) ; considerata // adauga l a sfarsitul g r u p u l u i de componente a n t e r i o a r e o linie orizontala ,

separator

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

ButtonGroup g r o u p = new ButtonGroup ( ) ;

rbMenuItem = new JRadioButtonMenuItem ( " o componenta r a d i o b u t t o n " ) ; rbMenuItem . s e t S e l e c t e d ( true ) ; // b u t o n u l radio s e adauga g r u p u l u i si meniului

g r o u p . add ( rbMenuItem ) ; menu . add ( rbMenuItem ) ;

rbMenuItem = new JRadioButtonMenuItem ( " a l t a componenta r a d i o buton " ) ; g r o u p . add ( rbMenuItem ) ; menu . add ( rbMenuItem ) ;

// un grup de componente c h e c k box menu . a d d S e p a r a t o r ( ) ; cbMenuItem = new JCheckBoxMenuItem ( " o componenta c h e c k box " ) ; menu . add ( cbMenuItem ) ;

cbMenuItem = new JCheckBoxMenuItem ( " a l t a componenta c h e c k box " ) ; menu . add ( cbMenuItem ) ;

// un submeniu menu . a d d S e p a r a t o r ( ) ; submenu = new JMenu ( " Submeniu " ) ;

menuItem = new JMenuItem ( " a l t o b i e c t i n submeniu " ) ; submenu . add ( menuItem ) ;

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 } }

menu . add ( submenu ) ;

// s e

construieste

al

d o i l e a meniu c e

s e adauga i n b a r a de meniu

menu = new JMenu ( " A l t Meniu " ) ; menuItem = new JMenuItem ( " o b i e c t i n A l t Meniu " ) ; menu . add ( menuItem ) ; menuBar . add ( menu ) ;

// s e

ataseaza

ferestrei

b a r a de meniu

f r a m e . setJMenuBar ( menuBar ) ;

f r a m e . pack ( ) ; f r a m e . s e t V i s i b l e ( true ) ;

III.

TEM

1. Realizai cerinele 2 i 3 din Laborator10.pdf. Folosii componente din pachetul javax.swing. Consultai gura din seciunea I A i API-ul.

Laborator Nr. 13:


Evenimente generate de Componente SWING

Intocmit de: Dobrina s Alexandra Indrum ator: Asist. Drd. Danciu Gabriel
January 8, 2012

I.

NOT IUNI TEORETICE

A sa cum este precizat si n Laboratorul 11, un eveniment reprezint a o instant a a unei clase Java, instant a care cont ine o serie de informat ii despre actiunea utilizatorului asupra unei componente grace. Un ,,eveniment poate nt eles, aici, ca un eveniment asincron, independent de evolut ia programului si al c arui moment de producere nu poate prev azut la scrierea codului. Evenimentele cele mai des nt alnite sunt: ap asarea unei taste; actionarea unui buton de mouse ; deplasarea cursorului peste anumite zone; Pentru gestionarea unui eveniment sunt implicat i trei participant i: sursa evenimentului - obiectul a c arui stare se modic a; obiectul eveniment - reprezint a evenimentul n sine; event listener - obiectul ce trebuie anunt at despre modicarea ce se produce;

A.

Aparit ia si tratarea evenimentelor

La fel ca si n AWT, si n SWING sunt folosit i delegat i - handleri pentru prelucrarea informat iei provenit a de la eveniment, precum si ascult atori - listeneri pentru tratarea evenimentelor. Ceea ce se nt ampl a la aparit ia unui eveniment este ilustrat n gura de mai jos:

Se apeleaz a un ascult ator atunci c and utilizatorul interact ioneaz a cu interfat a, ceea ce provoac a un eveniment. De si evenimentele provin de obicei din interfat a utilizator, ele pot avea si alte surse: conexiunea la internet, window manager, timer, etc. In funct ie de ce anume a declan sat aparit ia unui eveniment exist a interfet e care se folosesc pentru prelucrarea sa:

Asocierea dintre component a si handler se face cu ajutorul interfet elor Listener astfel:
Component a JButton JTextField JMenuItem JSlider JCheckBox key on component Interfat a ActionListener ChangeListener ItemListenerr Metode asociate actionPerformed(ActionEvent e)

stateChanged(ChangeEvent e) itemstateChanged() keyPressed() KeyListener keyReleased() keyTyped() mouseClicked() mouse mouseEntered() on MouseListener mouseExited() component mousePressed() mouseReleased() mouse on MouseMotionListener() mouseMoved()) component mouseDragged() JFrame WindowListener() windowClosing(WindowEvent e)

II.

PREZENTAREA LUCRARII DE LABORATOR

Pentru prelucrarea evenimentelor generate de butoane trebuie folosit un handler care s a implementeze interfat a Listener corespunz atoare act iunii ce se monitorizeaz a.

A.

Interfat a ActionListener

Evenimentele care se prelucreaz a cu ajutorul metodelor suprascrise din aceast a interfat a sunt evenimentele care se genereaz a la folosirea butonelor, a meniurilor etc. Pentru prelucrarea acestor evenimente trebuie s a se utilizeze o clas a handler (aici HandlerButoane) ce implementeaz a interfat a ActionListener, si suprascrie metoda actionPerformed(ActionEvent e).
1 2 import import javax . swing . ; javax . swing . border . ;

3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

import import class

j a v a . awt . ; j a v a . awt . e v e n t . ; H a n d l e r B u t o a n e implements ActionListener {

private int n r C l i c k = 0 ; private int i n d i c e C u l o a r e = 0 ; f i n a l p r i v a t e C o l o r c u l o r i [ ] = { C o l o r . LIGHT GRAY , public void actionPerformed ( ActionEvent e) {

C o l o r . RED,

C o l o r .ORANGE,

C o l o r . PINK } ;

JButton // i n

butonApasat = ( JButton ) e . g e t S o u r c e ( ) ; de denumirea evenimentului generat de buton se implementeaza o anumita actiune :

functie

// p e n t r u b u t o n u l c o n t o r i f ( b u t o n A p a s a t . getActionCommand ( ) . e q u a l s ( c o n t o r ) ) { n r C l i c k ++; butonApasat . s e t T e x t ( Apasat : + n r C l i c k ) ; } // p e n t r u b u t o n u l c u l o a r e i f ( b u t o n A p a s a t . getActionCommand ( ) . e q u a l s ( c u l o a r e ) ) { i n d i c e C u l o a r e ++; i f ( i n d i c e C u l o a r e == c u l o r i . l e n g t h ) indiceCuloare = 0; butonApasat . setBackground ( c u l o r i [ i n d i c e C u l o a r e ] ) ; } // p e n t r u b u t o n u l e x i t i f ( b u t o n A p a s a t . getActionCommand ( ) . e q u a l s ( e x i t ) ) { System . e x i t ( 0 ) ; } } }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

public

class

TestButoane

extends JFrame {

p u b l i c s t a t i c void main ( S t r i n g a r g s [ ] ) { T e s t B u t o a n e app = new T e s t B u t o a n e ( ) ; // c r e a r e a p r o p r i u z i s a a b u t o a n e l o r J B u t t o n butonulNumara = new J B u t t o n ( Apasa : 0 ) ; butonulNumara . setActionCommand ( c o n t o r ) ; butonulNumara . s e t A l i g n m e n t X ( Component . CENTER ALIGNMENT) ; J B u t t o n b u t o n u l C u l o r i = new J B u t t o n ( Schimba c u l o a r e a ) ; b u t o n u l C u l o r i . setActionCommand ( c u l o a r e ) ; b u t o n u l C u l o r i . s e t A l i g n m e n t X ( Component . CENTER ALIGNMENT) ; J B u t t o n b u t o n u l E x i t = new J B u t t o n ( E x i t ) ; b u t o n u l E x i t . setActionCommand ( e x i t ) ; b u t o n u l E x i t . s e t A l i g n m e n t X ( Component . CENTER ALIGNMENT) ;

// s e t a r e a de l i s t e n e r i p e n t r u f i e c a r e b u t o n i n p a r t e butonulNumara . a d d A c t i o n L i s t e n e r ( new B u t t o n H a n d l e r ( ) ) ; b u t o n u l C u l o r i . a d d A c t i o n L i s t e n e r ( new B u t t o n H a n d l e r ( ) ) ; b u t o n u l E x i t . a d d A c t i o n L i s t e n e r ( new B u t t o n H a n d l e r ( ) ) ;

// a d a u g a r e a b u t o a n e l o r i n P a n e l J P a n e l panou = new J P a n e l ( ) ; panou . s e t L a y o u t ( new BoxLayout ( panou ,

BoxLayout . Y AXIS ) ) ;

panou . add ( butonulNumara ) ; panou . add ( Box . c r e a t e R i g i d A r e a ( new D i m e n s i o n ( 0 , 1 0 ) ) ) ; panou . add ( b u t o n u l C u l o r i ) ; panou . add ( Box . c r e a t e R i g i d A r e a ( new D i m e n s i o n ( 0 , 1 0 ) ) ) ; panou . add ( b u t o n u l E x i t ) ; panou . s e t B o r d e r ( B o r d e r F a c t o r y . c r e a t e E m p t y B o r d e r ( 2 0 , 2 0 , app . g e t C o n t e n t P a n e ( ) . add ( panou ) ; app . p a c k ( ) ; app . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE ) ; app . show ( ) ; } }

20 ,

20) ) ;

B.

Interfat a KeyListener

Pentru evenimentele generate cu ajutorul tastaturii trebuie s a se utilizeze o clas a handler (aici KeyHandler) ce implementeaz a interfat a KeyListener, si suprascrie metodele keyPressed(), keyReleased(), keyTyped(). Nu este obligatoriu s a se implementeze toate metodele dac a aplicat ia nu necesit a acest lucru.
1 2 3 4 import public j a v a . awt . e v e n t . ; class K e y H a n d l e r implements KeyListener {

5 6 7 8 9 10 11 12 13 14 15 16 17

@Override p u b l i c void k e y P r e s s e d ( KeyEvent k e y E v e n t ) { char i = k e y E v e n t . getKeyChar ( ) ; String s t r = Character . toString ( i ) ; System . o u t . p r i n t l n ( Key pressed : + s t r ) } @Override p u b l i c void k e y R e l e a s e d ( KeyEvent a r g 0 ) {} @Override p u b l i c void keyTyped ( KeyEvent a r g 0 ) {} }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

mport j a v a . awt . ; import j a v a x . s w i n g . ; public class TestKey { args ) { keyEvent

p u b l i c s t a t i c void main ( S t r i n g [ ] JFrame f = new JFrame ( F e r e a s t r a f . s e t L a y o u t ( new FlowLayout ( ) ) ; J L a b e l l a b e l = new J L a b e l ( S c r i e : J T e x t F i e l d t x t F i e l d = new J T e x t F i e l d

) ; (20) ;

K e y H a n d l e r keyH = new K e y h a n d l e r t x t F i e l d . a d d K e y L i s t e n e r ( keyH ) f . add ( l a b e l ) ; f . add ( t x t F i e l d )

( ;

f . pack ( ) ; f . setVisible } }

true

C.

Interfat a MouseListener

Evenimentele generate de mouse, clasa handler trebuie s a implementeze interfat a MouseListener si s a suprascrie metodele: mouseClicked(),mouseEntered(), mouseExited(), mousePressed(), mouseReleased(). la fel ca si la evenimentele pentru taste, dac a nu se cere utilizarea tuturor metodelor, nu este necesar a implemetarea lor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import import j a v a . awt . e v e n t . ; javax . swing . ;

public

class

M y M o u s e L i s t e n e r implements

MouseListener

JLabel labelX , labelY ; public MyKeyListener ( JLabel { this . labelX = x ; this . labelY = y ; }

JLabel

@Override p u b l i c void m o u s e C l i c k e d ( MouseEvent e ) { int x = I n t e g e r . p a r s e I n t ( labelX . getText ( int y = I n t e g e r . p a r s e I n t ( labelY . getText ( System . o u t . p r i n t l n ( x+ + +y+ = +(x+y

) ) )

) ) )

; ; ;

} @Override p u b l i c void m o u s e E n t e r e d ( MouseEvent e ) { // TODO Autog e n e r a t e d method s t u b } @Override p u b l i c void m o u s e E x i t e d ( MouseEvent e ) { // TODO Autog e n e r a t e d method s t u b } @Override p u b l i c void m o u s e P r e s s e d ( MouseEvent e ) { // TODO Autog e n e r a t e d method s t u b } @Override p u b l i c void

m o u s e R e l e a s e d ( MouseEvent e ) {

45 46 47 48 49

// TODO Autog e n e r a t e d } }

method

stub

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

import import

j a v a . awt . ; javax . swing . ; ;

p u b l i c c l a s s TestMouse { p u b l i c s t a t i c void main ( S t r i n g [ Frame f = new Frame ( F e r e a s t r a

] args mouse

) { click

J L a b e l l a b e l Y = new J L a b e l ( 2 ) ; f . add ( l a b e l Y , B o r d e r L a y o u t .NORTH) ; J L a b e l l a b e l X = new J L a b e l ( 1 ) ; f . add ( l a b e l X , B o r d e r L a y o u t .CENTER) ; J B u t t o n b u t t o n = new J B u t t o n ( C l i c k Me ) ; M y M o u s e L i s t e n e r m o u s e L i s t e n e r = new M y M o u s e L i s t e n e r button . addMouseListener ( mouseListener ) ; f . add ( b u t t o n , B o r d e r L a y o u t . SOUTH) ; f f } } . . pack ( ) ; setVisible

labelX

labelY

true

D.

Interfat a WindowListener

Se folose ste pentru evenimentele care au loc la deschiderea, nchiderea unei ferestre sau n momentul n care o fereastra este sau nu activ a. Spre deosebire de celelalte interfet e, pentru aceasta trebuie suprascrise toate metodele:
Metoda Descriere windowActivated(WindowEvent e) se apeleaz a c and fereastra devine activ a windowClosed(WindowEvent e) se apeleaz a la nchiderea ferestrei windowClosing(WindowEvent e) se apeleaz a in momentul n care se ncearc a nchiderea ferestrei windowDeactivated(WindowEvent e) se apeleaz a c and fereastra nu mai este activ a windowDeiconied(WindowEvent e) se apeleaz a c and fereastra i si modic a starea din minimize(din taskbar) n starea normal a (pe ecran) windowIconied(WindowEvent e) se apeleaz a c and fereastra i si modic a starea din starea normal a (de pe ecran) n minimize ( n taskbar) windowOpened(WindowEvent e) se apeleaz a c and fereastra devine vizibil a

In cazul n care se doresc efectuarea unor operat ii pentru anumite evenimente clasa handler poate extinde clasa WindowAdapter si astfel vor putea suprascrise doar metodele dorite.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import import j a v a . awt . ; javax . swing . ;

p u b l i c c l a s s TestWindow { p u b l i c s t a t i c void main ( S t r i n g [ ] JFrame f = new JFrame ( t e s t ) ; f . s e t S i z e (150 , 150) ;

args ) {

f . a d d W i n d o w L i s t e n e r ( new MyWindowListener ( ) ) ; f . s e t V i s i b l e ( true ) ; } }

1 2 3 4 5 6 7 8 9 10 11

import import

j a v a . awt . ; j a v a . awt . e v e n t . ;

public

class

MyWindowListener extends WindowAdapter {

p u b l i c void w i n d o w C l o s i n g ( WindowEvent e v e n t ) { System . o u t . p r i n t l n ( Eveniment pe f e r e s t r e ) ; System . e x i t ( 0 ) ; } }

E.

Tratarea evenimentelor pentru meniuri

Tratarea evenimentelor pentru meniuri n Swing se face n mod similar cu tratarea evenimentelor pentru meniuri din AWT.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 import import import public public j a v a . awt . ; j a v a . awt . e v e n t . A c t i o n L i s t e n e r ; javax . swing . ; class TestMeniuri { s t a t i c void main ( S t r i n g (

args );

) {

JFrame f r a m e = new JFrame frame . setSize (100 ,

Meniu ;

100)

JMenuBar myMenuBar = new JMenuBar ( ) myMenuBar . s e t L a y o u t ( new G r i d L a y o u t f r a m e . setJMenuBar ( myMenuBar ) ;

; (

JMenu myFileMenu = new JMenu ( JMenu myEditMenu = new JMenu ( myMenuBar . add ( myFileMenu ) ; myMenuBar . add ( myEditMenu ) ;

File Edit

) )

; ;

JMenuItem myFileOpenMenuItem = new JMenuItem ( JMenuItem m y F i l e E x i t M e n u I t e m = new JMenuItem ( JMenuItem myEditUndoMenuItem = new JMenuItem (

Open

. ) ;

. ;

Exit Undo )

myFileMenu myFileMenu myFileMenu myEditMenu

. . . .

add ( myFileOpenMenuItem ) addSeparator ( ) ; add ( m y F i l e E x i t M e n u I t e m ) add ( myEditUndoMenuItem )

; ; ;

myFileOpenMenuItem . setActionCommand ( open ) ; m y F i l e E x i t M e n u I t e m . setActionCommand ( e x i t ) ; myEditUndoMenuItem . setActionCommand ( undo ) ;

A c t i o n L i s t e n e r a c t i o n L i s t n e r = new MyMenuListener ( ) ; myFileOpenMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ; myFileExitMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ; myEditUndoMenuItem . a d d A c t i o n L i s t e n e r ( a c t i o n L i s t n e r ) ; frame } } . setVisible ( true ) ;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

import public

java

awt

event

; ActionListener {

class

MyMenuListener implements

@Override p u b l i c void a c t i o n P e r f o r m e d ( A c t i o n E v e n t S t r i n g cmd = e . getActionCommand ( ) ; i f ( cmd . e q u a l s ( open ) ) { System . o u t . p r i n t l n ( open ) ; } else i f ( cmd . e q u a l s ( e x i t ) ) { System . o u t . p r i n t l n ( e x i t ) System . e x i t ( 0 ) ; } else if } } }

) {

( cmd . e q u a l s ( undo ) ) { System . o u t . p r i n t l n ( undo

III.

TEMA

Ad augat i evenimente pentru calculatorul realizat n SWING.