+ All Categories
Home > Documents > Cristian Frasinaru-Curs Practic de Java.pdf

Cristian Frasinaru-Curs Practic de Java.pdf

Date post: 05-Aug-2015
Category:
Upload: bianca-miron
View: 78 times
Download: 9 times
Share this document with a friend
462
Curs practic de Java Cristian Fr˘ asinaru
Transcript
Page 1: Cristian Frasinaru-Curs Practic de Java.pdf

Curs practic de Java

Cristian Frasinaru

Page 2: Cristian Frasinaru-Curs Practic de Java.pdf

Cuprins

1 Introducere ın Java 111.1 Ce este J av a ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

1.1.1 L im b ajul d e p rog ram are J av a . . . . . . . . . . . . . . 111.1.2 P latform e d e lucru J av a . . . . . . . . . . . . . . . . . 121.1.3 J av a: un lim b aj com p ilat si interp re tat . . . . . . . . . 13

1.2 P rim ul p rog ram . . . . . . . . . . . . . . . . . . . . . . . . . . 141.3 S tructura le x icala a lim b ajului J av a . . . . . . . . . . . . . . . 16

1.3.1 S e tul d e caractere . . . . . . . . . . . . . . . . . . . . . 161.3.2 Cuv inte ch e ie . . . . . . . . . . . . . . . . . . . . . . . 161.3.3 Id entificatori . . . . . . . . . . . . . . . . . . . . . . . . 171.3.4 L ite rali . . . . . . . . . . . . . . . . . . . . . . . . . . . 171.3.5 S e p aratori . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.6 Op eratori . . . . . . . . . . . . . . . . . . . . . . . . . 191.3.7 Com entarii . . . . . . . . . . . . . . . . . . . . . . . . 20

1.4 T ip uri d e d ate si v ariab ile . . . . . . . . . . . . . . . . . . . . 211.4.1 T ip uri d e d ate . . . . . . . . . . . . . . . . . . . . . . . 211.4.2 V ariab ile . . . . . . . . . . . . . . . . . . . . . . . . . . 22

1.5 Controlul e x e cutie i . . . . . . . . . . . . . . . . . . . . . . . . 241.5.1 Instruc tiuni d e d e c iz ie . . . . . . . . . . . . . . . . . . 241.5.2 Instruc tiuni d e salt . . . . . . . . . . . . . . . . . . . . 251.5.3 Instruc tiuni p entru tratarea e x c e p tiilor . . . . . . . . . 261.5.4 A lte instruc tiuni . . . . . . . . . . . . . . . . . . . . . 26

1.6 V e c tori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261.6.1 Crearea unui v e c tor . . . . . . . . . . . . . . . . . . . . 261.6.2 T ab louri m ultid im ensionale . . . . . . . . . . . . . . . 281.6.3 D im ensiunea unui v e c tor . . . . . . . . . . . . . . . . . 281.6.4 Cop ie rea v e c torilor . . . . . . . . . . . . . . . . . . . . 29

1

Page 3: Cristian Frasinaru-Curs Practic de Java.pdf

2 CUPRINS

1.6.5 S ortarea v e c torilor - c lasa Arrays . . . . . . . . . . . . 291.6.6 V e c tori cu d im ensiune v ariab ila si e te rog eni . . . . . . 30

1.7 S iruri d e caractere . . . . . . . . . . . . . . . . . . . . . . . . 301.8 Folosirea arg um ente lor d e la linia d e com and a . . . . . . . . . 31

1.8.1 T ransm ite rea arg um ente lor . . . . . . . . . . . . . . . . 311.8.2 P rim irea arg um ente lor . . . . . . . . . . . . . . . . . . 321.8.3 A rg um ente num eric e . . . . . . . . . . . . . . . . . . . 34

2 O b iecte si clase 3 52.1 Cic lul d e v iata al unui ob ie c t . . . . . . . . . . . . . . . . . . . 35

2.1.1 Crearea ob ie c te lor . . . . . . . . . . . . . . . . . . . . . 352.1.2 Folosirea ob ie c te lor . . . . . . . . . . . . . . . . . . . . 372.1.3 D istrug erea ob ie c te lor . . . . . . . . . . . . . . . . . . 38

2.2 Crearea c lase lor . . . . . . . . . . . . . . . . . . . . . . . . . . 392.2.1 D e c lararea c lase lor . . . . . . . . . . . . . . . . . . . . 392.2.2 E x tind erea c lase lor . . . . . . . . . . . . . . . . . . . . 402.2.3 Corp ul une i c lase . . . . . . . . . . . . . . . . . . . . . 412.2.4 Constructorii une i c lase . . . . . . . . . . . . . . . . . . 422.2.5 D e c lararea v ariab ile lor . . . . . . . . . . . . . . . . . . 462.2.6 th is si sup er . . . . . . . . . . . . . . . . . . . . . . . . 49

2.3 Im p le m entarea m etod e lor . . . . . . . . . . . . . . . . . . . . 502.3.1 D e c lararea m e tod e lor . . . . . . . . . . . . . . . . . . . 502.3.2 T ip ul returnat d e o m etod a . . . . . . . . . . . . . . . 522.3.3 T rim ite rea p aram etrilor c atre o m etod a . . . . . . . . . 532.3.4 M etod e cu num ar v ariab il d e arg um ente . . . . . . . . 562.3.5 S up raınc arcarea si sup rad efinirea m etod e lor . . . . . . 57

2.4 M od ificatori d e ac c e s . . . . . . . . . . . . . . . . . . . . . . . 582.5 M e m b ri d e instanta si m e m b ri d e c lasa . . . . . . . . . . . . . 59

2.5.1 V ariab ile d e instanta si d e c lasa . . . . . . . . . . . . . 592.5.2 M etod e d e instanta si d e c lasa . . . . . . . . . . . . . . 612.5.3 U tilitatea m e m b rilor d e c lasa . . . . . . . . . . . . . . 622.5.4 B locuri static e d e initializare . . . . . . . . . . . . . . . 63

2.6 Clase im b ricate . . . . . . . . . . . . . . . . . . . . . . . . . . 642.6.1 D efinirea c lase lor im b ricate . . . . . . . . . . . . . . . . 642.6.2 Clase interne . . . . . . . . . . . . . . . . . . . . . . . 662.6.3 Id entificare c lase lor im b ricate . . . . . . . . . . . . . . 662.6.4 Clase anonim e . . . . . . . . . . . . . . . . . . . . . . . 67

2.7 Clase si m e tod e ab stracte . . . . . . . . . . . . . . . . . . . . 67

Page 4: Cristian Frasinaru-Curs Practic de Java.pdf

CUPRINS 3

2.7.1 D e c lararea une i c lase ab stracte . . . . . . . . . . . . . 682.7.2 M etod e ab stracte . . . . . . . . . . . . . . . . . . . . . 68

2.8 Clasa Ob je c t . . . . . . . . . . . . . . . . . . . . . . . . . . . 712.8.1 Oric e c lasa are o sup erc lasa . . . . . . . . . . . . . . . 712.8.2 Clasa Ob je c t . . . . . . . . . . . . . . . . . . . . . . . 71

2.9 Conv ersii autom ate ıntre tip uri . . . . . . . . . . . . . . . . . 742.10 T ip ul d e d ate enum erare . . . . . . . . . . . . . . . . . . . . . 75

3 E x ceptii 7 73.1 Ce sunt e x c e p tiile ? . . . . . . . . . . . . . . . . . . . . . . . . 773.2 ” P rind erea” si tratarea e x c e p tiilor . . . . . . . . . . . . . . . . 783.3 ” A runcarea” e x c e p tiilor . . . . . . . . . . . . . . . . . . . . . . 823.4 A v antaje le tratarii e x c e p tiilor . . . . . . . . . . . . . . . . . . 85

3.4.1 S e p ararea cod ului p entru tratarea erorilor . . . . . . . 853.4.2 P rop ag area erorilor . . . . . . . . . . . . . . . . . . . . 873.4.3 G rup area erorilor d up a tip ul lor . . . . . . . . . . . . . 89

3.5 Ie rarh ia c lase lor c e d e sc riu e x c e p tii . . . . . . . . . . . . . . . 903.6 E x c e p tii la e x e cutie . . . . . . . . . . . . . . . . . . . . . . . . 913.7 Crearea p rop riilor e x c e p tii . . . . . . . . . . . . . . . . . . . . 92

4 Intrari si iesiri 9 54.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

4.1.1 Ce sunt fl ux urile? . . . . . . . . . . . . . . . . . . . . . 954.1.2 Clasificarea fl ux urilor . . . . . . . . . . . . . . . . . . . 964.1.3 Ierarh ia c lase lor p entru lucrul cu fl ux uri . . . . . . . . 974.1.4 M etod e com une fl ux urilor . . . . . . . . . . . . . . . . 98

4.2 Folosirea fl ux urilor . . . . . . . . . . . . . . . . . . . . . . . . 994.2.1 Flux uri p rim itiv e . . . . . . . . . . . . . . . . . . . . . 994.2.2 Flux uri d e p roc esare . . . . . . . . . . . . . . . . . . . 1004.2.3 Crearea unui fl ux . . . . . . . . . . . . . . . . . . . . . 1014.2.4 Flux uri p entru lucrul cu fisie re . . . . . . . . . . . . . . 1034.2.5 Citirea si sc rie rea cu b uff er . . . . . . . . . . . . . . . . 1054.2.6 Concatenarea fl ux urilor . . . . . . . . . . . . . . . . . . 1074.2.7 Flux uri p entru filtrarea d ate lor . . . . . . . . . . . . . 1084.2.8 Clase le DataInputStream si DataOutputStream . . . . 109

4.3 Intrari si ie siri form atate . . . . . . . . . . . . . . . . . . . . . 1104.3.1 Intrari form atate . . . . . . . . . . . . . . . . . . . . . 1104.3.2 Ie siri form atate . . . . . . . . . . . . . . . . . . . . . . 111

Page 5: Cristian Frasinaru-Curs Practic de Java.pdf

4 CUPRINS

4.4 Flux uri stand ard d e intrare si ie sire . . . . . . . . . . . . . . . 1114.4.1 A fisarea inform atiilor p e e c ran . . . . . . . . . . . . . . 1124.4.2 Citirea d ate lor d e la tastatura . . . . . . . . . . . . . . 1124.4.3 R e d ire c tarea fl ux urilor stand ard . . . . . . . . . . . . . 1134.4.4 A naliza le x icala p e fl ux uri (c lasa StreamTokenizer) . . 115

4.5 Clasa RandomAccesFile (fisie re cu ac c es d ire c t) . . . . . . . . 1174.6 Clasa File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

5 Interfete 12 15.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

5.1.1 Ce este o interfata ? . . . . . . . . . . . . . . . . . . . 1215.2 Folosirea interfe te lor . . . . . . . . . . . . . . . . . . . . . . . 122

5.2.1 D efinirea une i interfe te . . . . . . . . . . . . . . . . . . 1225.2.2 Im p le m entarea une i interfe te . . . . . . . . . . . . . . . 1235.2.3 E x e m p lu: im p le m entarea une i stiv e . . . . . . . . . . . 124

5.3 Interfe te si c lase ab stracte . . . . . . . . . . . . . . . . . . . . 1295.4 M ostenire m ultip la p rin interfe te . . . . . . . . . . . . . . . . 1305.5 U tilitatea interfe te lor . . . . . . . . . . . . . . . . . . . . . . . 132

5.5.1 Crearea g rup urilor d e constante . . . . . . . . . . . . . 1325.5.2 T ransm ite rea m e tod e lor ca p aram etri . . . . . . . . . . 133

5.6 Interfata FilenameFilter . . . . . . . . . . . . . . . . . . . . 1345.6.1 Folosirea c lase lor anonim e . . . . . . . . . . . . . . . . 137

5.7 Com p ararea ob ie c te lor . . . . . . . . . . . . . . . . . . . . . . 1385.7.1 Interfata Comparable . . . . . . . . . . . . . . . . . . . 1395.7.2 Interfata Comparator . . . . . . . . . . . . . . . . . . . 141

5.8 A d ap tori . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

6 O rg anizarea claselor 14 56.1 P ach e te . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

6.1.1 P ach e te le stand ard (J 2S D K ) . . . . . . . . . . . . . . . 1456.1.2 Folosirea m e m b rilor unui p ach e t . . . . . . . . . . . . . 1466.1.3 Im p ortul une i c lase sau interfe te . . . . . . . . . . . . . 1476.1.4 Im p ortul la c e re re d intr-un p ach e t . . . . . . . . . . . . 1486.1.5 Im p ortul static . . . . . . . . . . . . . . . . . . . . . . 1496.1.6 Crearea unui p ach e t . . . . . . . . . . . . . . . . . . . 1506.1.7 D enum irea unui p ach e t . . . . . . . . . . . . . . . . . . 151

6.2 Org anizarea fisie re lor . . . . . . . . . . . . . . . . . . . . . . . 1526.2.1 Org anizarea fisie re lor sursa . . . . . . . . . . . . . . . . 152

Page 6: Cristian Frasinaru-Curs Practic de Java.pdf

CUPRINS 5

6.2.2 Org anizarea unitatilor d e com p ilare (.class) . . . . . 1546.2.3 N e c e sitatea org aniz arii fisie re lor . . . . . . . . . . . . . 1556.2.4 S e tarea c aii d e c autare (CL A S S P A T H ) . . . . . . . . . 156

6.3 A rh iv e J A R . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1576.3.1 Folosirea utilitarului jar . . . . . . . . . . . . . . . . . 1586.3.2 E x e cutarea ap licatiilor arh iv ate . . . . . . . . . . . . . 159

7 Colectii 16 17.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1617.2 Interfe te c e d e sc riu cole c tii . . . . . . . . . . . . . . . . . . . . 1627.3 Im p le m entari ale cole c tiilor . . . . . . . . . . . . . . . . . . . . 1667.4 Folosirea efic ienta a cole c tiilor . . . . . . . . . . . . . . . . . . 1687.5 A lg oritm i p olim orfic i . . . . . . . . . . . . . . . . . . . . . . . 1707.6 T ip uri g eneric e . . . . . . . . . . . . . . . . . . . . . . . . . . 1717.7 Iteratori si enum erari . . . . . . . . . . . . . . . . . . . . . . . 172

8 S erializarea ob iectelor 17 78.1 Folosirea serializ arii . . . . . . . . . . . . . . . . . . . . . . . . 177

8.1.1 S e rializarea tip urilor p rim itiv e . . . . . . . . . . . . . . 1798.1.2 S e rializarea ob ie c te lor . . . . . . . . . . . . . . . . . . . 1808.1.3 Clasa Ob je c tOutp utS tream . . . . . . . . . . . . . . . 1808.1.4 Clasa Ob je c tInp utS tream . . . . . . . . . . . . . . . . 181

8.2 Ob ie c te se rializab ile . . . . . . . . . . . . . . . . . . . . . . . . 1838.2.1 Im p le m entarea interfe te i S e rializab le . . . . . . . . . . 1838.2.2 Controlul serializ arii . . . . . . . . . . . . . . . . . . . 184

8.3 P ersonalizarea serializ arii ob ie c te lor . . . . . . . . . . . . . . . 1878.3.1 Controlul v e rsiunilor c lase lor . . . . . . . . . . . . . . . 1888.3.2 S e curizarea d ate lor . . . . . . . . . . . . . . . . . . . . 1938.3.3 Im p le m entarea interfe te i E x te rnalizab le . . . . . . . . . 194

8.4 Clonarea ob ie c te lor . . . . . . . . . . . . . . . . . . . . . . . . 196

9 Interfata g rafi ca cu utilizatorul 19 99.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1999.2 M od e lul A W T . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

9.2.1 Com p onente le A W T . . . . . . . . . . . . . . . . . . . 2029.2.2 S up rafe te d e afisare (Clasa Container) . . . . . . . . . 204

9.3 G estionarea p oz itionarii . . . . . . . . . . . . . . . . . . . . . 2069.3.1 Folosirea g estionarilor d e p oz itionare . . . . . . . . . . 207

Page 7: Cristian Frasinaru-Curs Practic de Java.pdf

6 CUPRINS

9.3.2 G estionarul Flow L ay out . . . . . . . . . . . . . . . . . 2099.3.3 G estionarul B ord e rL ay out . . . . . . . . . . . . . . . . 2109.3.4 G estionarul G rid L ay out . . . . . . . . . . . . . . . . . 2119.3.5 G estionarul Card L ay out . . . . . . . . . . . . . . . . . 2129.3.6 G estionarul G rid B ag L ay out . . . . . . . . . . . . . . . 2149.3.7 G rup area com p onente lor (Clasa P anel) . . . . . . . . . 218

9.4 T ratarea e v enim ente lor . . . . . . . . . . . . . . . . . . . . . . 2199.4.1 E x e m p lu d e tratare a e v enim ente lor . . . . . . . . . . . 2219.4.2 T ip uri d e e v enim ente . . . . . . . . . . . . . . . . . . . 2249.4.3 Folosirea ad ap torilor si a c lase lor anonim e . . . . . . . 227

9.5 Folosirea ferestre lor . . . . . . . . . . . . . . . . . . . . . . . . 2329.5.1 Clasa W ind ow . . . . . . . . . . . . . . . . . . . . . . . 2329.5.2 Clasa Fram e . . . . . . . . . . . . . . . . . . . . . . . . 2339.5.3 Clasa D ialog . . . . . . . . . . . . . . . . . . . . . . . . 2369.5.4 Clasa File D ialog . . . . . . . . . . . . . . . . . . . . . 239

9.6 Folosirea m eniurilor . . . . . . . . . . . . . . . . . . . . . . . . 2429.6.1 Ierarh ia c lase lor c e d e sc riu m eniuri . . . . . . . . . . . 2439.6.2 T ratarea e v enim ente lor g enerate d e m eniuri . . . . . . 2469.6.3 M eniuri d e conte x t (p op up ) . . . . . . . . . . . . . . . 2479.6.4 A c c e le ratori (Clasa M enuS h ortcut) . . . . . . . . . . . 250

9.7 Folosirea com p onente lor A W T . . . . . . . . . . . . . . . . . . 2509.7.1 Clasa L ab e l . . . . . . . . . . . . . . . . . . . . . . . . 2519.7.2 Clasa B utton . . . . . . . . . . . . . . . . . . . . . . . 2529.7.3 Clasa Ch e ck b ox . . . . . . . . . . . . . . . . . . . . . . 2539.7.4 Clasa Ch e ck b ox G roup . . . . . . . . . . . . . . . . . . 2559.7.5 Clasa Ch oic e . . . . . . . . . . . . . . . . . . . . . . . 2579.7.6 Clasa L ist . . . . . . . . . . . . . . . . . . . . . . . . . 2599.7.7 Clasa S crollB ar . . . . . . . . . . . . . . . . . . . . . . 2619.7.8 Clasa S crollP ane . . . . . . . . . . . . . . . . . . . . . 2629.7.9 Clasa T e x tFie ld . . . . . . . . . . . . . . . . . . . . . . 2639.7.10 Clasa T e x tA rea . . . . . . . . . . . . . . . . . . . . . . 265

10 D esenarea 2 6 910.1 Conce p tul d e d e senare . . . . . . . . . . . . . . . . . . . . . . 269

10.1.1 M etod a p aint . . . . . . . . . . . . . . . . . . . . . . . 27010.1.2 S up rafe te d e d e senare - c lasa Canvas . . . . . . . . . . 271

10.2 Conte x tul g rafic d e d e senare . . . . . . . . . . . . . . . . . . . 27410.2.1 P rop rie tatile conte x tului g rafic . . . . . . . . . . . . . . 275

Page 8: Cristian Frasinaru-Curs Practic de Java.pdf

CUPRINS 7

10.2.2 P rim itiv e g rafice . . . . . . . . . . . . . . . . . . . . . 275

10.3 Folosirea fonturilor . . . . . . . . . . . . . . . . . . . . . . . . 276

10.3.1 Clasa Font . . . . . . . . . . . . . . . . . . . . . . . . . 277

10.3.2 Clasa FontM etric s . . . . . . . . . . . . . . . . . . . . . 279

10.4 Folosirea culorilor . . . . . . . . . . . . . . . . . . . . . . . . . 282

10.5 Folosirea im ag inilor . . . . . . . . . . . . . . . . . . . . . . . . 286

10.5.1 A fisarea im ag inilor . . . . . . . . . . . . . . . . . . . . 287

10.5.2 M onitorizarea ınc arc arii im ag inilor . . . . . . . . . . . 289

10.5.3 M e canism ul d e ” d oub le -b uff ering ” . . . . . . . . . . . . 291

10.5.4 S alv area d esene lor ın form at J P E G . . . . . . . . . . . 291

10.5.5 Crearea im ag inilor ın m e m orie . . . . . . . . . . . . . 292

10.6 T ip arirea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

11 S w ing 2 9 9

11.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

11.1.1 J FC . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

11.1.2 S w ing A P I . . . . . . . . . . . . . . . . . . . . . . . . . 300

11.1.3 A se m anari si d eose b iri cu A W T . . . . . . . . . . . . . 301

11.2 Folosirea ferestre lor . . . . . . . . . . . . . . . . . . . . . . . . 304

11.2.1 Ferestre interne . . . . . . . . . . . . . . . . . . . . . . 305

11.3 Clasa J Com p onent . . . . . . . . . . . . . . . . . . . . . . . . 307

11.4 A rh ite c tura m od e lului S w ing . . . . . . . . . . . . . . . . . . . 310

11.5 Folosirea m od e le lor . . . . . . . . . . . . . . . . . . . . . . . . 310

11.5.1 T ratarea e v enim ente lor . . . . . . . . . . . . . . . . . . 314

11.6 Folosirea com p onente lor . . . . . . . . . . . . . . . . . . . . . 316

11.6.1 Com p onente atom ic e . . . . . . . . . . . . . . . . . . . 316

11.6.2 Com p onente p entru e d itare d e te x t . . . . . . . . . . . 316

11.6.3 Com p onente p entru se le c tarea unor e le m ente . . . . . . 319

11.6.4 T ab e le . . . . . . . . . . . . . . . . . . . . . . . . . . . 324

11.6.5 A rb ori . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

11.6.6 Containere . . . . . . . . . . . . . . . . . . . . . . . . . 332

11.6.7 D ialog uri . . . . . . . . . . . . . . . . . . . . . . . . . 335

11.7 D esenarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

11.7.1 M etod e sp e c ific e . . . . . . . . . . . . . . . . . . . . . 336

11.7.2 Consid e ratii g enerale . . . . . . . . . . . . . . . . . . . 338

11.8 L ook and Fee l . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

Page 9: Cristian Frasinaru-Curs Practic de Java.pdf

8 CUPRINS

12 F ire de ex ecutie 3 4 312.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34312.2 Crearea unui fir d e e x e cutie . . . . . . . . . . . . . . . . . . . 344

12.2.1 E x tind erea c lase i T h read . . . . . . . . . . . . . . . . . 34512.2.2 Im p le m entarea interfe te i R unnab le . . . . . . . . . . . 347

12.3 Cic lul d e v iata al unui fir d e e x e cutie . . . . . . . . . . . . . . 35212.3.1 T erm inarea unui fir d e e x e cutie . . . . . . . . . . . . . 35512.3.2 Fire d e e x e cutie d e tip ” d ae m on” . . . . . . . . . . . . 35712.3.3 S tab ilirea p rioritatilor d e e x e cutie . . . . . . . . . . . . 35812.3.4 S incronizarea fire lor d e e x e cutie . . . . . . . . . . . . . 36212.3.5 S c enariul p rod uc ator / consum ator . . . . . . . . . . . 36212.3.6 M onitoare . . . . . . . . . . . . . . . . . . . . . . . . . 36712.3.7 S e m afoare . . . . . . . . . . . . . . . . . . . . . . . . . 36912.3.8 P rob le m e le g ate d e sincronizare . . . . . . . . . . . . . 371

12.4 G rup area fire lor d e e x e cutie . . . . . . . . . . . . . . . . . . . 37312.5 Com unicarea p rin fl ux uri d e tip ” p ip e ” . . . . . . . . . . . . . 37612.6 Clase le T im e r si T im e rT ask . . . . . . . . . . . . . . . . . . . 378

13 P rog ram are ın retea 3 8 313.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38313.2 L ucrul cu U R L -uri . . . . . . . . . . . . . . . . . . . . . . . . 38513.3 S ock e t-uri . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38713.4 Com unicarea p rin conex iuni . . . . . . . . . . . . . . . . . . . 38813.5 Com unicarea p rin d atag ram e . . . . . . . . . . . . . . . . . . . 39313.6 T rim ite rea d e m e saje c atre m ai m ulti c lienti . . . . . . . . . . 397

14 A ppleturi 4 0 114.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40114.2 Crearea unui ap p le t sim p lu . . . . . . . . . . . . . . . . . . . . 40214.3 Cic lul d e v iata al unui ap p le t . . . . . . . . . . . . . . . . . . 40414.4 Interfata g rafic a cu utilizatorul . . . . . . . . . . . . . . . . . . 40614.5 D efinirea si folosirea p aram etrilor . . . . . . . . . . . . . . . . 40814.6 T ag -ul A P P L E T . . . . . . . . . . . . . . . . . . . . . . . . . 41014.7 Folosirea fire lor d e e x e cutie ın ap p le turi . . . . . . . . . . . . . 41214.8 A lte m e tod e oferite d e c lasa A p p le t . . . . . . . . . . . . . . . 41614.9 A rh iv area ap p le turilor . . . . . . . . . . . . . . . . . . . . . . 42014.10R estric tii d e se curitate . . . . . . . . . . . . . . . . . . . . . . 42114.11A p p le turi care sunt si ap licatii . . . . . . . . . . . . . . . . . . 421

Page 10: Cristian Frasinaru-Curs Practic de Java.pdf

CUPRINS 9

15 L ucrul cu b aze de date 4 2 315.1 Introd uc ere . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

15.1.1 G eneralitati d e sp re b az e d e d ate . . . . . . . . . . . . . 42315.1.2 J D B C . . . . . . . . . . . . . . . . . . . . . . . . . . . 424

15.2 Conectarea la o b az a d e d ate . . . . . . . . . . . . . . . . . . . 42515.2.1 Inre g istrarea unui d riv e r . . . . . . . . . . . . . . . . . 42615.2.2 S p e c ificarea une i b az e d e d ate . . . . . . . . . . . . . . 42715.2.3 T ip uri d e d riv e re . . . . . . . . . . . . . . . . . . . . . 42815.2.4 R ealizarea une i conex iuni . . . . . . . . . . . . . . . . 430

15.3 E fe c tuarea d e se c v ente S Q L . . . . . . . . . . . . . . . . . . . 43115.3.1 Interfata S tate m ent . . . . . . . . . . . . . . . . . . . . 43215.3.2 Interfata P re p are d S tate m ent . . . . . . . . . . . . . . . 43415.3.3 Interfata Callab le S tate m ent . . . . . . . . . . . . . . . 43715.3.4 Ob tinerea si p re lucrarea re zultate lor . . . . . . . . . . 43815.3.5 Interfata R esultS e t . . . . . . . . . . . . . . . . . . . . 43815.3.6 E x e m p lu sim p lu . . . . . . . . . . . . . . . . . . . . . . 440

15.4 L ucrul cu m eta-d ate . . . . . . . . . . . . . . . . . . . . . . . 44215.4.1 Interfata D atab ase M e taD ata . . . . . . . . . . . . . . . 44215.4.2 Interfata R esultS e tM e taD ata . . . . . . . . . . . . . . 443

16 L ucrul dinam ic cu clase 4 4 516.1 Inc arcarea c lase lor ın m e m orie . . . . . . . . . . . . . . . . . . 44516.2 M e canism ul re fl e c tarii . . . . . . . . . . . . . . . . . . . . . . 452

16.2.1 E x am inarea c lase lor si interfe te lor . . . . . . . . . . . . 45316.2.2 M anip ularea ob ie c te lor . . . . . . . . . . . . . . . . . . 45616.2.3 L ucrul d inam ic cu v e c tori . . . . . . . . . . . . . . . . 460

Page 11: Cristian Frasinaru-Curs Practic de Java.pdf

10 CUPRINS

Page 12: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 1

Introducere ın Java

1.1 Ce este Java ?

J av a este o te h nolog ie inov atoare lansata d e com p ania S un M ic rosy ste m s ın1995, care a av ut un im p act re m arcab il asup ra ıntre g ii com unitati a d e z -v oltatorilor d e softw are , im p unand u-se p rin calitati d eose b ite cum ar fi sim -p litate , rob uste te si nu ın ultim ul rand p ortab ilitate . D enum ita initial OAK,te h nolog ia J av a este form ata d intr-un lim b aj d e p rog ram are d e niv e l ınalt p eb aza c aruia sunt construite o serie d e p latform e d e stinate im p le m entarii d eap licatii p entru toate se g m ente le ind ustrie i softw are .

1.1.1 L im b ajul de prog ram are Java

Inainte d e a p re z enta ın d etaliu asp e c te le te h nic e ale lim b ajului J av a, sa am -intim caracteristic ile sale p rinc ip ale , care l-au transform at ıntr-un interv al d etim p atat d e scurt ıntr-una d in c e le m ai p up ulare op tiuni p entru d e z v oltaread e ap licatii, ind ife rent d e d om eniu sau d e com p le x itatea lor.

• S im plitate - e lim ina sup raınc arcarea op eratorilor, m ostenirea m ultip lasi toate ” fac ilitatile ” c e p ot p rov oca scrie rea unui cod confuz .

• U surinta ın c rearea d e ap licatii com p le x e c e folosesc p rog ram area ınre tea, fire d e e x e cutie , interfata g rafic a, b az e d e d ate , e tc .

• R ob ustete - e lim ina surse le fre c v ente d e e rori c e ap ar ın p rog ram arep rin renuntarea la p ointeri, ad m inistrarea autom ata a m e m orie i si e lim -

11

Page 13: Cristian Frasinaru-Curs Practic de Java.pdf

12 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

inarea p ie rd e rilor d e m e m orie p rintr-o p roc e d ura d e cole c tare a ob ie c te lorcare nu m ai sunt re fe rite , c e ruleaz a ın fund al (” g arb ag e colle c tor” ).

• Com plet orientat pe ob iecte - e lim ina com p le t stilul d e p rog ram arep roc e d ural.

• S ecuritate - e ste un lim b aj d e p rog ram are foarte sig ur, furniz andm e canism e stric te d e se curitate a p rog ram e lor concretizate p rin: v e r-ificarea d inam ic a a cod ului p entru d ete c tarea se c v ente lor p e riculoase ,im p unerea unor re g uli stric te p entru rularea p roc ese lor la d istanta, e tc .

• N eutralitate arh itecturala - com p ortam entul une i ap licatii J av a nud e p ind e d e arh ite c tura fiz ic a a m asinii p e care ruleaz a.

• P ortab ililtate - J av a este un lim b aj ind e p end ent d e p latform a d e lu-cru, ac e easi ap licatie ruland fara nic i o m od ificare si fara a ne c esita re -com p ilarea e i p e siste m e d e op e rare d ife rite cum ar fi W ind ow s, L inux ,M ac OS , S olaris, e tc . lucru care ad uc e e conom ii sub stantiale firm e lord e z v oltatoare d e ap licatii.

• E ste com pilat si interpretat, ac easta fiind solutia efic ienta p entruob tinerea p ortab ilitatii.

• P erform anta - d e si m ai lent d e c at lim b aje le d e p rog ram are care g enereaz ae x e cutab ile nativ e p entru o anum ita p latform a d e lucru, com p ilatorulJ av a asig ura o p e rform anta rid icata a cod ului d e octe ti, astfe l ınc atv ite za d e lucru p utin m ai sc azuta nu v a fi un im p e d im ent ın d e z v oltaread e ap licatii oric at d e com p le x e , inc lusiv g rafic a 3D , anim atie , e tc .

• E ste m odelat dupa C si C++, tre c e rea d e la C, C+ + la J av afac and u-se foarte usor.

1.1.2 P latform e de lucru Java

L im b ajul d e p rog ram are J av a a fost folosit la d e z v oltarea unor te h nolog ii d e d -icate re zolv arii unor p rob le m e d in c e le m ai d iv e rse d om enii. A c e ste te h nolog iiau fost g rup ate ın asa num ite le p la tfo rm e d e lu cru , c e re p re z inta se turi d elib rarii sc rise ın lim b ajul J av a, p re cum si d iv e rse p rog ram e utilitare , folositep entru d e z v oltarea d e ap licatii sau com p onente d e stinate une i anum e cate -g orii d e utilizatori.

Page 14: Cristian Frasinaru-Curs Practic de Java.pdf

1 .1 . CE E ST E J AV A ? 13

• J2 S E (S tand ard E d ition)E ste p latform a stand ard d e lucru c e ofe ra sup ort p entru crearea d eap licatii ind e p end ente si ap p le turi.

D e ase m enea, aic i e ste inc lusa si te h nolog ia Java W eb S tart c e furniz eaz ao m od alitate e x tre m d e fac ila p entru lansarea si instalarea locala a p ro-g ram e lor scrise ın J av a d ire c t d e p e W e b , ofe rind c ea m ai com od a solutiep entru d istrib utia si actualizarea ap licatiilor J av a.

• J2 M E (M ic ro E d ition)Folosind J av a, p rog ram area d isp oz itiv e lor m ob ile e ste e x tre m d e sim p la,p latform a d e lucru J 2M E oferind sup ortul ne c e sar scrie rii d e p rog ram ed e d icate ac estui scop .

• J2 E E (E nterp rise E d ition)A c easta p latform a ofe ra A P I-ul ne c esar d e z v oltarii d e ap licatii com -p le x e , form ate d in com p onente c e tre b uie sa rule z e ın siste m e e te rog ene ,cu inform atiile m e m orate ın b az e d e d ate d istrib uite , e tc .

T ot aic i g asim si sup ortul ne c esar p entru crearea d e aplicatii si serviciiW eb , b azate p e com p onente cum ar fi serv le turi, p ag ini J S P , e tc .

T oate d istrib utiile J av a sunt oferite g ratuit si p ot fi d esc arcate d e p eInternet d e la ad resa ” h ttp :/ / jav a.sun.com ” .

In continuare , v om folosi te rm enul J 2S D K p entru a ne re fe ri la d istrib utiastand ard J 2S E 1.5 S D K (T ig e r).

1.1.3 Java: un lim b aj com pilat si interpretat

In func tie d e m od ul d e e x e cutie a ap licatiilor, lim b aje le d e p rog ram are seım p art ın d oua cate g orii:

• Interpretate: instruc tiunile sunt c itite linie cu linie d e un p rog ramnum it in terp reto r si trad use ın instruc tiuni m asina. A v antajul ac es-te i solutii e ste sim p litatea si fap tul c a fiind interp re tata d ire c t sursap rog ram ului ob tine m p ortab ilitatea. D e zav antajul e v id ent este v ite zad e e x e cutie re d usa. P rob ab il c e l m ai cunoscute lim b aj interp re tat estelim b ajul B asic .

• Com pilate: cod ul sursa al p rog ram e lor este transform at d e co m p i-la to r ıntr-un cod c e p oate fi e x e cutat d ire c t d e p roc esor, num it cod

Page 15: Cristian Frasinaru-Curs Practic de Java.pdf

14 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

m a sin a . A v antajul este e x e cutia e x tre m d e rap id a, d e zav antajul fiindlip sa p ortab ilitatii, cod ul com p ilat ıntr-un form at d e niv e l sc azut nup oate fi rulat d e c at p e p latform a d e lucru p e care a fost com p ilat.

L im b ajul J av a com b ina solutiile am intite m ai sus, p rog ram e le J av a fiindatat interp re tate c at si com p ilate . A sad ar v om av ea la d isp oz itie un com p i-lator resp onsab il cu transform area surse lor p rog ram ului ın asa num itul codd e octe ti, p re cum si un interp re tor c e v a e x e cuta resp e c tiv ul cod d e octe ti.

Cod ul d e octe ti e ste d ife rit d e cod ul m asina. Cod ul m asina e ste re p re z en-tat d e o suc c esiune d e instruc tiuni sp e c ific e unui anum it p roc esor si une i an-um ite p latform e d e lucru re p re z entate ın form at b inar astfe l ınc at sa p oatafi e x e cutate fara a m ai ne c esita nic i o p re lucrare .

Cod urile d e octe ti sunt seturi d e instruc tiuni care seam ana cu cod ul scrisın lim b aj d e asam b lare si sunt g enerate d e com p ilator ind e p end ent d e m e d iuld e lucru. In tim p c e cod ul m asina e ste e x e cutat d ire c t d e c atre p roc esor sip oate fi folosit num ai p e p latform a p e care a fost creat, cod ul d e octe ti e steinterp re tat d e m e d iul J av a si d e ac e ea p oate fi rulat p e oric e p latform a p ecare este instalata m e d iul d e e x e cutie J av a.

P rin m a sin a virtu a la J a va (J V M ) v om ınte le g e m e d iul d e e x e cutie alap licatiilor J av a. P entru ca un cod d e octe ti sa p oata fi e x e cutat p e unanum it calculator, p e ac esta tre b uie sa fie instalata o m asina v irtuala J av a.A c e st lucru este realizat autom at d e c atre d istrib utia J 2S D K .

1.2 P rim ul prog ram

Crearea oric are i ap licatii J av a p resup une e fe c tuarea urm atorilor p asi:

1. S criererea codului sursa

class FirstApp {

public static void main( String args[]) {

System.out.println("Hello world!");

}

}

Page 16: Cristian Frasinaru-Curs Practic de Java.pdf

1 .2 . PRIM UL PRO G RAM 15

T oate ap licatiile J av a contin o c lasa p rinc ip ala(p rim ara) ın care tre b uiesa se g aseasc a m e tod a main. Clase le ap licatie i se p ot g asi fie ıntr-un sing urfisie r, fie ın m ai m ulte .

2 . S alvarea fi sierelor sursa

S e v a fac e ın fisie re care au ob lig atoriu e x tensia java, nic i o alta e x ten-sie nefiind ac c e p tata. E ste re com and at ca fisie rul care contine cod ul sursaal c lase i p rim are sa aib a ac e lasi num e cu c e l al c lase i, d e si ac e st lucru nueste ob lig atoriu. S a p re sup unem c a am salv at e x e m p lul d e m ai sus ın fisie rulC:\intro\FirstApp.java.

3 . Com pilarea aplicatiei

P entru com p ilare v om folosi com p ilatorul javac d in d istrib utia J 2S D K .A p e lul com p ilatorului se fac e p entru fisie rul c e contine c lasa p rinc ip ala aap licatie i sau p entru oric e fisie r/ fisie re cu e x tensia java. Com p ilatorul cre eaz ac ate un fisie r se p arat p entru fiecare c lasa a p rog ram ului. A c e stea au ex tensia.class si im p lic it sunt p lasate ın ac e lasi d ire c tor cu fisie re le sursa.

javac FirstApp.java

In cazul ın care com p ilarea a reusit v a fi g enerat fisie rul FirstApp.class.

4 . R ularea aplicatiei

S e fac e cu interp re torul java, ap e lat p entru unitatea d e com p ilare core -sp unz atoare c lase i p rinc ip ale . D eoare c e interp re torul are ca arg um ent d eintrare num e le c lase i p rinc ip ale si nu num e le unui fisie r, ne v om p oz itionaın d ire c torul c e contine fisie rul FirstApp.class si v om ap e la interp re torulastfe l:

java FirstApp

R ularea une i ap licatii care nu folose ste interfata g rafic a, se v a fac e ıntr-ofereastra siste m .

Page 17: Cristian Frasinaru-Curs Practic de Java.pdf

16 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

A tentieU n ap e l d e g enul java c:\intro\FirstApp.class e ste g re sit!

1.3 S tructura lex icala a lim b ajului Java

1.3 .1 S etul de caractere

L im b ajului J av a lucreaz a ın m od nativ folosind setul d e caractere U nicod e .A c e sta este un stand ard international care ınlocuie ste v e ch iul set d e caractereA S CII si care folose ste p entru re p re z entarea caractere lor 2 octe ti, c e ea c eınseam na c a se p ot re p re z enta 65536 d e se m ne , sp re d eose b ire d e A S CII, und ee ra p osib ila re p re z entarea a d oar 256 d e caractere . P rim e le 256 caractereU nicod e coresp und c e lor A S CII, re fe rirea la c e le lalte fac and u-se p rin \uxxxx,und e xxxx re p re z inta cod ul caracterului.

O alta caracteristic a a setului d e caractere U nicod e e ste fap tul c a ıntre ginterv alul d e re p re z entare a sim b olurilor este d iv izat ın sub interv ale num iteb locuri, c ate v a e x e m p le d e b locuri fiind : B asic L atin, G re e k , A rab ic , G oth ic ,Currenc y , M ath e m atical, A rrow s, M usical, e tc .

M ai jos sunt oferite c ate v a e x e m p le d e caractere U nicod e .

• \u0030 - \u0039 : c ifre IS O-L atin 0 - 9

• \u0660 - \u0669 : c ifre arab ic -ind ic 0 - 9

• \u03B1 - \u03C9 : sim b oluri g re c e sti α − ω

• \u2200 - \u22FF : sim b oluri m ate m atic e (∀, ∃, ∅, e tc .)

• \u4e00 - \u9fff : lite re d in alfab e tul H an (Ch ine z , J ap onez , Core ean)

M ai m ulte inform atii le g ate d e re p re z entarea U nicod e p ot fi ob tinute laad resa ” h ttp :/ / w w w .unicod e .org ” .

1.3 .2 Cuvinte ch eie

Cuv inte le re z e rv ate ın J av a sunt, cu c ate v a e x c e p tii, c e le d in C+ + si au fostenum erate ın tab e lul d e m ai jos. A c e stea nu p ot fi folosite ca num e d e c lase ,

Page 18: Cristian Frasinaru-Curs Practic de Java.pdf

1 .3 . ST RUCT URA L E X ICAL A A L IM B AJ UL UI J AV A 17

interfe te , v ariab ile sau m etod e . true, false, null nu sunt cuv inte ch e ie ,d ar nu p ot fi nic i e le folosite ca num e ın ap licatii. Cuv inte le m arcate p rin ∗sunt re z e rv ate , d ar nu sunt folosite .

abstract double int strictfp

boolean else interface super

break extends long switch

byte final native synchronized

case finally new this

catch float package throw

char for private throws

class goto* protected transient

const* if public try

continue implements return void

default import short volatile

do instanceof static while

Inc e p and cu v ersiunea 1.5, m ai e x ista si cuv antul ch e ie enum.

1.3 .3 Identifi catori

S unt se c v ente ne lim itate d e lite re si c ifre U nicod e , ınc e p and cu o lite ra. D up acum am m ai sp us, id entificatorii nu au v oie sa fie id entic i cu cuv inte le re z e r-v ate .

1.3 .4 L iterali

L ite ralii p ot fi d e urm atoare le tip uri:

• Intreg iS unt ac c e p tate 3 b az e d e num eratie : b aza 10, b aza 16 (ınc e p cu car-actere le 0x ) si b aza 8 (ınc e p cu c ifra 0) si p ot fi d e d oua tip uri:

– norm ali - se re p re z inta p e 4 octe ti (32 b iti)

– lung i - se re p re z inta p e 8 octe ti (64 b iti) si se te rm ina cu caracterulL (sau l).

Page 19: Cristian Frasinaru-Curs Practic de Java.pdf

18 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

• F lotantiP entru ca un lite ral sa fie consid e rat fl otant e l tre b uie sa aib a c e l p utin oz e c im ala d up a v irg ula, sa fie ın notatie e x p onentiala sau sa aib a sufix ulF sau f p entru v alorile norm ale - re p re z entate p e 32 b iti, re sp e c tiv Dsau d p entru v alorile d ub le - re p re z entate p e 64 b iti.E x e m p le : 1.0, 2e2, 3f , 4D.

• L og iciS unt re p re z entati d e true - v aloarea log ic a d e ad e v ar, re sp e c tiv false

- v aloarea log ic a d e fals.

A tentie

S p re d eose b ire d e C+ + , lite ralii ıntre g i 1 si 0 nu m ai au se m nificatiad e ad e v arat, resp e c tiv fals.

• CaracterU n lite ral d e tip caracter e ste utilizat p entru a ex p rim a caractere le co-d ului U nicod e . R e p re z entarea se fac e fie folosind o lite ra, fie o se c v entaesca pe scrisa ıntre ap ostrofuri. S e c v ente le e scap e p e rm it sp e c ificareacaractere lor care nu au re p re z entare g rafic a si re p re z entarea unor car-actere sp e c iale p re cum b ack slash , ap ostrof, e tc . S e c v ente le e scap e p re -d efinite ın J av a sunt:

– ’\b’ : B ack sp ac e (B S )

– ’\t’ : T ab orizontal (H T )

– ’\n’ : L inie noua (L F)

– ’\f’ : P ag ina noua (FF)

– ’\r’ : Inc e p ut d e rand (CR )

– ’\"’ : G h ilim e le

– ’\’’ : A p ostrof

– ’\\’ : B ack slash

Page 20: Cristian Frasinaru-Curs Practic de Java.pdf

1 .3 . ST RUCT URA L E X ICAL A A L IM B AJ UL UI J AV A 19

• S iruri de caractereU n lite ral sir d e caractere e ste form at d in z ero sau m ai m ulte caractereıntre g h ilim e le . Caractere le care form eaz a sirul p ot fi caractere g raficesau se c v ente e scap e .D ac a sirul este p rea lung e l p oate fi scris ca o concatenare d e sub sirurid e d im ensiune m ai m ic a, concatenarea sirurilor realiz and u-se cu op er-atorul +, ca ın e x e m p lul: "Ana " + " are " + " mere ". S irul v ide ste "".

D up a cum v om v e d ea, oric e sir e ste d e fap t o instanta a c lase i String,d efinita ın p ach e tul java.lang.

1.3 .5 S eparatori

U n se p arator este un caracter care ind ic a sfarsitul une i unitati le x icale siınc e p utul alte ia. In J av a se p aratorii sunt urm atorii: ( ) [ ] ; , . .Instruc tiunile unui p rog ram se se p ara cu p unct si v irg ula.

1.3 .6 O peratori

Op eratorii J av a sunt, cu m ic i d eose b iri, c e i d in C+ + :

• atrib uirea: =

• op eratori m ate m atic i: +, -, *, /, %, ++, -- .E ste p e rm isa notatia p rescurtata d e form a lval op= rval: x += 2 n

-= 3

E x ista op e ratori p entru autoincre m entare si autod e c re m entare (p ost sip re ): x++, ++x, n--, --n

E v aluarea e x p resiilor log ic e se fac e p rin m etod a scu rtcircu itu lu i: e v alu-area se op re ste ın m om entul ın care v aloarea d e ad e v ar a e x p resie i e stesig ur d e te rm inata.

• op eratori log ic i: &&(and), ||(or), !(not)

• op eratori re lationali: <, <=, >, <=, ==, !=

• op eratori p e b iti: &(and), |(or), ^ (xor), ~ (not)

• op eratori d e translatie : <<, >>, >>> (shift la dreapta fara semn)

Page 21: Cristian Frasinaru-Curs Practic de Java.pdf

20 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

• op eratorul if-else : expresie-logica ? val-true : val-false

• op eratorul , (v irg ula) folosit p entru e v aluarea se c v entiala a op eratiilor:int x=0, y=1, z=2;

• op eratorul + p entru concatenarea sirurilor:

String s1="Ana";

String s2="mere";

int x=10;

System.out.println(s1 + " are " + x + " " + s2);

• op eratori p entru conv ersii (ca st) : (tip-de-data)

int a = (int)’a’;

char c = (char)96;

int i = 200;

long l = (long)i; //widening conversion

long l2 = (long)200;

int i2 = (int)l2; //narrowing conversion

1.3 .7 Com entarii

In J av a e x ista tre i fe luri d e com entarii:

• Com entarii p e m ai m ulte linii, ınch ise ıntre / * si * / .

• Com entarii p e m ai m ulte linii care tin d e d ocum entatie , ınch ise ıntre/ * * si * / . T e x tul d intre c e le d oua se c v ente e ste autom at m utat ınd ocum entatia ap licatie i d e c atre g eneratorul autom at d e d ocum entatiejavadoc.

• Com entarii p e o sing ura linie , care inc e p cu //.

Ob serv atii:

• N u p ute m scrie com entarii ın interiorul altor com entarii.

• N u p ute m introd uc e com entarii ın interiorul lite ralilor caracter sau sird e caractere .

• S e c v ente le /* si */ p ot sa ap ara p e o linie d up a se c v enta // d ar ısip ie rd se m nificatia. L a fe l se ıntam p la cu se c v enta // ın com entarii careinc e p cu /* sau */.

Page 22: Cristian Frasinaru-Curs Practic de Java.pdf

1 .4 . T IPURI D E D AT E SI V ARIAB IL E 21

1.4 T ipuri de date si variab ile

1.4 .1 T ipuri de date

In J av a tip urile d e d ate se im p art ın d oua cate g orii: tipuri prim itive sitipuri referinta. J av a p orne ste d e la p re m iza c a ” oric e e ste un ob ie c t” ,p rin urm are tip urile d e d ate ar tre b ui sa fie d e fap t d efinite d e c lase si toatev ariab ile le ar tre b ui sa m e m ore z e instante ale ac estor c lase (ob ie c te ). Inp rinc ip iu ac est lucru este ad e v arat, ınsa, p entru usurinta p rog ram arii, m aie x ista si asa num ite le tip urile p rim itiv e d e d ate , care sunt c e le uzuale :

• aritm etice

– ıntreg i: byte (1 octet), short (2), int (4), long (8)

– reale: float (4 octeti), double (8)

• caracter: char (2 octe ti)

• log ic: boolean (true si false)

In alte lim b aje d e p rog ram are form atul si d im ensiunea tip urilor p rim itiv e d ed ate p ot d e p ind e d e p latform a p e care ruleaz a p rog ram ul. In J av a ac est lucrunu m ai este v alab il, oric e d e p end enta d e o anum ita p latform a sp e c ific a fiinde lim inata.

V e c torii, c lase le si interfe te le sunt tip uri re fe rinta. V aloarea une i v ariab iled e ac est tip e ste , sp re d eose b ire d e tip urile p rim itiv e , o re fe rinta (ad resa d em e m orie ) c atre v aloarea sau m ultim ea d e v alori re p re z entata d e v ariab ilaresp e c tiv a.

E x ista tre i tip uri d e d ate d in lim b ajul C care nu sunt sup ortate d e lim -b ajul J av a. A c e stea sunt: pointer, struct si union. P ointerii au foste lim inati d in cauz a c a e rau o sursa constanta d e e rori, locul lor fiind luat d etip ul re fe rinta, iar struct si union nu ısi m ai au rostul atat tim p c at tip urilecom p use d e d ate sunt form ate ın J av a p rin interm e d iul c lase lor.

Page 23: Cristian Frasinaru-Curs Practic de Java.pdf

22 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

1.4 .2 V ariab ile

V ariab ile le p ot fi d e tip p rim itiv sau re fe rinte la ob ie c te (tip re fe rinta). In-d ife rent d e tip ul lor, p entru a p utea fi folosite v ariab ile le tre b uie d e c larate si,e v entual, initializate .

• D e c lararea v ariab ile lor: Tip numeVariabila;

• Initializarea v ariab ile lor: Tip numeVariabila = valoare;

• D e c lararea constante lor: final Tip numeVariabila;

E v id ent, e x ista p osib ilitatea d e a d e c lara si initializa m ai m ulte v ariab ilesau constante d e ac e lasi tip ıntr-o sing ura instruc tiune astfe l:

Tip variabila1[=valoare1], variabila2[=valoare2],...;

Conv entia d e num ire a v ariab ile lor ın J av a inc lud e , p rintre alte le , urm atoare lec rite rii:

• v ariab ile le finale (constante) se sc riu cu m ajuscule ;

• v ariab ile le care nu sunt constante se scriu astfe l: p rim a lite ra m ic a iard ac a num e le v ariab ile i e ste form at d in m ai m ulti atom i le x icali, atunc ip rim e le lite re ale c e lorlalti atom i se sc riu cu m ajuscule .

E x e m p le :

final double PI = 3.14;

final int MINIM=0, MAXIM = 10;

int valoare = 100;

char c1=’j’, c2=’a’, c3=’v’, c4=’a’;

long numarElemente = 12345678L;

String bauturaMeaPreferata = "apa";

In func tie d e locul ın care sunt d e c larate v ariab ile le se ım p art ın urm atoate lecate g orii:

a. V ariab ile m e m b re , d e c larate ın interiorul une i c lase , v iz ib ile p entrutoate m e tod e le c lase i re sp e c tiv e c at si p entru alte c lase ın func tie d eniv e lul lor d e ac c e s (v e z i ” D e c lararea v ariab ile lor m e m b re ” ).

Page 24: Cristian Frasinaru-Curs Practic de Java.pdf

1 .4 . T IPURI D E D AT E SI V ARIAB IL E 23

b . P aram etri m e tod e lor, v iz ib ili d oar ın m etod a resp e c tiv a.

c . V ariab ile locale , d e c larate ıntr-o m etod a, v iz ib ile d oar ın m etod a re -sp e c tiv a.

d . V ariab ile locale , d e c larate ıntr-un b loc d e cod , v iz ib ile d oar ın b loculresp e c tiv .

e . P aram etrii d e la tratarea e x c e p tiilor (v e z i ” T ratarea e x c e p tiilor” ).

class Exemplu {

//Fiecare variabila corespunde situatiei data de numele ei

//din enumerarea de mai sus

int a;

public void metoda(int b) {

a = b;

int c = 10;

for(int d=0; d < 10; d++) {

c --;

}

try {

a = b/c;

} catch(ArithmeticException e) {

System.err.println(e.getMessage());

}

}

}

Ob serv atii:

• V ariab ile le d e c larate ıntr-un for, ram an locale corp ului c ic lului:

for(int i=0; i<100; i++) {

//domeniul de vizibilitate al lui i

}

i = 101;//incorect

• N u este p e rm isa ascund erea une i v ariab ile :

Page 25: Cristian Frasinaru-Curs Practic de Java.pdf

24 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

int x=1;

{

int x=2; //incorect

}

1.5 Controlul ex ecutiei

Instruc tiunile J av a p entru controlul e x e cutie i sunt foarte ase m anatoare c e lord in lim b ajul C si p ot fi ım p artite ın urm atoare le cate g orii:

• Instruc tiuni d e d e c iz ie : if-else, switch-case

• Instruc tiuni d e salt: for, while, do-while

• Instruc tiuni p entru tratarea e x c e p tiilor: try-catch-finally, throw

• A lte instruc tiuni: break, continue, return, la bel:

1.5 .1 Instructiuni de deciz ie

if-else

if (expresie-logica) {

...

}

if (expresie-logica) {

...

} else {

...

}

sw itch -case

switch (variabila) {

case valoare1:

...

break;

case valoare2:

Page 26: Cristian Frasinaru-Curs Practic de Java.pdf

1 .5 . CO NT RO L UL E X E CUT IE I 25

...

break;

...

default:

...

}

V ariab ile le care p ot fi testate folosind instruc tiunea switch nu p ot fi d e c atd e tip uri p rim itiv e .

1.5 .2 Instructiuni de salt

for

for(initializare; expresie-logica; pas-iteratie) {

//Corpul buclei

}

for(int i=0, j=100 ; i < 100 && j > 0; i++, j--) {

...

}

A tat la initializare c at si ın p asul d e ite ratie p ot fi m ai m ulte instruc tiunid e sp artite p rin v irg ula.

w h ile

while (expresie-logica) {

...

}

do-w h ile

do {

...

}

while (expresie-logica);

Page 27: Cristian Frasinaru-Curs Practic de Java.pdf

26 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

1.5 .3 Instructiuni pentru tratarea ex ceptiilor

Instruc tiunile p entru tratarea e x c e p tiilor sunt try-catch-finally, re sp e c tivthrow si v or fi tratate ın cap itolul ” E x c e p tii” .

1.5 .4 A lte instructiuni

• break: p arase ste fortat corp ul une i structuri re p e titiv e .

• continue: te rm ina fortat ite ratia curenta a unui c ic lu si tre c e la urm atoareaite ratie .

• return [valoare]: te rm ina o m etod a si, e v entual, re turneaz a o v alo-rare .

• n u m eE tich eta : : D efine ste o etich e ta.

D e si ın J av a nu ex ista goto, se p ot d efini totusi e tich e te folosite ın e x p resiid e g enul: break numeEticheata sau continue numeEticheta, utile p entrua controla p unctul d e ie sire d intr-o structura re p e titiv a, ca ıne x e m p lul d em ai jos:

i=0;

eticheta:

while (i < 10) {

System.out.println("i="+i);

j=0;

while (j < 10) {

j++;

if (j==5) continue eticheta;

if (j==7) break eticheta;

System.out.println("j="+j);

}

i++;

}

1.6 V ectori

1.6 .1 Crearea unui vector

Crearea unui v e c tor p resup une realizarea urm atoare lor etap e :

Page 28: Cristian Frasinaru-Curs Practic de Java.pdf

1 .6 . V E CT O RI 27

• D eclararea v e c torului - P entru a p utea utiliza un v e ctor tre b uie , ınainted e toate , sa-l d e c laram . A c e st lucru se fac e p rin e x p resii d e form a:

Tip[] numeVector; sau

Tip numeVector[];

ca ın e x e m p le le d e m ai jos:

int[] intregi;

String adrese[];

• Instantierea

D e c lararea unui v e c tor nu im p lic a si alocarea m e m orie i ne c e sare p entrure tinerea e le m ente lor. Op eratiunea d e alocare a m e m orie i, num ita siinstantie rea v e c torului, se realiz eaz a ıntotd eauna p rin interm e d iul op -e ratorului new. Instantie rea unui v e c tor se v a fac e p rintr-o e x p resie d eg enul:

numeVector = new Tip[nrElemente];

und e n rE lem en te re p re z inta num arul m ax im d e e le m ente p e care lep oate av ea v e c torul. In urm a instantie rii v or fi alocati: nr E lem ente ∗d im ensiu ne(T ip ) octe ti ne c e sari m e m orarii e le m ente lor d in v e c tor, und ep rin d im ensiu ne(T ip ) am notat num arul d e octe ti p e care se re p re z intatip ul resp e c tiv .

v = new int[10];

//aloca spatiu pentru 10 intregi: 40 octeti

c = new char[10];

//aloca spatiu pentru 10 caractere: 20 octeti

D e c lararea si instantie rea unui v e c tor p ot fi facute sim ultan astfe l:

Tip[] numeVector = new Tip[nrElemente];

Page 29: Cristian Frasinaru-Curs Practic de Java.pdf

28 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

• Initializarea (op tional) D up a d e c lararea unui v e c tor, ac esta p oate fiinitializat, ad ic a e le m ente le sale p ot p rim i niste v alori initiale , e v id entd ac a e ste cazul p entru asa c e v a. In ac est caz instantie rea nu m ai tre b uiefacuta e x p lic it, alocarea m e m orie i fac and u-se autom at ın func tie d enum a rul d e e le m ente cu care se initializ eaz a v e c torul.

String culori[] = {"Rosu", "Galben", "Verde"};

int []factorial = {1, 1, 2, 6, 24, 120};

P rim ul ind ic e al unui v e c tor este 0, d e c i p oz itiile unui v e c tor cu n e le -m ente v or fi cup rinse ıntre 0 si n − 1. N u sunt p erm ise construc tii d e g enulTip numeVector[nrElemente], alocarea m e m orie i fac and u-se d oar p rin in-term e d iul op earatorului new.

int v[10]; //ilegal

int v[] = new int[10]; //corect

1.6 .2 T ab louri m ultidim ensionale

In J av a tab lourile m ultid im ensionale sunt d e fap t v e c tori d e v e c tori. D ee x e m p lu, c rearea si instantie rea une i m atric i v or fi realizate astfe l:

Tip matrice[][] = new Tip[nrLinii][nrColoane];

matrice[i] e ste linia i a m atric ii si re p re z inta un v e c tor cu nrColoane

e le m ente iar matrice[i][j] e ste e le m entul d e p e linia i si coloana j.

1.6 .3 D im ensiunea unui vector

Cu ajutorul v ariab ile i leng th se p oate afl a num arul d e e le m ente al unuiv e c tor.

int []a = new int[5];

// a.length are valoarea 5

int m[][] = new int[5][10];

// m[0].length are valoarea 10

P entru a ınte le g e m od alitatea d e folosire a lui length tre b uie m entionat c afie care v e c tor este d e fap t o instanta a une i c lase iar length e ste o v ariab ilap ub lic a a ac e le i c lase , ın care este re tinut num arul m ax im d e e le m ente alv e c torului.

Page 30: Cristian Frasinaru-Curs Practic de Java.pdf

1 .6 . V E CT O RI 29

1.6 .4 Copierea vectorilor

Cop ie rea e le m ente lor unui v e c tor a ıntr-un alt v e c tor b se p oate fac e , fiee le m ent cu e le m ent, fie cu ajutorul m e tod e i System.arraycopy, ca ın e x e m -p le le d e m ai jos. D up a cum v om v e d ea, o atrib uire d e g enul b = a are altase m nificatie d e c at cop ie rea e le m ente lor lui a ın b si nu p oate fi folosita ınac est scop .

int a[] = {1, 2, 3, 4};

int b[] = new int[4];

// Varianta 1

for(int i=0; i<a.length; i++)

b[i] = a[i];

// Varianta 2

System.arraycopy(a, 0, b, 0, a.length);

// Nu are efectul dorit

b = a;

1.6 .5 S ortarea vectorilor - clasa Arrays

In J av a s-a p us un acc ent d eose b it p e im p le m entarea unor structuri d e d atesi alg oritm i care sa sim p lific e p roc eseul d e c rearea a unui alg oritm , p rog ram -atorul tre b uind sa se concentre z e p e asp e c te le sp e c ific e p rob le m e i ab ord ate .Clasa java.util.Arrays ofera d iv e rse m e tod e foarte utile ın lucrul cu v e c -tori cum ar fi:

• sort - sorteaz a asc end ent un v e ctor, folosind un alg oritm d e tip Q u ick-S o rt p e rform ant, d e com p le x itate O(n log (n)).

int v[]={3, 1, 4, 2};

java.util.Arrays.sort(v);

// Sorteaza vectorul v

// Acesta va deveni {1, 2, 3, 4}

• b inary S earch - c autarea b inara a une i anum ite v alori ıntr-un v e ctorsortat;

Page 31: Cristian Frasinaru-Curs Practic de Java.pdf

30 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

• eq uals - te starea e g alitatii v alorilor a d oi v e c tori (au ace leasi num ard e e le m ente si p entru fiecare ind ic e v alorile coresp unz atoare d in c e i d oiv e c tori sunt e g ale)

• fi ll - atrib uie fie c arui e le m ent d in v e c tor o v aloare sp e c ificata.

1.6 .6 V ectori cu dim ensiune variab ila si eterog eni

Im p le m entari ale v e c torilor cu num ar v ariab il d e e le m ente sunt oferite d ec lase sp e c ializate cum ar fi Vector sau ArrayList d in p ach e tul java.util.A stfe l d e ob ie c te d e sc riu v e c tori e te rog eni, ale c aror e le m ente au tip ul Object,si v or fi stud iati ın cap itolul ” Cole c tii” .

1.7 S iruri de caractere

In J av a, un sir d e caractere p oate fi re p re z entat p rintr-un v e ctor form atd in e le m ente d e tip char, un ob ie c t d e tip S tring sau un ob ie c t d e tipS tring B uff er.

D ac a un sir d e caractere e ste constant (nu se d ore ste sch im b area continutuluisa p e p arcursul e x e cutie i p rog ram ului) atunc i e l v a fi d e c larat d e tip ul String,altfe l v a fi d e c larat d e tip StringBuffer. D ife renta p rinc ip ala ıntre ac estec lase este c a StringBuffer p une la d isp oz itie m e tod e p entru m od ificareacontinutului sirului, cum ar fi: append, insert, delete, reverse.U zual, c ea m ai folosita m od alitate d e a lucra cu siruri e ste p rin interm e d iulc lase i String, care are si unele p articularitati fata d e re stul c lase lor m enite sasim p lific e c at m ai m ult folosirea sirurilor d e caractere . Clasa StringBuffer

v a fi utilizata p re d om inant ın ap licatii d e d icate p roc esarii te x te lor cum ar fied itoare le d e te x te .

E x e m p le e ch iv alente d e d e c larare a unui sir:

String s = "abc";

String s = new String("abc");

char data[] = {’a’, ’b’, ’c’};

String s = new String(data);

Ob serv ati p rim a v arianta d e d e c larare a sirului s d in e x e m p lul d e m ai sus- d e altfe l, c ea m ai folosita - care p re z inta o p articularitate a c lase i Stringfata d e restul c lase lor J av a re fe ritoare la instantie rea ob ie c te lor sale .

Page 32: Cristian Frasinaru-Curs Practic de Java.pdf

1 .8 . F O L O SIRE A ARG UM E NT E L O R D E L A L INIA D E CO M AND A 31

Concatenarea sirurilor d e caractere se fac e p rin interm e d iul op eratorului+ sau, ın cazul sirurilor d e tip StringBuffer, folosind m e tod a append.

String s1 = "abc" + "xyz";

String s2 = "123";

String s3 = s1 + s2;

In J av a, op eratorul d e concatenare + e ste e x tre m d e fl e x ib il, ın sensul c ap e rm ite concatenarea sirurilor cu ob ie c te d e oric e tip care au o re p re z entared e tip sir d e caractere . M ai jos, sunt c ate v a e x e m p le :

System.out.print("Vectorul v are" + v.length + " elemente");

String x = "a" + 1 + "b"

P entru a lam uri p utin lucrurile , c e ea c e e x e cuta com p ilatorul atunc i c andıntalne ste o se c v enta d e g enul String x = "a" + 1 + "b" e ste :

String x = new StringBuffer().append("a").append(1).

append("b").toString()

A tentie ınsa la ord inea d e e fe c tuare a op eratiilor. S irul s=1+2+"a"+1+2v a av ea v aloarea "3a12", p rim ul + fiind op eratorul m ate m atic d e ad unareiar al d oilea + , c e l d e concatenare a sirurilor.

1.8 F olosirea arg um entelor de la linia de co-

m anda

1.8 .1 T ransm iterea arg um entelor

O ap licatie J av a p oate p rim i oric ate arg um ente d e la linia d e com and a ınm om entul lansarii e i. A c e ste arg um ente sunt utile p entru a p erm ite utiliza-torului sa sp e c ific e d iv e rse op tiuni le g ate d e func tionarea ap licatie i sau safurniz e z e anum ite d ate initiale p rog ram ului.

A tentieP rog ram e le care folosesc arg um ente d e la linia d e com and a nu sunt 100%

p ure J av a, d eoare c e unele siste m e d e op e rare , cum ar fi M ac OS , nu au ınm od norm al linie d e com and a.

Page 33: Cristian Frasinaru-Curs Practic de Java.pdf

32 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

A rg um ente le d e la linia d e com and a sunt introd use la lansarea une i ap licatii,fiind sp e c ificate d up a num e le ap licatie i si se p arate p rin sp atiu. D e e x e m p lu,sa p re sup unem c a ap licatia Sortare ord oneaz a le x icog rafic (alfab etic ) liniileunui fisie r si p rim e ste ca arg um ent d e intrare num e le fisie rului p e care saıl sorte z e . P entru a ord ona fisie rul "persoane.txt", ap licatia v a fi lansataastfe l:

java Sortare persoane.txt

A sad ar, form atul g eneral p entru lansarea une i ap licatii care p rim e ste arg u-m ente d e la linia d e com and a e ste :

java NumeAplicatie [arg0 arg1 . . . argn]

In cazul ın care sunt m ai m ulte , arg um ente le tre b uie se p arate p rin sp atiiiar d ac a unul d intre arg um ente contine sp atii, atunc i e l tre b uie p us ıntreg h ilim e le . E v id ent, o ap licatie p oate sa nu p rim easc a nic i un arg um ent saup oate sa ig nore arg um ente le p rim ite d e la linia d e com and a.

1.8 .2 P rim irea arg um entelor

In m om entul lansarii une i ap licatii interp re torul p arcurg e linia d e com and a cucare a fost lansata ap licattia si, ın cazul ın care e x ista, transm ite p rog ram uluiarg um ente le sp e c ificate sub form a unui v e c tor d e siruri. A c e sta este p rim itd e ap licatie ca p aram etru al m e tod e i main. R eam intim c a form atul m e tod e imain d in c lasa p rinc ip ala este :

public static void main (String args[])

V e c torul ar g s p rim it ca p aram etru d e m e tod a main v a contine toate arg u-m ente le transm ise p rog ram ului d e la linia d e com and a.In cazul ap e lului java Sortare persoane.txt v e c torul ar g s v a contine unsing ur e le m ent p e p rim a sa p oz itie : args[0]="persoane.txt".

V e c toru ar g s e ste instantiat cu un num ar d e e le m ente e g al cu num arul ar-g um ente lor p rim ite d e la linia d e com and a. A sad ar, p entru a afl a num arul d earg um ente p rim ite d e p rog ram este sufic ient sa afl am d im ensiunea v e c toruluiargs p rin interm e d iul atrib utului length:

Page 34: Cristian Frasinaru-Curs Practic de Java.pdf

1 .8 . F O L O SIRE A ARG UM E NT E L O R D E L A L INIA D E CO M AND A 33

public static void main (String args[]) {

int numarArgumente = args.length ;

}

In cazul ın care ap licatia p resup une e x istenta unor arg um ente d e la liniad e com and a, ınsa ac estea nu au fost transm ise p rog ram ului la lansarea sa, v orap area e x c e p tii (e rori) d e tip ul ArrayIndexOutOfBoundsException. T ratareaac estor e x c e p tii e ste p re z entata ın cap itolul ” E x c e p tii” .D in ac est m otiv , e ste ne c esar sa te stam d ac a p rog ram ul a p rim it arg um ente led e la linia d e com and a ne c e sare p entru func tionarea sa si, ın caz contrar, saafise z e un m esaj d e av ertizare sau sa foloseasc a niste v alori im p lic ite , ca ıne x e m p lul d e m ai jos:

public class Salut {

public static void main (String args[]) {

if (args.length == 0) {

System.out.println("Numar insuficient de argumente!");

System.exit(-1); //termina aplicatia

}

String nume = args[0]; //exista sigur

String prenume;

if (args.length >= 1)

prenume = args[1];

else

prenume = ""; //valoare implicita

System.out.println("Salut " + nume + " " + prenume);

}

}

S p re d eose b ire d e lim b ajul C, v e c torul p rim it d e m e tod a main nu continep e p rim a p oz itie num e le ap licatie i, ıntruc at ın J av a num e le ap licatie i e stech iar num e le c lase i p rinc ip ale , ad ic a a c lase i ın care se g ase ste m e tod a main.

S a consid e ra ın continuare un ex e m p lu sim p lu ın care se d ore ste afisareap e e c ran a arg um ente lor p rim ite d e la linia d e com and a:

public class Afisare {

public static void main (String[] args) {

for (int i = 0; i < args.length; i++)

System.out.println(args[i]);

Page 35: Cristian Frasinaru-Curs Practic de Java.pdf

34 CAPIT O L UL 1 . INT RO D UCE RE IN J AV A

}

}

U n ap e l d e g enul java Afisare Hello Java v a p rod uc e urm atorul re zul-tat (ap licatia a p rim it 2 arg um ente):

Hello

Java

A p e lul java Afisare "Hello Java" v a p rod uc e ınsa alt re zultat (ap licatiaa p rim it un sing ur arg um ent):

Hello Java

1.8 .3 A rg um ente num erice

A rg um ente le d e la linia d e com and a sunt p rim ite sub form a unui v e c tor d esiruri (ob ie c te d e tip String). In cazul ın care unele d intre ac estea re p re z intav alori num eric e e le v or tre b ui conv ertite d in siruri ın num ere . A c e st lucruse realiz eaz a cu m e tod e d e tip ul parseT ip N u m eric afl ate ın c lasa coresp un-zatoare tip ului ın care v re m sa fac e m conv ersia: Integer, Float, Double,e tc .

S a consid e ram , d e e x e m p lu, c a ap licatia Power rid ic a un num ar real la op utere ıntreag a, arg um ente le fiind trim ise d e la linia d e com and a sub form a:

java Power "1.5" "2" //ridica 1.5 la puterea 2

Conv ersia c e lor d oua arg um ente ın num ere se v a fac e astfe l:

public class Power {

public static void main(String args[]) {

double numar = Double.parseDouble(args[0]);

int putere = Integer.parseInt(args[1]);

System.out.println("Rezultat=" + Math.pow(numar, putere));

}

}

M e tod e le d e tip ul parseT ip N u m eric p ot p rod uc e e x c e p tii (e rori) d e tip ulNumberFormatException ın cazul ın care sirul p rim it ca p aram etru nu re p re z intaun num ar d e tip ul resp e c tiv . T ratarea ac estor e x c e p tii e ste p re z entata ıncap itolul ” E x c e p tii” .

Page 36: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 2

O b iecte si clase

2 .1 Ciclul de viata al unui ob iect

2 .1.1 Crearea ob iectelor

In J av a, ca ın oric e lim b aj d e p rog ram are orientat-ob ie c t, c rearea ob ie c te lorse realiz eaz a p rin in sta n tierea une i c lase si im p lic a urm atoare le lucruri:

• D eclarareaP re sup une sp e c ificarea tip ului ac e lui ob ie c t, cu alte cuv inte sp e c ificareac lase i ac e stuia (v om v e d ea c a tip ul unui ob ie c t p oate fi si o interfata).

NumeClasa numeObiect;

• InstantiereaS e realiz eaz a p rin interm e d iul op eratorului new si are ca e fe c t c reareae fe c tiv a a ob ie c tului cu alocarea sp atiului d e m e m orie coresp unz ator.

numeObiect = new NumeClasa();

• InitializareaS e realiz eaz a p rin interm e d iul constructorilor c lase i re sp e c tiv e . Initializareaeste d e fap t p arte inte g ranta a p roc esului d e instantie re , ın sensul c aim e d iat d up a alocarea m e m orie i ca e fe c t al op eratorului new e ste ap e latconstructorul sp e c ificat. P arante z e le rotund e d e d up a num e le c lase i in-d ic a fap tul c a acolo este d e fap t un ap e l la unul d in constructorii c lase isi nu sim p la sp e c ificare a num e lui c lase i.M ai g eneral, instantie rea si initializarea ap ar sub form a:

35

Page 37: Cristian Frasinaru-Curs Practic de Java.pdf

36 CAPIT O L UL 2 . O B IE CT E SI CL ASE

numeObiect = new NumeClasa([argumente constructor]);

S a consid e ram urm atorul e x e m p lu, ın care d e c laram si instantie m d ouaob ie c te d in c lasa Rectangle, c lasa c e d e sc rie sup rafe te g rafice re c tang ulare ,d efinite d e coord onate le coltului stang a sus (orig inea) si latim ea, resp e c tivınaltim ea.

Rectangle r1, r2;

r1 = new Rectangle();

r2 = new Rectangle(0, 0, 100, 200);

In p rim ul caz Rectangle() e ste un ap e l c atre constructorul c lase i Rectanglecare e ste resp onsab il cu initializarea ob ie c tului cu v alorile im p lic ite . D up acum ob serv am ın al d oilea caz , initializarea se p oate fac e si cu anum iti p ara-m e tri, cu cond itia sa e x iste un constructor al c lase i re sp e c tiv e care sa ac c e p tep aram etrii re sp e c tiv i.

Fie care c lasa are un set d e constructori care se ocup a cu initializareob ie c te lor nou create . D e e x e m p lu, c lasa Rectangle are urm atorii construc -tori:

public Rectangle()

public Rectangle(int latime, int inaltime)

public Rectangle(int x, int y, int latime, int inaltime)

public Rectangle(Point origine)

public Rectangle(Point origine, int latime, int inaltime)

public Rectangle(Point origine, Dimension dimensiune)

D e c lararea, instantie rea si initializarea ob ie c tului p ot ap area p e ac e easilinie (cazul c e l m ai uzual):

Rectangle patrat = new Rectangle(0, 0, 100, 100);

O b iecte anonim eE ste p osib ila si c rearea unor ob ie c te anonim e care serv e sc d oar p entru

initializarea altor ob ie c te , caz ın care e tap a d e d e c larare a re fe rinte i ob ie c tuluinu m ai este p re z enta:

Rectangle patrat = new Rectangle(new Point(0,0),

new Dimension(100, 100));

Page 38: Cristian Frasinaru-Curs Practic de Java.pdf

2 .1 . CICL UL D E V IAT A AL UNUI O B IE CT 37

S patiul de m em orie nu este pre-alocatD e c lararea unui ob ie c t nu im p lic a sub nic i o form a alocarea d e sp atiu

d e m e m orie p entru ace l ob ie c t. A locarea m e m orie i se fac e d oar la ap e lulop eratorului new.

Rectangle patrat;

patrat.x = 10;

//Eroare - lipseste instantierea

2 .1.2 F olosirea ob iectelor

Od ata un ob ie c t c reat, e l p oate fi folosit ın urm atoare le sensuri: afl area unorinform atii d e sp re ob ie c t, sch im b area starii sale sau ex e cutarea unor ac tiuni.A c e ste lucruri se realiz eaza p rin afl area sau sch im b area v alorilor v ariab ile lorsale , re sp e c tiv p rin ap e larea m etod e lor sale .

R e fe rirea v alorii une i v ariab ile se fac e p rin ob iect.variab ila D e e x e m -p lu c lasa Rectangle are v ariab ile le p ub lic e x, y, width, height, origin.A fl area v alorilor ac estor v ariab ile sau sch im b area lor se fac e p rin construc tiid e g enul:

Rectangle patrat = new Rectangle(0, 0, 100, 200);

System.out.println(patrat.width); //afiseaza 100

patrat.x = 10;

patrat.y = 20; //schimba originea

patrat.origin = new Point(10, 20); //schimba originea

A c c e sul la v ariab ile le unui ob ie c t se fac e ın conform itate cu d re p turile d eac c e s p e care le ofe ra v ariab ile le re sp e c tiv e c e lorlalte c lase . (v e z i ” M od ifica-tori d e ac c e s p entru m e m b rii une i c lase ” )

A p e lul une i m e tod e se fac e p rin ob iect.m etoda([param etri]).

Rectangle patrat = new Rectangle(0, 0, 100, 200);

patrat.setLocation(10, 20); //schimba originea

patrat.setSize(200, 300); //schimba dimensiunea

S e ob serv a c a v alorile v ariab ile lor p ot fi m od ificate ind ire c t p rin inter-m e d iul m e tod e lor sale . P rog ram area orientata ob ie c t d e scurajeaz a folosiread ire c ta a v ariab ile lor unui ob ie c t d eoare c e ac esta p oate fi ad us ın stari in-consistente (ireale). In sch im b , p entru fiecare v ariab ila care d e sc rie starea

Page 39: Cristian Frasinaru-Curs Practic de Java.pdf

38 CAPIT O L UL 2 . O B IE CT E SI CL ASE

ob ie c tului tre b uie sa e x iste m e tod e care sa p e rm ita sch im b area/ afl area v al-orilor v ariab ile lor sale . A c e stea se num esc m etod e d e a ccesa re , sau m etod esetter - getter si au num e le d e form a setV a ria bila , re sp e c tiv getV a ria bila .

patrat.width = -100; //stare inconsistenta

patrat.setSize(-100, -200); //metoda setter

//metoda setSize poate sa testeze daca noile valori sunt

//corecte si sa valideze sau nu schimbarea lor

2 .1.3 D istrug erea ob iectelor

M ulte lim b aje d e p rog ram are im p un ca p rog ram atorul sa tina e v id enta ob ie c te lorcreate si sa le d istrug a ın m od e x p lic it atunc i c and nu m ai este ne v oie d e e le ,cu alte cuv inte sa ad m inistre z e sing ur m e m oria ocup ata d e ob ie c te le sale .P ractica a d e m onstrat c a ac easta te h nic a e ste una d in p rinc ip ale le furnizoared e e rori c e d uc la func tionarea d e fe c tuoasa a p rog ram e lor.

In J av a p rog ram atorul nu m ai are resp onsab ilitatea d istrug erii ob ie c te lorsale ıntruc at, ın m om entul rularii unui p rog ram , sim ultan cu interp re torulJ av a, ruleaz a si un p roc es care se ocup a cu d istrug erea ob ie c te lor care num ai sunt folosite . A c e st p roc es p us la d isp oz itie d e p latform a J av a d e lucruse num e ste g arb ag e collector (cole c tor d e g unoi), p re scurtat g c.

U n ob ie c t e ste e lim inat d in m e m orie d e p roc esul d e cole c tare atunc i c andnu m ai e x ista nic i o re fe rinta la ac esta. R e fe rinte le (care sunt d e fap t v ari-ab ile ) sunt d istruse d oua m od uri:

• n a tu ra l, atunc i c and v ariab ila resp e c tiv a ie se d in d om eniul sau d e v iz -ib ilitate , d e e x e m p lu la term inarea m etod e i ın care ea a fost d e c larata;

• exp licit, d ac a atrib uim v ariab ile i re sp e c tiv e v aloare null.

Cum functioneaz a colectorul de g unoaie ?

Cole ctorul d e g unoaie e ste un p roc es d e p rioritate scazuta care se e x e -cuta p e riod ic , scaneaz a d inam ic m e m oria ocup ata d e p rog ram ul J av a afl atın e x e cutie si m arch eaz a ac e le ob ie c te care au re fe rinte d ire c te sau ind ire c te .D up a c e toate ob ie c te le au fost p arcurse , c e le care au ram as ne m arcate sunte lim inate autom at d in m e m orie .

Page 40: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 39

A p e lul m e tod e i gc d in c lasa System sug ereaz a m asinii v irtuale J av a sa” d e p una e forturi” ın re cup erarea m e m orie i ocup ate d e ob ie c te care nu m aisunt folosite , fara a forta ınsa p ornirea p roc esului.

F inalizareInainte ca un ob ie c t sa fie e lim inat d in m e m orie , p roc esul g c d a ac e lui

ob ie c t p osib ilitatea ” sa cure te d up a e l” , ap e land m e tod a d e finalizare a ob ie c -tului resp e c tiv . U zual, ın tim p ul finaliz arii un ob ie c t ısi inch id e fisie re le sisock e t-urile folosite , d istrug e re fe rinte le c atre alte ob ie c te (p entru a ussurasarc ina cole c torului d e g unoaie), e tc .

Cod ul p entru finalizarea unui ob ie c t tre b uie sc ris ıntr-o m etod a sp e c ialanum ita finalize a clase i c e d e sc rie ob ie c tul resp e c tiv . (v e z i ” Clasa Ob je c t” )

A tentieN u confund ati m e tod a finaliz e d in J av a cu d estructorii d in C+ + . M e tod a

finaliz e nu are rolul d e a d istrug e ob ie c tul c i e ste ap e lata autom at ınainte d ee lim inarea ob ie c tului resp e c tiv d in m e m orie .

2 .2 Crearea claselor

2 .2 .1 D eclararea claselor

Clase le re p re z inta o m od alitate d e a introd uc e noi tip uri d e d ate ıntr-oap licatie J av a, c ealalta m od alitate fiind p rin interm e d iul interfe te lor. D e c larareaune i c lase resp e c ta urm atorul form at g eneral:

[public][abstract][final]class NumeClasa

[extends NumeSuperclasa]

[implements Interfata1 [, Interfata2 ... ]]

{

// Corpul clasei

}

A sad ar, p rim a p arte a d e c laratie i o ocup a m od ificatorii c lase i. A c e stiasunt:

Page 41: Cristian Frasinaru-Curs Practic de Java.pdf

40 CAPIT O L UL 2 . O B IE CT E SI CL ASE

• pub licIm p lic it, o c lasa p oate fi folosita d oar d e c lase le afl ate ın ac e lasi p a-ch e t(lib rarie ) cu c lasa resp e c tiv a (d ac a nu se sp e c ific a un anum e p a-ch e t, toate c lase le d in d ire c torul curent sunt consid e rate a fi ın ac e lasip ach e t). O clasa d e c larata cu public p oate fi folosita d in oric e altac lasa, ind ife rent d e p ach e tul ın care se g ase ste .

• ab stractD e c lara o c lasa ab stracta (sab lon). O clasa ab stracta nu p oate fiinstantiata, fiind folosita d oar p entru a crea un m od e l com un p entru oserie d e sub c lase . (v e z i ” Clase si m e tod e ab stracte ” )

• fi nalD e c lara c a re sp e c tiv a c lasa nu p oate av ea sub c lase . D e c larare c lase lorfinale are d oua scop uri:

– secu rita te : une le m e tod e p ot aste p ta ca p aram etru un ob ie c t alune i anum ite c lase si nu al une i sub c lase , d ar tip ul e x act al unuiob ie c t nu p oate fi afl at cu e x actitate d e cat ın m om entul e x e cutie i;ın fe lul ac esta nu s-ar m ai p utea realiza ob ie c tiv ul lim b ajului J av aca un p rog ram care a tre cut com p ilarea sa nu m ai fie susc e p tib ild e nic i o eroare .

– p rogra m a re ın sp ririt o rien ta t-o biect: O clasa ” p e rfe c ta” nu tre -b uie sa m ai aib a sub c lase .

D up a num e le c lase i p ute m sp e c ifica, d ac a e ste cazul, fap tul c a re sp e c tiv ac lasa e ste sub c lasa a une i alte c lase cu num e le N u m eS u percla sa sau/ si c aim p le m enteaz a una sau m ai m ulte interfe te , ale c aror num e tre b uie se p aratep rin v irg ula.

2 .2 .2 E x tinderea claselor

S p re d eose b ire d e alte lim b aje d e p rog ram are orientate -ob ie c t, J av a p erm ited oar m ostenirea sim pla, c e ea c e ıneam na c a o c lasa p oate av ea un sing urp arinte (sup erc lasa). E v id ent, o c lasa p oate av ea oric ati m ostenitori (sub -c lase), d e und e re zulta c a m ultim ea tuturor c lase lor d efinite ın J av a p oate fiv azuta ca un arb ore , rad ac ina ac estuia fiind c lasa Object. A sad ar, Objecte ste sing ura c lasa care nu are p arinte , fiind foarte im p ortanta ın m od ul d elucru cu ob ie c te si structuri d e d ate ın J av a.

Page 42: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 41

E x tind erea une i c lase se realiz eaz a folosind cuv antul ch e ie ex tends:

class B extends A {...}

// A este superclasa clasei B

// B este o subclasa a clasei A

O sub c lasa m ostene ste d e la p arinte le sau toate v ariab ile le si m e tod e lecare nu sunt p riv ate .

2 .2 .3 Corpul unei clase

Corp ul une i c lase urm eaz a im e d iat d up a d e c lararea c lase i si e ste cup rins ıntreacolad e . Continutul ac estuia este form at d in:

• D e c lararea si, e v entual, initializarea v ariab ile lor d e instanta si d e c lasa(cunoscute ım p reuna ca va ria bile m em bre).

• D e c lararea si im p le m entarea constructorilor.

• D e c lararea si im p le m entarea m etod e lor d e instanta si d e c lasa (cunos-cute ım p reuna ca m etod e m em bre).

• D e c lararea unor c lase im b ricate (interne).

S p re d eose b ire d e C+ + , nu este p e rm isa d oar d e c lararea m e tod e i ın corp ulc lase i, urm and ca im p le m entare sa fie facuta ın afara e i. Im p le m entaream etod e lor une i c lase tre b uie sa se fac a ob lig atoriu ın corp ul c lase i.

// C++

class A {

void metoda1();

int metoda2() {

// Implementare

}

}

A::metoda1() {

// Implementare

}

Page 43: Cristian Frasinaru-Curs Practic de Java.pdf

42 CAPIT O L UL 2 . O B IE CT E SI CL ASE

// Java

class A {

void metoda1(){

// Implementare

}

void metoda2(){

// Implementare

}

}

V ariab ile le une i c lase p ot av ea ac e lasi num e cu m etod e le c lase i, care p oatefi ch iar num e le c lase i, fara a e x ista p osib ilitatea ap aritie i v reune i am b ig uitatid in p unctul d e v e d e re al com p ilatorului. A c e st lucru este ınsa total nere -com and at d ac a ne g and im d in p e rsp e c tiv a liz ib ilitatii (c laritatii) cod ului,d ov e d ind un stil inefic ient d e p rog am are .

class A {

int A;

void A() {};

// Corect pentru compilator

// Nerecomandat ca stil de programare

}

A tentieV ariab ile le si m e tod e le nu p ot av ea ca num e un cuv ant ch e ie J av a.

2 .2 .4 Constructorii unei clase

Constructorii une i c lase sunt m etod e sp e c iale care au ace lasi num e cu c e lal c lase i, nu returneaz a nic i o v aloare si sunt folositi p entru initializareaob ie c te lor ac e le i c lase ın m om entul instantie rii lor.

class NumeClasa {

[modificatori] NumeClasa([argumente]) {

// Constructor

Page 44: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 43

}

}

O clasa p oate av ea unul sau m ai m ulti constructori care tre b uie ınsa sad ife re p rin lista d e arg um ente p rim ite . In fe lul ac esta sunt p erm ise d iv e rsetip uri d e initializ ari ale ob ie c te lor la crearea lor, ın func tie d e num arul p ara-m e trilor cu care este ap e lat constructorul.

S a consid e ram ca e x e m p lu d e c lararea une i c lase care d e sc rie notiunea d ed re p tung h i si tre i p osib ili constructori p entru aceasta c lasa.

class Dreptunghi {

double x, y, w, h;

Dreptunghi(double x1, double y1, double w1, double h1) {

// Cel mai general constructor

x=x1; y=y1; w=w1; h=h1;

System.out.println("Instantiere dreptunghi");

}

Dreptunghi(double w1, double h1) {

// Constructor cu doua argumente

x=0; y=0; w=w1; h=h1;

System.out.println("Instantiere dreptunghi");

}

Dreptunghi() {

// Constructor fara argumente

x=0; y=0; w=0; h=0;

System.out.println("Instantiere dreptunghi");

}

}

Constructorii sunt ap e lati autom at la instantie rea unui ob ie c t. In cazulın care d orim sa ap e lam e x p lic it constructorul une i c lase folosim e x p re sia

this( argumente ),

care ap e leaz a constructorul coresp unz ator (ca arg um ente) al c lase i re sp e c -tiv e . A c easta m e tod a e ste folosita atunc i c and sunt im p le m entati m ai m ulticonstructori p entru o clasa, p entru a nu re p e ta se c v ente le d e cod scrise d e jala constructorii cu m ai m ulte arg um ente (m ai g enerali). M ai efic ient, fara

Page 45: Cristian Frasinaru-Curs Practic de Java.pdf

44 CAPIT O L UL 2 . O B IE CT E SI CL ASE

a re p e ta ac e leasi se c v ente d e cod ın toti constructorii (cum ar fi afisaream esajului ” Instantie re d re p tung h i” ), c lasa d e m ai sus p oate fi rescrisa astfe l:

class Dreptunghi {

double x, y, w, h;

Dreptunghi(double x1, double y1, double w1, double h1) {

// Implementam doar constructorul cel mai general

x=x1; y=y1; w=w1; h=h1;

System.out.println("Instantiere dreptunghi");

}

Dreptunghi(double w1, double h1) {

this(0, 0, w1, h1);

// Apelam constructorul cu 4 argumente

}

Dreptunghi() {

this(0, 0);

// Apelam constructorul cu 2 argumente

}

}

D intr-o sub c lasa p ute m ap e la e x p lic it constructorii sup erc lase i cu e x p resia

super( argumente ).

S a p re sup unem c a d orim sa c re am c lasa Patrat, d e riv ata d in c lasa Dreptunghi:

class Patrat extends Dreptunghi {

Patrat(double x, double y, double d) {

super(x, y, d, d);

// Apelam constructorul superclasei

}

}

A tentieA p e lul e x p lc it al unui constructor nu p oate ap area d e c at ıntr-un alt con-

structor si tre b uie sa fie p rim a instruc tiune d in constructorul resp e c tiv .

Page 46: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 45

Constructorul im plicitConstructorii sunt ap e lati autom at la instantie rea unui ob ie c t. In cazul

ın care scrie m o c lasa care nu are d e c larat nic i un constructor, siste m ul ıic re eaz a autom at un constructor im p lic it, care nu p rim e ste nic i un arg um entsi care nu fac e nim ic . D e c i p re z enta constructorilor ın corp ul une i c lase nueste ob lig atorie . D ac a ınsa sc rie m un constructor p entru o clasa, care are m aim ult d e un arg um ent, atunc i constructorul im p lic it (fara nic i un arg um ent)nu v a m ai fi furnizat im p lic it d e c atre siste m . S a consid e ram , ca e x e m p lu,urm atoare le d e c laratii d e c lase :

class Dreptunghi {

double x, y, w, h;

// Nici un constructor

}

class Cerc {

double x, y, r;

// Constructor cu 3 argumente

Cerc(double x, double y, double r) { ... };

}

S a consid e ram acum d oua instantie ri ale c lase lor d e m ai sus:

Dreptunghi d = new Dreptunghi();

// Corect (a fost generat constructorul implicit)

Cerc c;

c = new Cerc();

// Eroare la compilare !

c = new Cerc(0, 0, 100);

// Varianta corecta

In cazul m ostenirii une i c lase , instantie rea unui ob ie c t d in c lasa e x tinsaim p lic a instantie rea unui ob ie c t d in c lasa p arinte . D in ac est m otiv , fie careconstructor al c lase i fiu v a tre b ui sa aib a un constructor cu ac e easi sig naturaın p arinte sau sa ap e le z e e x p lic it un constructor al c lase i e x tinse folosinde x p resia super([argumente]), ın caz contrar fiind se m nalata o eroare lacom p ilare .

Page 47: Cristian Frasinaru-Curs Practic de Java.pdf

46 CAPIT O L UL 2 . O B IE CT E SI CL ASE

class A {

int x=1;

A(int x) { this.x = x;}

}

class B extends A {

// Corect

B() {super(2);}

B(int x) {super.x = x;}

}

class C extends A {

// Eroare la compilare !

C() {super.x = 2;}

C(int x) {super.x = x;}

}

Constructorii une i c lase p ot av ea urm atorii m od ificatori d e ac c e s:public, protected, private si c e l im p lic it.

• pub licIn oric e alta c lasa se p ot crea instante ale c lase i re sp e c tiv e .

• protectedD oar ın sub c lase p ot fi create ob ie c te d e tip ul c lase i re sp e c tiv e .

• privateIn nic i o alta c lasa nu se p ot instantia ob ie c te ale ac este i c lase . O ast-fe l d e c lasa p oate contine m e tod e p ub lic e (num ite ” factory m e th od s” )care sa fie resp onsab ile cu crearea ob ie c te lor, controland ın fe lul ac estad iv e rse asp e c te le g ate d e instantie rea c lase i re sp e c tiv e .

• im plicitD oar ın c lase le d in ac e lasi p ach e t se p ot crea instante ale c lase i re sp e c -tiv e .

2 .2 .5 D eclararea variab ilelor

V ariab ile le m e m b re ale une i c lase se d e c lara d e ob ic e i ınaintea m etod e lor,d e si ac e st lucru nu este im p us d e c atre com p ilator.

Page 48: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 47

class NumeClasa {

// Declararea variabilelor

// Declararea metodelor

}

V ariab ile le m e m b re ale une i c lase se d e c lara ın corp ul c lase i si nu ın corp ulune i m e tod e , fiind v iz ib ile ın toate m e tod e le resp e c tiv e i c lase . V ariab ile led e c larate ın cad rul une i m e tod e sunt locale m e tod e i re sp e c tiv e .

D e c lararea une i v ariab ile p re sup une sp e c ificarea urm atoare lor lucruri:

• num e le v ariab ile i

• tip ul d e d ate al ac este ia

• niv e lul d e ac c e s la ac ea v ariab ila d in alte c lase

• d ac a e ste constanta sau nu

• d ac a e ste v ariab ila d e instanta sau d e c lasa

• alti m od ificatori

G eneric , o v ariab ila se d e c lara astfe l:

[modificatori] Tip numeVariabila [ = valoareInitiala ];

und e un m od ificator p oate fi :

• un m od ificator d e ac c e s : public, protected, private (v e z i ” M od -ificatori d e ac c e s p entru m e m b rii une i c lase ” )

• unul d in cuv inte le re z e rv ate : static, final, transient, volatile

E x e m p le d e d e c laratii d e v ariab ile m e m b re :

class Exemplu {

double x;

protected static int n;

public String s = "abcd";

private Point p = new Point(10, 10);

final static long MAX = 100000L;

}

Page 49: Cristian Frasinaru-Curs Practic de Java.pdf

48 CAPIT O L UL 2 . O B IE CT E SI CL ASE

S a analiz am m od ificatorii care p ot fi sp e c ificati p entru o v ariab ila, altiid e c at c e i d e ac c e s care sunt tratati ıntr-o se c tiune se p arata: ” S p e c ificatorid e ac c e s p entru m e m b rii une i c lase ” .

• staticP re z enta lui d e c lara c a o v ariab ila e ste v ariab ila d e c lasa si nu d einstanta. (v e z i ” M e m b ri d e instanta si m e m b ri d e c lasa” )

int variabilaInstanta ;

static int variabilaClasa;

• fi nalInd ic a fap tul c a v aloarea v ariab ile i nu m ai p oate fi sch im b ata, cu altecuv inte este folosit p entru d e c lararea constante lor.

final double PI = 3.14 ;

...

PI = 3.141; // Eroare la compilare !

P rin conv entie , num e le v ariab ile lor finale se scriu cu lite re m ari. Folosirealui final ad uc e o fl e x ib ilitate sp orita ın lucrul cu constante , ın sensulc a v aloarea une i v ariab ile nu tre b uie sp e c ificata neap arat la d e c larareae i (ca ın e x e m p lul d e m ai sus), c i p oate fi sp e c ificata si ulterior ıntr-unconstructor, d up a care ea nu va m ai p utea fi m od ificata.

class Test {

final int MAX;

Test() {

MAX = 100; // Corect

MAX = 200; // Eroare la compilare !

}

}

• transientE ste folosit la serializarea ob ie c te lor, p entru a sp e c ifica c e v ariab ilem e m b re ale unui ob ie c t nu p artic ip a la serializare . (v e z i ” S e rializareaob ie c te lor” )

Page 50: Cristian Frasinaru-Curs Practic de Java.pdf

2 .2 . CRE ARE A CL ASE L O R 49

• volatileE ste folosit p entru a se m nala com p ilatorului sa nu ex e cute anum iteop tim iz ari asup ra m e m b rilor une i c lase . E ste o fac ilitate av ansata alim b ajului J av a.

2 .2 .6 th is si super

S unt v ariab ile p re d efinite care fac re fe rinta, ın cad rul unui ob ie c t, la ob ie c tulp rop riu-z is (this), re sp e c tiv la instanta p arinte lui (super). S unt folositeın g eneral p entru a re zolv a confl ic te d e num e p rin re fe rirea e x p lic ita a une iv ariab ile sau m etod e m e m b re . D up a cum am v azut, utilizate sub form a d em e tod e au rolul d e a ap e la constructorii coresp unz atori ca arg um ente ai c lase icurente , re sp e c tiv ai sup erc lase i

class A {

int x;

A() {

this(0);

}

A(int x) {

this.x = x;

}

void metoda() {

x ++;

}

}

class B extends A {

B() {

this(0);

}

B(int x) {

super(x);

System.out.println(x);

}

void metoda() {

super.metoda();

Page 51: Cristian Frasinaru-Curs Practic de Java.pdf

50 CAPIT O L UL 2 . O B IE CT E SI CL ASE

System.out.println(x);

}

}

2 .3 Im plem entarea m etodelor

2 .3 .1 D eclararea m etodelor

M e tod e le sunt resp onsab ile cu d escrie rea com p ortam entului unui ob ie c t. In-truc at J av a este un lim b aj d e p rog ram are com p le t orientat-ob ie c t, m e tod e lese p ot g asi d oar ın cad rul c lase lor. G eneric , o m e tod a se d e c lara astfe l:

[modificatori] TipReturnat numeMetoda ( [argumente] )

[throws TipExceptie1, TipExceptie2, ...]

{

// Corpul metodei

}

und e un m od ificator p oate fi :

• un sp e c ificator d e ac c e s : public, protected, private (v e z i ” S p e c -ificatori d e ac c e s p entru m e m b rii une i c lase ” )

• unul d in cuv inte le re z e rv ate : static, abstract, final, native,

synchronized

S a analiz am m od ificatorii care p ot fi sp e c ificati p entru o m etod a, altiid e c at c e i d e ac c e s care sunt tratati ıntr-o se c tiune se p arata.

• staticP re z enta lui d e c lara c a o m e tod a e ste d e c lasa si nu d e instanta. (v e z i” M e m b ri d e instanta si m e m b ri d e c lasa” )

void metodaInstanta();

static void metodaClasa();

• ab stractP e rm ite d e c lararea m etod e lor ab stracte . O m etod a ab stracta e ste om etod a care nu are im p le m entare si tre b uie ob lig atoriu sa fac a p arted intr-o c lasa ab stracta. (v e z i ” Clase si m e tod e ab stracte ” )

Page 52: Cristian Frasinaru-Curs Practic de Java.pdf

2 .3 . IM PL E M E NT ARE A M E T O D E L O R 51

• fi nalS p e c ific a fap tul c a ac ea m etod a nu m ai p oate fi sup rad efinita ın sub -c lase le c lase i ın care ea este d efinita ca fiind finala. A c e st lucru esteutil d ac a re sp e c tiv a m e tod a are o im p le m entare care nu tre b uie sch im -b ata sub nic i o form a ın sub c lase le e i, fiind critic a p entru consistentastarii unui ob ie c t. D e e x e m p lu, stud entilor une i univ e rsitati tre b uie sali se calcule z e m e d ia finala, ın func tie d e note le ob tinute la e x am ene ,ın ac e easi m aniera, ind ife rent d e facultatea la care sunt.

class Student {

...

final float calcMedie(float note[], float ponderi[]) {

...

}

...

}

class StudentInformatica extends Student {

float calcMedie(float note[], float ponderi[]) {

return 10.00;

}

}// Eroare la compilare !

• nativeIn cazul ın care av e m o lib rarie im p ortanta d e func tii sc rise ın alt lim b ajd e p rog ram are , cum ar fi C, C+ + si lim b ajul d e asam b lare , ac esteap ot fi re folosite d in p rog ram e le J av a. T e h nolog ia care p e rm ite ac estlucru se num e ste J N I (J a va N a tive In terfa ce) si p e rm ite asoc ie rea d intrem e tod e J av a d e c larate cu native si m e tod e nativ e sc rise ın lim b aje led e p rog ram are m entionate .

• sy nch ronizedE ste folosit ın cazul ın care se lucreaz a cu m ai m ulte fire d e e x e cutie iarm e tod a resp e c tiv a g e stioneaz a re surse com une . A re ca e fe c t construireaunui m onitor care nu p erm ite e x e cutarea m e tod e i, la un m om ent d at,d e c at unui sing ur fir d e e x e cutie . (v e z i ” Fire d e e x e cutie ” )

Page 53: Cristian Frasinaru-Curs Practic de Java.pdf

52 CAPIT O L UL 2 . O B IE CT E SI CL ASE

2 .3 .2 T ipul returnat de o m etoda

M e tod e le p ot sau nu sa re turnez e o v aloare la term inarea lor. T ip ul re turnatp oate fi atat un tip p rim itiv d e d ate sau o re fe rinta la un ob ie c t al une i c lase .In cazul ın care o m etod a nu returneaz a nim ic atunc i tre b uie ob lig atoriusp e c ificat cuv antul ch e ie void ca tip re turnat:

public void afisareRezultat() {

System.out.println("rezultat");

}

private void deseneaza(Shape s) {

...

return;

}

D ac a o m e tod a tre b uie sa re turnez e o v aloare ac est lucru se realiz eaz a p rininterm e d iul instruc tiunii return, care tre b uie sa ap ara ın toate situatiile d ete rm inare a func tie i.

double radical(double x) {

if (x >= 0)

return Math.sqrt(x);

else {

System.out.println("Argument negativ !");

// Eroare la compilare

// Lipseste return pe aceasta ramura

}

}

In cazul ın care ın d e c laratia func tie i tip ul returnat este un tip p rim itiv d ed ate , v aloarea returnata la term inarea func tie i tre b uie sa aib a ob lig atoriu ac e ltip sau un sub tip al sau, altfe l v a fi furnizata o eroare la com p ilare . In g eneral,oric e atrib uire care im p lic a p ie rd e ri d e d ate este tratata d e com p ilator caeroare .

int metoda() {

return 1.2; // Eroare

}

int metoda() {

Page 54: Cristian Frasinaru-Curs Practic de Java.pdf

2 .3 . IM PL E M E NT ARE A M E T O D E L O R 53

return (int)1.2; // Corect

}

double metoda() {

return (float)1; // Corect

}

D ac a v aloarea returnata e ste o re fe rinta la un ob ie c t al une i c lase , atunc ic lasa ob ie c tului returnat tre b uie sa coinc id a sau sa fie o sub c lasa a c lase isp e c ificate la d e c lararea m etod e i. D e e x e m p lu, fie c lasa Poligon si sub c lasaac este ia Patrat.

Poligon metoda1( ) {

Poligon p = new Poligon();

Patrat t = new Patrat();

if (...)

return p; // Corect

else

return t; // Corect

}

Patrat metoda2( ) {

Poligon p = new Poligon();

Patrat t = new Patrat();

if (...)

return p; // Eroare

else

return t; // Corect

}

2 .3 .3 T rim iterea param etrilor catre o m etoda

S ig natura une i m e tod e e ste d ata d e num arul si tip ul arg um ente lor p rim ited e ac ea m e tod a. T ip ul d e d ate al unui arg um ent p oate fi oric e tip v alid allim b ajului J av a, atat tip p rim itiv c at si tip re fe rinta.

TipReturnat metoda([Tip1 arg1, Tip2 arg2, ...])

E x e m p lu:

Page 55: Cristian Frasinaru-Curs Practic de Java.pdf

54 CAPIT O L UL 2 . O B IE CT E SI CL ASE

void adaugarePersoana(String nume, int varsta, float salariu)

// String este tip referinta

// int si float sunt tipuri primitive

S p re d eose b ire d e alte lim b aje , ın J av a nu p ot fi trim ise ca p aram etri aiune i m e tod e re fe rinte la alte m e tod e (func tii), ınsa p ot fi trim ise re fe rinte laob ie c te care sa contina im p le m entarea ac e lor m e tod e , p entru a fi ap e late .P ana la ap aritia v e rsiunii 1.5, ın J av a o m etod a nu p utea p rim i un num arv ariab il d e arg um ente , c e ea c e ınseam na c a ap e lul une i m e tod e tre b uia sa sefac a cu sp e c ificarea e x acta a num arului si tip urilor arg um ente lor. V om anal-iza ıntr-o se c tiune se p arata m od alitate d e sp e c ificare a unui num ar v ariab ild e arg um ente p entru o m etod a.N um e le arg um ente lor p rim ite tre b uie sa d ife re ıntre e le si nu tre b uie sa co-inc id a cu num e le nic i une ia d in v ariab ile le locale ale m e tod e i. P ot ınsa sacoinc id a cu num e le v ariab ile lor m e m b re ale c lase i, caz ın care d ife rentie read intre e le se v a fac e p rin interm e d iul v ariab ile this.

class Cerc {

int x, y, raza;

public Cerc(int x, int y, int raza) {

this.x = x;

this.y = y;

this.raza = raza;

}

}

In J av a arg um ente le sunt trim ise doar prin valoare (p ass-b y -v alue).A c e st lucru ınseam na c a m e tod a re c e p tioneaz a d oar v alorile v ariab ile lor p rim -ite ca p aram etri.Cand arg um entul are tip p rim itiv d e d ate , m e tod a nu-i p oate sch im b a v al-oarea d e c at local (ın cad rul m e tod e i); la re v enirea d in m e tod a v ariab ila areac e easi v aloare ca ınaintea ap e lului, m od ific arile facute ın cad rul m e tod e i fi-ind p ie rd ute .Cand arg um entul este d e tip re fe rinta, m e tod a nu p oate sch im b a v aloareare fe rinte i ob ie c tului, ınsa p oate ap e la m etod e le ac e lui ob ie c t si p oate m od ificaoric e v ariab ila m e m b ra ac c e sib ila.

A sad ar, d ac a d orim ca o m etod a sa sch im b e starea (v aloarea) unui arg u-m ent p rim it, atunc i e l tre b uie sa fie neap arat d e tip re fe rinta.

Page 56: Cristian Frasinaru-Curs Practic de Java.pdf

2 .3 . IM PL E M E NT ARE A M E T O D E L O R 55

D e e x e m p lu, sa consid e ram c lasa Cerc d e sc risa anterior ın care d orim saim p le m entam o m e tod a care sa re turne z e p aram etrii c e rcului.

// Varianta incorecta:

class Cerc {

private int x, y, raza;

public void aflaParametri(int valx, int valy, int valr) {

// Metoda nu are efectul dorit!

valx = x;

valy = y;

valr = raza;

}

}

A c easta m e tod a nu v a realiza lucrul p rop us ıntruc at ea p rim e ste d oarv alorile v ariab ile lor valx, valy si valr si nu re fe rinte la e le (ad rese le lord e m e m orie ), astfe l ınc at sa le p oata m od ifica v alorile . In concluz ie , m e tod anu realiz eaz a nim ic p entru c a nu p oate sch im b a v alorile v ariab ile lor p rim iteca arg um ente .

P entru a re zolv a lucrul p rop us tre b uie sa d efinim o c lasa sup lim entaracare sa d e sc rie p aram etrii p e care d orim sa-i afl am :

// Varianta corecta

class Param {

public int x, y, raza;

}

class Cerc {

private int x, y, raza;

public void aflaParametri(Param param) {

param.x = x;

param.y = y;

param.raza = raza;

}

}

A rg um entul param are tip re fe rinta si, d e si nu ıi sch im b am v aloarea (v al-oarea sa este ad resa d e m e m orie la care se g ase ste si nu p oate fi sch im b ata),

Page 57: Cristian Frasinaru-Curs Practic de Java.pdf

56 CAPIT O L UL 2 . O B IE CT E SI CL ASE

p ute m sch im b a starea ob ie c tului, ad ic a inform atia p rop riu-z isa continuta d eac esta.

V arianta d e m ai sus a fost d ata p entru a clarifica m od ul d e trim ite re aarg um ente lor une i m e tod e . P entru a afl a ınsa v alorile v ariab ile lor care d e sc riustarea unui ob ie c t se folosesc m e tod e d e tip getter ınsotite d e m e tod e settercare sa p e rm ita sch im b area starii ob ie c tului:

class Cerc {

private int x, y, raza;

public int getX() {

return x;

}

public void setX(int x) {

this.x = x;

}

...

}

2 .3 .4 M etode cu num ar variab il de arg um ente

Inc e p and cu v ersiunea 1.5 a lim b ajului J av a, e x ista p osib ilitate d e a d e c laram etod e care sa p rim easc a un num ar v ariab il d e arg um ente . N outatea constaın folosirea sim b olului ..., sintax a une i astfe l d e m e tod e fiind :

[modificatori] TipReturnat metoda(TipArgumente ... args)

ar g s re p re z inta un v e c tor av and tip ul sp e c ificat si instantiat cu un num arv ariab il d e arg um ente , ın func tie d e ap e lul m e tod e i. T ip ul arg um ente lorp oate fi re fe rinta sau p rim itiv . M e tod a d e m ai jos afiseaz a arg um ente le p rim -ite , care p ot fi d e oric e tip :

void metoda(Object ... args) {

for(int i=0; i<args.length; i++)

System.out.println(args[i]);

}

...

metoda("Hello");

metoda("Hello", "Java", 1.5);

Page 58: Cristian Frasinaru-Curs Practic de Java.pdf

2 .3 . IM PL E M E NT ARE A M E T O D E L O R 57

2 .3 .5 S upraıncarcarea si supradefi nirea m etodelor

S up raınc arcarea si sup rad efinirea m etod e lor sunt d oua conce p te e x tre m d eutile ale p rog ram arii orientate ob ie c t, cunoscute si sub d enum irea d e po lim o r-fi sm , si se re fe ra la:

• su p ra ın ca rca rea (o verloa d in g) : ın cad rul une i c lase p ot e x ista m etod ecu ac e lasi num e cu cond itia ca sig naturile lor sa fie d ife rite (lista d earg um ente p rim ite sa d ife re fie p rin num arul arg um ente lor, fie p rintip ul lor) astfe l ınc at la ap e lul func tie i cu ac e l num e sa se p oata stab iliın m od unic care d intre e le se e x e cuta.

• su p ra d efi n irea (o verrid in g): o sub c lasa p oate rescrie o m e tod a a c la-se i p arinte p rin im p le m entarea une i m e tod e cu ac e lasi num e si ac e easisig natura ca ale sup erc lase i.

class A {

void metoda() {

System.out.println("A: metoda fara parametru");

}

// Supraincarcare

void metoda(int arg) {

System.out.println("A: metoda cu un parametru");

}

}

class B extends A {

// Supradefinire

void metoda() {

System.out.println("B: metoda fara parametru");

}

}

O m etod a sup rad efinita p oate sa:

• ig nore com p le t cod ul m e tod e i coresp unz atoare d in sup erc lasa (cazuld e m ai sus):

B b = new B();

b.metoda();

// Afiseaza "B: metoda fara parametru"

Page 59: Cristian Frasinaru-Curs Practic de Java.pdf

58 CAPIT O L UL 2 . O B IE CT E SI CL ASE

• ex tinda cod ul m e tod e i p arinte , e x e cutand ınainte d e cod ul p rop riu sifunc tia p arinte lui:

class B extends A {

// Supradefinire prin extensie

void metoda() {

super.metoda();

System.out.println("B: metoda fara parametru");

}

}

. . .

B b = new B();

b.metoda();

/* Afiseaza ambele mesaje:

"A: metoda fara parametru"

"B: metoda fara parametru" */

O m etod a nu p oate sup rad efini o m etod a d e c larata finala ın c lasa p arinte .

Oric e c lasa care nu este ab stracta tre b uie ob lig atoriu sa sup rad efineasc am e tod e le ab stracte ale sup erc lase i (d ac a e ste cazul). In cazul ın care o c lasanu sup rad efine ste toate m e tod e le ab stracte ale p arinte lui, ea ınsasi e ste ab -stracta si v a tre b ui d e c larata ca atare .

In J av a nu este p osib ila sup raınc arcarea op eratorilor.

2 .4 M odifi catori de acces

M od ificatorii d e ac c e s sunt cuv inte re z e rv ate c e controleaz a ac c e sul c e lor-late c lase la m e m b rii une i c lase . S p e c ificatorii d e ac c e s p entru v ariab ile lesi m e tod e le une i c lase sunt: pub lic, protected, private si c e l im p lic it (laniv e l d e p ach e t), iar niv e lul lor d e ac c e s e ste d at ın tab e lul d e m ai jos:

S p e c ificator Clasa S ub lasa P ach e t Oriund eprivate Xprotected X X* Xpublic X X X Xim p lic it X X

Page 60: Cristian Frasinaru-Curs Practic de Java.pdf

2 .5 . M E M B RI D E INST ANT A SI M E M B RI D E CL ASA 59

A sad ar, d ac a nu este sp e c ificat nic i un m od ificator d e ac c e s, im p lic itniv e lul d e ac c e s este la niv e lul p ach e tului. In cazul ın care d e c laram unm e m b ru ” p rote c te d ” atunc i ac c e sul la ac e l m e m b ru este p e rm is d in sub c lase lec lase i ın care a fost d e c larat d ar d e p ind e si d e p ach e tul ın care se g ase stesub c lasa: d ac a sunt ın ac e lasi p ach e t ac c e sul este p e rm is, d ac a nu sunt ınac e lasi p ach e t ac c e sul nu este p e rm is d e c at p entru ob ie c te d e tip ul sub c lase i.

E x e m p le d e d e c laratii:

private int secretPersonal;

protected String secretDeFamilie;

public Vector pentruToti;

long doarIntrePrieteni;

private void metodaInterna();

public String informatii();

2 .5 M em b ri de instanta si m em b ri de clasa

O clasa J av a p oate contine d oua tip uri d e v ariab ile si m e tod e :

• d e in sta n ta : d e c larate fara m od ificatorul static, sp e c ific e fie c are iinstante c reate d intr-o c lasa si

• d e cla sa : d e c larate cu m od ificatorul static, sp e c ific e c lase i.

2 .5 .1 V ariab ile de instanta si de clasa

Cand d e c laram o v ariab ila m e m b ra fara m od ificatorul static, cum ar fi x ıne x e m p lul d e m ai jos:

class Exemplu {

int x ; //variabila de instanta

}

se d e c lara d e fap t o v ariab ila d e instanta, c e ea c e ınseam na c a la fie care c rearea unui ob ie c t al c lase i Exemplu siste m ul aloc a o zona d e m e m orie se p aratap entru m e m orarea v alorii lui x .

Exemplu o1 = new Exemplu();

o1.x = 100;

Page 61: Cristian Frasinaru-Curs Practic de Java.pdf

60 CAPIT O L UL 2 . O B IE CT E SI CL ASE

Exemplu o2 = new Exemplu();

o2.x = 200;

System.out.println(o1.x); // Afiseaza 100

System.out.println(o2.x); // Afiseaza 200

A sad ar, fie care ob ie c t nou creat v a p utea m e m ora v alori d ife rite p entruv ariab ile le sale d e instanta.

P entru v ariab ile le d e c lasa (static e ) siste m ul aloc a o sing ura zona d e m e m -orie la care au acc e s toate instante le c lase i re sp e c tiv e , c e ea c e ınseam na c ad ac a un ob ie c t m od ific a v aloarea une i v ariab ile static e ea se v a m od ifica sip entru toate c e le lalte ob ie c te . D eoare c e nu d e p ind d e o anum ita instanta aune i c lase , v ariab ile le static e p ot fi re fe rite si sub form a:

NumeClasa.numeVariabilaStatica

class Exemplu {

int x ; // Variabila de instanta

static long n; // Variabila de clasa

}

. . .

Exemplu o1 = new Exemplu();

Exemplu o2 = new Exemplu();

o1.n = 100;

System.out.println(o2.n); // Afiseaza 100

o2.n = 200;

System.out.println(o1.n); // Afiseaza 200

System.out.println(Exemplu.n); // Afiseaza 200

// o1.n, o2.n si Exemplu.n sunt referinte la aceeasi valoare

Initializarea v ariab ile lor d e c lasa se fac e o sing ura d ata, la ınc arcarea ınm e m orie a c lase i re sp e c tiv e , si e ste realizata p rin atrib uiri ob isnuite :

class Exemplu {

static final double PI = 3.14;

static long nrInstante = 0;

static Point p = new Point(0,0);

}

Page 62: Cristian Frasinaru-Curs Practic de Java.pdf

2 .5 . M E M B RI D E INST ANT A SI M E M B RI D E CL ASA 61

2 .5 .2 M etode de instanta si de clasa

S im ilar ca la v ariab ile , m e tod e le d e c larate fara m od ificatorul static suntm etod e d e instanta iar c e le d e c larate cu static sunt m etod e d e c lasa (stat-ic e ). D ife renta ıntre c e le d oua tip uri d e m e tod e e ste urm atoarea:

• m e tod e le d e instanta op e reaz a atat p e v ariab ile le d e instanta c at si p ec e le static e ale c lase i;

• m e tod e le d e c lasa op e reaz a d oar p e v ariab ile le static e ale c lase i.

class Exemplu {

int x ; // Variabila de instanta

static long n; // Variabila de clasa

void metodaDeInstanta() {

n ++; // Corect

x --; // Corect

}

static void metodaStatica() {

n ++; // Corect

x --; // Eroare la compilare !

}

}

Intoc m ai ca si la v ariab ile le static e , ıntruc at m e tod e le d e c lasa nu d e p indd e starea ob ie c te lor c lase i re sp e c tiv e , ap e lul lor se p oate fac e si sub form a:

NumeClasa.numeMetodaStatica

Exemplu.metodaStatica(); // Corect, echivalent cu

Exemplu obj = new Exemplu();

obj.metodaStatica(); // Corect, de asemenea

M e tod e le d e instanta nu p ot fi ap e late d e c at p entru un ob ie c t al c lase ire sp e c tiv e :

Exemplu.metodaDeInstanta(); // Eroare la compilare !

Exemplu obj = new Exemplu();

obj.metodaDeInstanta(); // Corect

Page 63: Cristian Frasinaru-Curs Practic de Java.pdf

62 CAPIT O L UL 2 . O B IE CT E SI CL ASE

2 .5 .3 U tilitatea m em b rilor de clasa

M e m b rii d e c lasa sunt folositi p entru a p une la d isp oz itie v alori si m e tod eind e p end ente d e starea ob ie c te lor d intr-o anum ita c lasa.

D eclararea efi cienta a constantelorS a consid e ram situatia c and d orim sa d e c laram o constanta.

class Exemplu {

final double PI = 3.14;

// Variabila finala de instanta

}

L a fie care instantie re a c lase i Exemplu v a fi re z e rv ata o zona d e m e m oriep entru v ariab ile le finale ale ob ie c tului resp e c tiv , c e ea c e e ste o risip a ıntruc atac este constante au ace leasi v alori p entru toate instante le c lase i. D e c larareacore c ta a constante lor tre b uie asad ar facuta cu m od ificatorii static si final,p entru a le re z e rv a o sing ura zona d e m e m orie , com una tuturor ob ie c te lor:

class Exemplu {

static final double PI = 3.14;

// Variabila finala de clasa

}

N um ararea ob iectelor unei claseN um ararea ob ie c te lor une i c lase p oate fi facuta e x tre m d e sim p lu folosind

o v ariab ila static a si e ste utila ın situatiile c and tre b uie sa controlam d iv e rsip aram etri le g ati d e c rearea ob ie c te lor une i c lase .

class Exemplu {

static long nrInstante = 0;

Exemplu() {

// Constructorul este apelat la fiecare instantiere

nrInstante ++;

}

}

Page 64: Cristian Frasinaru-Curs Practic de Java.pdf

2 .5 . M E M B RI D E INST ANT A SI M E M B RI D E CL ASA 63

Im plem entarea functiilor g lob aleS p re d eose b ire d e lim b aje le d e p rog ram are p roc e d urale , ın J av a nu p ute m

av ea func tii g lob ale d efinite ca atare , ıntruc at ” oric e e ste un ob ie c t” . D inac est m otiv ch iar si m e tod e le care au o func tionalitate g lob ala tre b uie im -p le m entate ın cad rul unor c lase . A c e st lucru se v a fac e p rin interm e d iulm e tod e lor d e c lasa (g lob ale), d eoare c e ac estea nu d e p ind d e starea p artic -ulara a ob ie c te lor d in c lasa resp e c tiv a. D e e x e m p lu, sa consid e ram func tiasqrt care e x trag e rad icalul unui num ar si care se g ase ste ın c lasa Math. D ac anu ar fi fost func tie d e c lasa, ap e lul e i ar fi tre b uit facut astfe l (incore c t, d ealtfe l):

// Incorect !

Math obj = new Math();

double rad = obj.sqrt(121);

c e ea c e ar fi fost e x tre m d e ne p lacut... Fiind ınsa m e tod a static a ea p oate fiap e lata p rin: Math.sqrt(121) .A sad ar, func tiile g lob ale ne c e sare une i ap licatii v or fi g rup ate coresp unz atorın d iv e rse c lase si im p le m entate ca m etod e static e .

2 .5 .4 B locuri statice de initializare

V ariab ile le static e ale une i c lase sunt initializate la un m om ent care p re c e d ep rim a utilizare activ a a c lase i re sp e c tiv e . M om entul e fe c tiv d e p ind e d e im -p le m entarea m asinii v irtuale J av a si p oarta num e le d e in itia liza rea cla sei. P elang a se tarea v alorilor v ariab ile lor static e , ın ac easta e tap a sunt e x e cutate sib locurile static e d e initializare ale c lase i. A c e stea sunt se c v ente d e cod d eform a:

static {

// Bloc static de initializare;

...

}

care se com p orta ca o m etod a static a ap e lata autom at d e c atre m asina v ir-tuala. V ariab ile le re fe rite ıntr-un b loc static d e initializare tre b uie sa fieob lig atoriu d e c lasa sau locale b locului:

public class Test {

// Declaratii de variabile statice

Page 65: Cristian Frasinaru-Curs Practic de Java.pdf

64 CAPIT O L UL 2 . O B IE CT E SI CL ASE

static int x = 0, y, z;

// Bloc static de initializare

static {

System.out.println("Initializam...");

int t=1;

y = 2;

z = x + y + t;

}

Test() {

/* La executia constructorului

variabilele de clasa sunt deja initializate si

toate blocurile statice de initializare au

fost obligatoriu executate in prealabil.

*/

...

}

}

2 .6 Clase im b ricate

2 .6 .1 D efi nirea claselor im b ricate

O cla sa im brica ta e ste , p rin d efinitie , o c lasa m e m b ra a une i alte c lase , num itasi cla sa d e a co perire . In func tie d e situatie , d efinirea une i c lase interne sep oate fac e fie ca m e m b ru al c lase i d e acop e rire - caz ın care este ac c e sib ilatuturor m etod e lor, fie local ın cad rul une i m e tod e .

class ClasaDeAcoperire{

class ClasaImbricata1 {

// Clasa membru

}

void metoda() {

class ClasaImbricata2 {

// Clasa locala metodei

}

}

Page 66: Cristian Frasinaru-Curs Practic de Java.pdf

2 .6 . CL ASE IM B RICAT E 65

}

Folosirea c lase lor im b ricate se fac e atunc i c and o c lasa are ne v oie ın im -p le m entarea e i d e o alta c lasa si nu e x ista nic i un m otiv p entru care ac eastad in urm a sa fie d e c larata d e sine statatoare (nu m ai e ste folosita nic aie ri).

O clasa im b ricata are un p riv ile g iu sp e c ial fata d e c e le lalte c lase si anum eac c e s nerestric tionat la toate v ariab ile le c lase i d e acop e rire , ch iar d ac a ac es-tea sunt p riv ate . O clasa d e c larata locala une i m e tod e v a av ea ac c es si lav ariab ile le fi nale d e c larate ın m e tod a resp e c tiv a.

class ClasaDeAcoperire{

private int x=1;

class ClasaImbricata1 {

int a=x;

}

void metoda() {

final int y=2;

int z=3;

class ClasaImbricata2 {

int b=x;

int c=y;

int d=z; // Incorect

}

}

}

O clasa im b ricata m e m b ra (care nu este locala une i m e tod e ) p oate fire fe rita d in e x te riorul c lase i d e acop e rire folosind e x p re sia

ClasaDeAcoperire.ClasaImbricata

A sad ar, c lase le m e m b ru p ot fi d e c larate cu m od ificatorii public, protected,

private p entru a controla niv e lul lor d e ac c e s d in e x te rior, ıntoc m ai ca oric ev ariab ila sau m etod a m e b ra a c lase i. P entru c lase le im b ricate locale une im e tod e nu sunt p erm isi ac e sti m od ificatori.

T oate c lase le im b ricate p ot fi d e c larate folosind m od ificatorii abstract sifinal, se m nificatia lor fiind ac e easi ca si ın cazul c lase lor ob isnuite .

Page 67: Cristian Frasinaru-Curs Practic de Java.pdf

66 CAPIT O L UL 2 . O B IE CT E SI CL ASE

2 .6 .2 Clase interne

S p re d eose b ire d e c lase le ob isnuite , o c lasa im b ricata p oate fi d e c larata static asau nu. O clasa im b ricata nestatic a se num e ste cla sa in tern a .

class ClasaDeAcoperire{

...

class ClasaInterna {

...

}

static class ClasaImbricataStatica {

...

}

}

D ife rentie rea ac estor d enum iri se fac e d eoare c e :

• o ” c lasa im b ricata” re fl e c ta re latia sintactic a a d oua c lase : cod ul une ic lase ap are ın interiorul cod ului alte i c lase ;

• o ” c lasa interna” re fl e c ta re latia d intre instante le a d oua c lase , ın sensulc a o instanta a une i c lase interne nu p oate e x ista d e cat ın cad rul une iinstante a c lase i d e acop erire .

In g eneral, c e le m ai folosite c lase im b ricate sunt c e le interne .A sad ar, o c lasa interna e ste o c lasa im b ricata ale care i instante nu p ot

e x ista d e c at ın cad rul instante lor c lase i d e acop erire si care are ac c e s d ire c tla toti m e m b rii c lase i sale d e acop erire .

2 .6 .3 Identifi care claselor im b ricate

D up a cum stim oric e c lasa p rod uc e la com p ilare asa num ite le ” unitati d e com -p ilare ” , care sunt fisie re av and num e le c lase i re sp e c tiv e si e x tensia .class

si care contin toate inform atiile d e sp re c lasa resp e c tiv a. P entru c lase le im -b ricate ac este unitati d e com p ilare sunt d enum ite astfe l: num e le c lase i d eacop erire , urm at d e sim b olul ’$ ’ ap oi d e num e le c lase i im b ricate .

class ClasaDeAcoperire{

class ClasaInterna1 {}

class ClasaInterna2 {}

}

Page 68: Cristian Frasinaru-Curs Practic de Java.pdf

2 .7 . CL ASE SI M E T O D E AB ST RACT E 67

P entru e x e m p lul d e m ai sus v or fi g enerate tre i fisie re :

ClasaDeAcoperire.class

ClasaDeAcoperire$ClasaInterna1.class

ClasaDeAcoperire$ClasaInterna2.class

In cazul ın care c lase le im b ricate au la rand ul lor alte c lase im b ricate(situatie m ai p utin uzuala) d enum irea lor se fac e d up a ac e easi re g ula: ad aug areaunui ’$ ’ si ap oi num e le c lase i im b ricate .

2 .6 .4 Clase anonim e

E x ista p osib ilitatea d efinirii unor c lase im b ricate locale , fara num e , utilizated oar p entru instantie rea unui ob ie c t d e un anum it tip . A stfe l d e c lase senum esc cla se a n o n im e si sunt foarte utile ın situatii cum ar fi crearea unorob ie c te c e im p le m enteaz a o anum ita interfata sau ex tind o anum ita c lasaab stracta.

E x e m p le d e folosire a c lase lor anonim e v or fi d ate ın cap itolul ” Interfe te ” ,p re cum si e x tensiv ın cap itolul ” Interfata g rafic a cu utilizatorul” .

Fisie re le re zultate ın urm a com p ilarii c lase lor anonim e v or av ea num e led e form a ClasaAcoperire.$1,..., ClasaAcoperire.$n, und e n e ste num aruld e c lase anonim e d efinite ın c lasa resp e c tiv a d e acop erire .

2 .7 Clase si m etode ab stracte

U neori ın p roie c tarea une i ap licatii e ste ne c esar sa re p re z entam cu ajutorulc lase lor conce p te ab stracte care sa nu p oata fi instantiate si care sa foloseasc ad oar la d e z v oltarea ulterioara a unor c lase c e d e sc riu ob ie c te concrete . D e e x -e m p lu, ın p ach e tul java.lang e x ista c lasa ab stracta Number care m od e leaz aconc e p tul g eneric d e ” num ar” . Intr-un p rog ram nu av e m ınsa ne v oie d e nu-m e re g eneric e c i d e num ere d e un anum it tip : ıntre g i, reale , e tc . Clasa Numberserv e ste ca sup erc lasa p entru c lase le concrete Byte, Double, Float, Integer,Long si Short, c e im p le m enteaz a ob ie c te p entru d escrie rea num ere lor d e unanum it tip . A sad ar, c lasa Number re p re z inta un conce p t ab stract si nu v omp utea instantia ob ie c te d e ac est tip - v om folosi ın sch im b sub c lase le sale .

Number numar = new Number(); // Eroare

Integer intreg = new Integer(10); // Corect

Page 69: Cristian Frasinaru-Curs Practic de Java.pdf

68 CAPIT O L UL 2 . O B IE CT E SI CL ASE

2 .7 .1 D eclararea unei clase ab stracte

D e c lararea une i c lase ab stracte se fac e folosind cuv antul re z e rv at abstract:

[public] abstract class ClasaAbstracta

[extends Superclasa]

[implements Interfata1, Interfata2, ...] {

// Declaratii uzuale

// Declaratii de metode abstracte

}

O clasa ab stracta p oate av ea m od ificatorul public, ac c e sul im p lic it fiindla niv e l d e p ach e t, d ar nu p oate sp e c ifica m od ificatorul final, com b inatiaabstract final fiind se m nalata ca eroare la com p ilare - d e altfe l, o c lasad e c larata astfe l nu ar av ea nic i o utilitate .

O clasa ab stracta p oate contine ac e leasi e le m ente m e m b re ca o c lasaob isnuita, la care se ad aug a d e c laratii d e m e tod e ab stracte - fara nic i o im -p le m entare .

2 .7 .2 M etode ab stracte

S p re d eose b ire d e c lase le ob isnuite care tre b uie sa furniz e z e im p le m entarip entru toate m e tod e le d e c larate , o c lasa ab stracta p oate contine m e tod e faranic i o im p le m entare . M e tod e le fara nic i o im p le m entare se num esc m etod ea bstra cte si p ot ap area d oar ın c lase ab stracte . In fata une i m e tod e ab stractetre b uie sa ap ara ob lig atoriu cuv antul ch e ie abstract, altfe l v a fi furnizata oeroare d e com p ilare .

abstract class ClasaAbstracta {

abstract void metodaAbstracta(); // Corect

void metoda(); // Eroare

}

In fe lul ac esta, o c lasa ab stracta p oate p une la d isp oz itia sub c lase lor saleun m od e l com p le t p e care tre b uie sa-l im p le m ente z e , furniz and ch iar im p le -m entarea unor m etod e com une tuturor c lase lor si lasand e x p lic itarea altora

Page 70: Cristian Frasinaru-Curs Practic de Java.pdf

2 .7 . CL ASE SI M E T O D E AB ST RACT E 69

fiec are i sub c lase ın p arte .U n e x e m p lu e loc v ent d e folosire a c lase lor si m e tod e lor ab stracte e ste d e -sc rie rea ob ie c te lor g rafice ıntr-o m aniera orientata-ob ie c t.

• Ob ie c te g rafice : linii, d re p tung h iuri, c e rcuri, curb e B e z ie r, e tc

• S tari com une : p oz itia(orig inea), d im ensiunea, culoarea, e tc

• Com p ortam ent: m utare , re d im ensionare , d e senare , colorare , e tc .

P entru a folosi starile si com p ortam ente le com une ac estor ob ie c te ın av an-tajul nostru p ute m d e c lara o c lasa g eneric a GraphicObject care sa fie su-p e rc lasa p entru c e le lalte c lase . M e tod e le ab stracte v or fi folosite p entru im -p le m entarea com p ortam entului sp e c ific fie c arui ob ie c t, cum ar fi d esenareaiar c e le ob isnuite p entru com p ortam entul com un tuturor, cum ar fi sch im -b area orig inii. Im p le m entarea c lase i ab stracte GraphicObject ar p utea arataastfe l:

abstract class GraphicObject {

// Stari comune

private int x, y;

private Color color = Color.black;

...

// Metode comune

public void setX(int x) {

this.x = x;

}

public void setY(int y) {

this.y = y;

}

public void setColor(Color color) {

this.color = color;

}

...

// Metode abstracte

abstract void draw();

...

}

Page 71: Cristian Frasinaru-Curs Practic de Java.pdf

70 CAPIT O L UL 2 . O B IE CT E SI CL ASE

O sub c lasa care nu este ab stracta a une i c lase ab stracte tre b uie sa furniz e z eob lig atoriu im p le m entari ale m e tod e lor ab stracte d efinite ın sup erc lasa. Im -p le m entarea c lase lor p entru ob ie c te g rafice ar fi:

class Circle extends GraphicObject {

void draw() {

// Obligatoriu implementarea

...

}

}

class Rectangle extends GraphicObject {

void draw() {

// Obligatoriu implementarea

...

}

}

L e g at d e m e tod e le ab stracte , m ai tre b uie m entionate urm atoare le :

• O clasa ab stracta p oate sa nu aib a nic i o m e tod a ab stracta.

• O m etod a ab stracta nu p oate ap area d e c at ıntr-o c lasa ab stracta.

• Oric e c lasa care are o m e tod a ab stracta tre b uie d e c larata ca fiind ab -stracta.

In A P I-ul oferit d e p latform a d e lucru J av a sunt num eroase e x e m p le d eie rarh ii care folosesc la niv e le le sup erioare c lase ab stracte . D intre c e le m aiim p ortante am intim :

• Number: sup erc lasa ab stracta a tip urilor re fe rinta num eric e

• Reader, Writer: sup erc lase le ab stracte ale fl ux urilor d e intrare / ie sirep e caractere

• InputStream, OutputStream: sup erc lase le ab stracte ale fl ux urilor d eintrare / ie sire p e octe ti

• AbstractList, AbstractSet, AbstractMap: sup erc lase ab stracte p en-tru structuri d e d ate d e tip cole c tie

Page 72: Cristian Frasinaru-Curs Practic de Java.pdf

2 .8 . CL ASA O B J E CT 71

• Component : sup erc lasa ab stracta a com p onente lor folosite ın d e z -v oltarea d e ap licatii cu interfata g rafic a cu utilizatorul (G U I), cum arfi Frame, Button, Label, e tc .

• e tc .

2 .8 Clasa O b ject

2 .8 .1 O rice clasa are o superclasa

D up a cum am v azut ın se c tiunea d e d icata m od alitatii d e c reare a une i c lase ,c lauza ” e x tend s” sp e c ific a fap tul c a ac ea c lasa e x tind e (m ostene ste ) o altac lasa, num ita sup erc lasa. O clasa p oate av ea o sing ura sup erc lasa (J av a nusup orta m ostenirea m ultip la) si ch iar d ac a nu sp e c ific am c lauza ” e x tend s” lacrearea une i c lase ea totusi v a av ea o sup erc lasa. Cu alte cuv inte , ın J av aoric e c lasa are o sup erc lasa si num ai una. E v id ent, tre b uie sa e x iste o e x c e p tied e la ac easta re g ula si anum e c lasa care re p re z inta rad ac ina ie rarh ie i form atad e re latiile d e m ostenire d intre c lase . A c easta este c lasa O b ject.

Clasa Object e ste si sup erc lasa im p lic ita a c lase lor care nu sp e c ific a oanum ita sup erc lasa. D e c laratiile d e m ai jos sunt e ch iv alente :

class Exemplu {}

class Exemplu extends Object {}

2 .8 .2 Clasa O b ject

Clasa Object e ste c ea m ai g enerala d intre c lase , oric e ob ie c t fiind , d ire c tsau ind ire c t, d e sc end ent al ac este i c lase . Fiind p arinte le tuturor, Object

d efine ste si im p le m enteaz a com p ortam entul com un al tuturor c e lorlalte c laseJ av a, cum ar fi:

• p osib ilitatea testarii e g alitatii v alorilor ob ie c te lor,

• sp e c ificarea une i re p re z entari ca sir d e caractere a unui ob ie c t ,

• returnarea c lase i d in care fac e p arte un ob ie c t,

• notificarea altor ob ie c te c a o v ariab ila d e cond itie s-a sch im b at, e tc .

Page 73: Cristian Frasinaru-Curs Practic de Java.pdf

72 CAPIT O L UL 2 . O B IE CT E SI CL ASE

Fiind sub c lasa a lui Object, oric e c lasa ıi p oate sup rad efini m e tod e lecare nu sunt finale . M e tod e le c e l m ai uzual sup rad efinite sunt: clone,equals/hashCode, finalize, toString.

• cloneA c easta m e tod a e ste folosita p entru d up licarea ob ie c te lor (crearea unorc lone). Clonarea unui ob ie c t p resup une crearea unui nou ob ie c t d eac e lasi tip si care sa aib a ac e easi stare (ac e leasi v alori p entru v ariab ile lesale).

• eq uals, h ash CodeA c e stea sunt, d e ob ic e i, sup rad efinite ım p reuna. In m etod a equals e stesc ris cod ul p entru com p ararea e g alitatii continutului a d oua ob ie c te .Im p lic it (im p le m entarea d in c lasa Object), ac easta m e tod a com p arare fe rinte le ob ie c te lor. U zual este re d efinita p entru a testa d ac a starileob ie c te lor coinc id sau d ac a d oar o p arte d in v ariab ile le lor coinc id .

M e tod a hashCode returneaza un cod ıntre g p entru fiecare ob ie c t, p en-tru a testa consistenta ob ie c te lor: ac e lasi ob ie c t tre b uie sa re turnez eac e lasi cod p e d urata e x e cutie i p rog ram ului.D ac a d oua ob ie c te sunt e g ale conform m e tod e i equals, atunc i ap e lulm e tod e i hashCode p entru fiecare d in c e le d oua ob ie c te ar tre b ui sare turnez e ac e lasi intre g .

• fi nalizeIn ac easta m e tod a se sc rie cod ul care ” curata d up a un ob ie c t” ınainte d ea fi elim inat d in m e m orie d e cole c torul d e g unoaie . (v e z i ” D istrug ereaob ie c te lor” )

• toS tringE ste folosita p entru a returna o re p re z entare ca sir d e caractere a unuiob ie c t. E ste utila p entru concatenarea sirurilor cu d iv e rse ob ie c te ınv e d e rea afisarii, fiind ap e lata autom at atunc i c and este ne c esara trans-form area unui ob ie c t ın sir d e caractere .

Exemplu obj = new Exemplu();

System.out.println("Obiect=" + obj);

//echivalent cu

System.out.println("Obiect=" + obj.toString());

Page 74: Cristian Frasinaru-Curs Practic de Java.pdf

2 .8 . CL ASA O B J E CT 73

S a consid e ram urm atorul e x e m p lu, ın care im p le m entam p artial c lasanum ere lor com p le x e , si ın care v om sup rad efini m e tod e ale c lase i Object.D e ase m enea, v om scrie un m ic p rog ram TestComplex ın care v om testam etod e le c lase i d efinite .

L isting 2.1: Clasa num ere lor com p le x e

class Complex {

private double a; // partea reala

private double b; // partea imaginara

public Complex(double a, double b) {

this.a = a;

this.b = b;

}

public Complex () {

this(1, 0);

}

public boolean equals(Object obj) {

if (obj == null) return false;

if (!( obj instanceof Complex)) return false;

Complex comp = (Complex) obj;

return ( comp.a==a && comp.b==b);

}

public Object clone () {

return new Complex(a, b);

}

public String toString () {

String semn = (b > 0 ? "+" : "-");

return a + semn + b + "i";

}

public Complex aduna(Complex comp) {

Complex suma = new Complex(0, 0);

suma.a = this.a + comp.a;

suma.b = this.b + comp.b;

return suma;

}

}

Page 75: Cristian Frasinaru-Curs Practic de Java.pdf

74 CAPIT O L UL 2 . O B IE CT E SI CL ASE

public class TestComplex {

public static void main(String c[]) {

Complex c1 = new Complex (1,2);

Complex c2 = new Complex (2,3);

Complex c3 = (Complex) c1.clone();

System.out.println(c1.aduna(c2)); // 3.0 + 5.0i

System.out.println(c1.equals(c2)); // false

System.out.println(c1.equals(c3)); // true

}

}

2 .9 Conversii autom ate ıntre tipuri

D up a cum v azut tip urile J av a d e d ate p ot fi ım p artie ın p rim itive si re ferin ta .P entru fiecare tip p rim itiv e x ista o c lasa coresp unz atoare care p e rm ie lucrulorientat ob ie c t cu tip ul resp e c tiv .

byte Byte

short Short

int Integer

long Long

float Float

double Double

char Character

boolean Boolean

Fie care d in ac este c lase are un constructor c e p e rm ite initializarea unuiob ie c t av and o anum ita v aloare p rim itiv a si m e tod e sp e c ializate p entru con-v ersia unui ob ie c t ın tip ul p rim itiv coresp unz ator, d e g enul tip P rim itivValue:

Integer obi = new Integer(1);

int i = obi.intValue();

Boolean obb = new Boolean(true);

boolean b = obb.booleanValue();

Inc e p and cu v ersiunea 1.5 a lim b ajului J av a, atrib uirile e x p lic ite ıntretip uri p rim itv e si re fe rinta sunt p osib ile , ac est m e canism p urtand num e le d ea u to bo xin g , re sp e c tiv a u to -u n bo xin g . Conv ersia e x p lic ita v a fi facuta d e c atrecom p ilator.

Page 76: Cristian Frasinaru-Curs Practic de Java.pdf

2 .1 0 . T IPUL D E D AT E E NUM E RARE 75

// Doar de la versiunea 1.5 !

Integer obi = 1;

int i = obi;

Boolean obb = true;

boolean b = obb;

2 .10 T ipul de date enum erare

Inc e p and cu v ersiunea 1.5 a lim b ajului J av a, e x ista p osib ilitatea d e a d efinitip uri d e d ate enum erare p rin folosirea cuv antului ch e ie enum . A c e stasolutie sim p lific a m ane v rarea g rup urilor d e constante , d up a cum re ie se d inurm atorul e x e m p lu:

public class CuloriSemafor {

public static final int ROSU = -1;

public static final int GALBEN = 0;

public static final int VERDE = 1;

}

...

// Exemplu de utilizare

if (semafor.culoare = CuloriSemafor.ROSU)

semafor.culoare = CuloriSemafor.GALBEN);

...

Clasa d e m ai sus p oate fi rescrisa astfe l:

public enum CuloriSemafor { ROSU, GALBEN, VERDE };

...

// Utilizarea structurii se face la fel

...

if (semafor.culoare = CuloriSemafor.ROSU)

semafor.culoare = CuloriSemafor.GALBEN);

...

Com p ilatorul este re sp onsab il cu transform area une i astfe l d e structuriıntr-o c lasa coresp unz atoare .

Page 77: Cristian Frasinaru-Curs Practic de Java.pdf

76 CAPIT O L UL 2 . O B IE CT E SI CL ASE

Page 78: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 3

E x ceptii

3 .1 Ce sunt ex ceptiile ?

T e rm enul excep tie e ste o p rescurtare p entru ” e v enim ent e x c e p tional” si p oatefi d efinit ca un ev enim ent c e se p rod uc e ın tim p ul e x e cutie i unui p rog ram sicare p rov oac a ıntrerup erea cursului norm al al e x e cutie i ac estuia.

E x c e p tiile p ot ap area d in d iv e rse cauze si p ot av ea niv e le d ife rite d e g rav -itate : d e la erori fatale cauzate d e e ch ip am entul h ard w are p ana la erori c etin stric t d e cod ul p rog ram ului, cum ar fi acc esarea unui e le m ent d in afarasp atiului alocat unui v e c tor.

In m om entul c and o ase m enea eroare se p rod uc e ın tim p ul e x e cutie i v a fig enerat un ob ie c t d e tip e x c e p tie c e contine :

• inform atii d e sp re e x c e p tia resp e c tiv a;

• starea p rog ram ului ın m om entul p rod uc erii ac e le i e x c e p tii.

public class Exemplu {

public static void main(String args[]) {

int v[] = new int[10];

v[10] = 0; //Exceptie !

System.out.println("Aici nu se mai ajunge...");

}

}

L a rularea p rog ram ului v a fi g enerata o e x c e p tie , p rog ram ul se v a op rila instruc tiunea care a cauzat e x c e p tia si se v a afisa un m esaj d e e roare d eg enul:

77

Page 79: Cristian Frasinaru-Curs Practic de Java.pdf

78 CAPIT O L UL 3 . E X CE PT II

"Exception in thread "main"

java.lang.ArrayIndexOutOfBoundsException :10

at Exceptii.main (Exceptii.java:4)"

Crearea unui ob ie c t d e tip e x c e p tie se num e ste a ru n ca rea u n ei excep tii(” th row ing an ex c e p tion” ). In m om entul ın care o m etod a g enereaz a (arunc a)o e x c e p tie siste m ul d e e x e cutie e ste resp onsab il cu g asirea une i se c v ente d ecod d intr-o m etod a care sa o trate z e . Cautarea se fac e re cursiv , ınc e p and cum etod a care a g enerat e x c e p tia si m e rg and ınap oi p e linia ap e lurilor c atreac ea m etod a.

S e c v enta d e cod d intr-o m etod a care trateaz a o anum ita e x c e p tie senum e ste a n a lizo r d e excep tie (” e x c e p tion h and ler” ) iar interc e p tarea si tratareae i se num e ste p rin d erea excep tiei (” catch th e e x c e p tion” ).Cu alte cuv inte , la ap aritia une i e rori e ste ” aruncata” o e x c e p tie iar c ine v atre b uie sa o ” p rind a” p entru a o trata. D ac a siste m ul nu g ase ste nic i unanalizor p entru o anum ita e x c e p tie , atunc i p rog ram ul J av a se op re ste cu unm esaj d e e roare (ın cazul e x e m p lului d e m ai sus m esajul ” A ic i nu se m aiajung e ...” nu v a fi afisat).

A tentieIn J av a tratarea erorilor nu m ai este o op tiune c i o constrang ere . In

ap roap e toate situatile , o se c v enta d e cod care p oate p rov oca e x c e p tii tre b uiesa sp e c ific e m od alitatea d e tratare a ac estora.

3 .2 ” P rinderea” si tratarea ex ceptiilor

T ratarea e x c e p tiilor se realiz eaz a p rin interm e d iul b locurilor d e instruc tiunitry, catch si finally. O se c v enta d e cod care trateaz a anum ite e x c e p tiitre b uie sa arate astfe l:

try {

// Instructiuni care pot genera exceptii

}

catch (TipExceptie1 variabila) {

// Tratarea exceptiilor de tipul 1

Page 80: Cristian Frasinaru-Curs Practic de Java.pdf

3 .2 . ” PRIND E RE A” SI T RAT ARE A E X CE PT IIL O R 79

}

catch (TipExceptie2 variabila) {

// Tratarea exceptiilor de tipul 2

}

. . .

finally {

// Cod care se executa indiferent

// daca apar sau nu exceptii

}

S a consid e ram urm atorul e x e m p lu: c itirea unui fisie r octet cu octet siafisarea lui p e e c ran. Fara a folosi tratarea e x c e p tiilor m e tod a resp onsab ilacu c itirea fisie rului ar arata astfe l:

public static void citesteFisier(String fis) {

FileReader f = null;

// Deschidem fisierul

System.out.println("Deschidem fisierul " + fis);

f = new FileReader(fis);

// Citim si afisam fisierul caracter cu caracter

int c;

while ( (c=f.read()) != -1)

System.out.print((char)c);

// Inchidem fisierul

System.out.println("\\nInchidem fisierul " + fis);

f.close();

}

A c easta se c v enta d e cod v a furniza erori la com p ilare d eoare c e ın J av atratarea erorilor este ob lig atorie . Folosind m e canism ul e x c e p tiilor m e tod aciteste ısi p oate trata sing ura e rorile care p ot surv eni p e p arcursul e x e cutie isale . M ai jos este cod ul com p lte si core c t al unui p rog ram c e afiseaz a p e e c rancontinutul unui fisie r al c arui num e este p rim it ca arg um ent d e la linia d ecom and a. T ratarea e x c e p tiilor este realizata com p le t ch iar d e c atre m e tod aciteste.

Page 81: Cristian Frasinaru-Curs Practic de Java.pdf

80 CAPIT O L UL 3 . E X CE PT II

L isting 3.1: Citirea unui fisie r - core c t

import java.io.*;

public class CitireFisier {

public static void citesteFisier(String fis) {

FileReader f = null;

try {

// Deschidem fisierul

System.out.println("Deschidem fisierul " + fis);

f = new FileReader(fis);

// Citim si afisam fisierul caracter cu caracter

int c;

while ( (c=f.read()) != -1)

System.out.print ((char)c);

} catch (FileNotFoundException e) {

// Tratam un tip de exceptie

System.err.println("Fisierul nu a fost gasit !");

System.err.println("Exceptie: " + e.getMessage ());

System.exit (1);

} catch (IOException e) {

// Tratam alt tip de exceptie

System.out.println("Eroare la citirea din fisier!");

e.printStackTrace ();

} finally {

if (f != null) {

// Inchidem fisierul

System.out.println("\nInchidem fisierul.");

try {

f.close();

} catch (IOException e) {

System.err.println("Fisierul nu poate fi inchis!");

e.printStackTrace ();

}

}

}

}

public static void main(String args []) {

if (args.length > 0)

citesteFisier(args [0]);

else

Page 82: Cristian Frasinaru-Curs Practic de Java.pdf

3 .2 . ” PRIND E RE A” SI T RAT ARE A E X CE PT IIL O R 81

System.out.println("Lipseste numele fisierului!");

}

}

B locul ” try ” contine instruc tiunile d e d e sch id e re a unui fisie r si d e c itired intr-un fisie r, am b e le p utand p rod uc e e x c e p tii. E x c e p tiile p rov ocate d eac este instruc tiuni sunt tratate ın c e le d oua b locuri ” catch ” , c ate unul p en-tru fiecare tip d e e x c e p tie . Inch id e rea fisie rului se fac e ın b locul ” finally ” ,d eoare c e ac esta este sig ur c a se v a e x e cuta Fara a folosi b locul ” finally ” ,ınch id e rea fisie rului ar fi tre b uit facuta ın fie care situatie ın care fisie rul ar fifost d esch is, c e ea c e ar fi d us la scrie rea d e cod re d und ant.

try {

...

// Totul a decurs bine.

f.close();

}

...

catch (IOException e) {

...

// A aparut o exceptie la citirea din fisier

f.close(); // cod redundant

}

O p rob le m a m ai d e licata care tre b uie se m nalata ın ac easta situatie e stefap tul c a m e tod a close, re sp onsab ila cu ınch id e rea unui fisie r, p oate p rov ocala rand ul sau e x c e p tii, d e e x e m p lu atunc i c and fisie rul m ai e ste folosit si d ealt p roc es si nu p oate fi ınch is. D e c i, p entru a av ea un cod com p le t core c ttre b uie sa tratam si p osib ilitatea ap aritie i une i e x c e p tii la m e tod a close.

A tentie

Ob lig atoriu un b loc d e instruc tiuni ” try ” tre b uie sa fie urm at d e unulsau m ai m ulte b locuri ” catch ” , ın func tie d e e x c e p tiile p rov ocate d e ac e leinstruc tiuni sau (op tional) d e un b loc ” finally ” .

Page 83: Cristian Frasinaru-Curs Practic de Java.pdf

82 CAPIT O L UL 3 . E X CE PT II

3 .3 ” A runcarea” ex ceptiilor

In cazul ın care o m etod a nu ısi asum a re sp onsab ilitatea tratarii une ia saum ai m ultor e x c e p tii p e care le p ot p rov oca anum ite instruc tiuni d in cod ulsau atunc i ea p oate sa ” arunce ” ac este e x c e p tii c atre m e tod e le care o ap e -leaz a, urm and ca ac estea sa im p le m ente z e tratarea lor sau, la rand ul lor, sa” arunce ” m ai d e p arte e x c e p tiile re sp e c tiv e .A c e st lucru se realiz eaz a p rin sp e c ificarea ın d e c laratia m e tod e i a c lauze ithrows:

[modificatori] TipReturnat metoda([argumente])

throws TipExceptie1, TipExceptie2, ...

{

...

}

A tentieO m etod a care nu trateaz a o anum ita e x c e p tie tre b uie ob lig atoriu sa o

” arunce ” .

In e x e m p lul d e m ai sus d ac a nu fac e m tratarea e x c e p tiilor ın cad rulm e tod e i citeste atunc i m e tod a ap e lanta (main) v a tre b ui sa fac a ac est lucru:

L isting 3.2: Citirea unui fisie r

import java.io.*;

public class CitireFisier {

public static void citesteFisier(String fis)

throws FileNotFoundException , IOException {

FileReader f = null;

f = new FileReader(fis);

int c;

while ( (c=f.read()) != -1)

System.out.print ((char)c);

f.close();

}

Page 84: Cristian Frasinaru-Curs Practic de Java.pdf

3 .3 . ” ARUNCARE A” E X CE PT IIL O R 83

public static void main(String args []) {

if (args.length > 0) {

try {

citesteFisier(args [0]);

} catch (FileNotFoundException e) {

System.err.println("Fisierul nu a fost gasit !");

System.err.println("Exceptie: " + e);

} catch (IOException e) {

System.out.println("Eroare la citirea din fisier!");

e.printStackTrace ();

}

} else

System.out.println("Lipseste numele fisierului!");

}

}

Ob serv ati c a, ın ac est caz , nu m ai p ute m d ife rentia e x c e p tiile p rov ocate d ec itirea d in fisie r s d e inch id e rea fisie rului, am b e le fiind d e tip ul IOException.D e ase m enea, inch id e rea fisie rului nu v a m ai fi facuta ın situatia ın careap are o e x c e p tie la c itirea d in fisie r. E ste situatia ın care p ute m folosi b loculfinally fara a folosi nic i un b loc catch:

public static void citesteFisier(String fis)

throws FileNotFoundException, IOException {

FileReader f = null;

try {

f = new FileReader(numeFisier);

int c;

while ( (c=f.read()) != -1)

System.out.print((char)c);

}

finally {

if (f!=null)

f.close();

}

}

Page 85: Cristian Frasinaru-Curs Practic de Java.pdf

84 CAPIT O L UL 3 . E X CE PT II

M e tod a ap e lanta p oate arunca la rand ul sau e x c e p tiile m ai d e p arte c atrem e tod a care a ap e lat-o la rand ul e i. A c easta ınlantuire se te rm ina cu m etod amain care , d ac a v a arunca e x c e p tiile c e p ot ap area ın corp ul e i, v a d e te rm inatrim ite rea e x c e p tiilor c atre m asina v irtuala J av a.

public void metoda3 throws TipExceptie {

...

}

public void metoda2 throws TipExceptie {

metoda3();

}

public void metoda1 throws TipExceptie {

metoda2();

}

public void main throws TipExceptie {

metoda1();

}

T ratarea e x c e p tiilor d e c atre J V M se fac e p rin term inarea p rog ram ului siafisarea inform atiilor d e sp re e x c e p tia care a d e te rm inat ac est lucru. P entrue x e m p lul nostru, m e tod a main ar p utea fi d e c larata astfe l:

public static void main(String args[])

throws FileNotFoundException, IOException {

citeste(args[0]);

}

Intotd eauna tre b uie g asit com p rom isul op tim ıntre tratarea locala a e x c e p tiilorsi aruncarea lor c atre niv e le le sup erioare , astfe l ınc at cod ul sa fie c at m ai c larsi id entificarea locului ın care a ap arut e x c e p tia sa fie c at m ai usor d e facut.

A runcarea une i e x c e p tii se p oate fac e si im p lic it p rin instruc tiunea throw

c e are form atul: throw exceptie, ca ın e x e m p le le d e m ai jos:

throw new IOException("Exceptie I/O");

...

if (index >= vector.length)

throw new ArrayIndexOutOfBoundsException();

...

Page 86: Cristian Frasinaru-Curs Practic de Java.pdf

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R 85

catch(Exception e) {

System.out.println("A aparut o exceptie);

throw e;

}

A c easta instruc tiune este folosita m ai ales la aruncarea e x c e p tiilor p rop rii.(v e z i ” Crearea p rop riilor e x c e p tii” )

3 .4 A vantajele tratarii ex ceptiilor

P rin m od alitatea sa d e tratare a e x c e p tiilor, J av a are urm atoare le av antajefata d e m e canism ul trad itional d e tratare a erorilor:

• S e p ararea cod ului p entru tratarea une i e rori d e cod ul ın care ea p oatesa ap ara.

• P rop ag area une i e rori p ana la un analizor d e e x c e p tii coresp unz ator.

• G rup area erorilor d up a tip ul lor.

3 .4 .1 S epararea codului pentru tratarea erorilor

In p rog ram area trad itionala tratarea erorilor se com b ina cu cod ul c e p oatep rod uc e ap aritia lor p rod uc and asa num itul ” cod sp ag h e tti” . S a consid e ramurm atorul e x e m p lu: o func tie care ıncarc a un fisie r ın m e m orie :

citesteFisier {

deschide fisierul;

determina dimensiunea fisierului;

aloca memorie;

citeste fisierul in memorie;

inchide fisierul;

}

P rob le m e le care p ot ap area la ac easta func tie , ap arent sim p la, sunt d eg enul: ” Ce se ıntam p la d ac a: ... ?”

• fisie rul nu p oate fi d esch is

• nu se p oate d e te rm ina d im ensiunea fisie rului

Page 87: Cristian Frasinaru-Curs Practic de Java.pdf

86 CAPIT O L UL 3 . E X CE PT II

• nu p oate fi alocata sufic ienta m e m orie

• nu se p oate fac e c itirea d in fisie r

• fisie rul nu p oate fi ınch is

U n cod trad itional care sa trate z e ac este e rori ar arata astfe l:

int citesteFisier() {

int codEroare = 0;

deschide fisierul;

if (fisierul s-a deschis) {

determina dimensiunea fisierului;

if (s-a determinat dimensiunea) {

aloca memorie;

if (s-a alocat memorie) {

citeste fisierul in memorie;

if (nu se poate citi din fisier) {

codEroare = -1;

}

} else {

codEroare = -2;

}

} else {

codEroare = -3;

}

inchide fisierul;

if (fisierul nu s-a inchis && codEroare == 0) {

codEroare = -4;

} else {

codEroare = codEroare & -4;

}

} else {

codEroare = -5;

}

return codEroare;

} // Cod "spaghetti"

A c e st stil d e p rog am are e ste e x tre m d e susc e p tib il la erori si ıng reuneaz ae x tre m d e m ult ıntte le g e rea sa. In J av a, folosind m e cansim ul e x c e p tiilor,cod ul ar arata, sch e m atizat, astfe l:

Page 88: Cristian Frasinaru-Curs Practic de Java.pdf

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R 87

int citesteFisier() {

try {

deschide fisierul;

determina dimensiunea fisierului;

aloca memorie;

citeste fisierul in memorie;

inchide fisierul;

}

catch (fisierul nu s-a deschis)

{trateaza eroarea;}

catch (nu s-a determinat dimensiunea)

{trateaza eroarea;}

catch (nu s-a alocat memorie)

{trateaza eroarea}

catch (nu se poate citi din fisier)

{trateaza eroarea;}

catch (nu se poate inchide fisierul)

{trateaza eroarea;}

}

D ife renta d e c laritate este e v id enta.

3 .4 .2 P ropag area erorilor

P rop ag area une i e rori se fac e p ana la un analizor d e e x c e p tii coresp unz ator.S a p re sup unem c a ap e lul la m etod a citesteFisier e ste conse c inta unorap e luri im b ricate d e m e tod e :

int metoda1() {

metoda2();

...

}

int metoda2() {

metoda3;

...

}

int metoda3 {

citesteFisier();

...

Page 89: Cristian Frasinaru-Curs Practic de Java.pdf

88 CAPIT O L UL 3 . E X CE PT II

}

S a p re sup unem d e ase m enea c a d orim sa fac e m tratarea erorilor d oarın metoda1. T rad itional, ac est lucru ar tre b ui facut p rin p rop ag area eroriip rod use d e m e tod a citesteFisier p ana la metoda1:

int metoda1() {

int codEroare = metoda2();

if (codEroare != 0)

//proceseazaEroare;

...

}

int metoda2() {

int codEroare = metoda3();

if (codEroare != 0)

return codEroare;

...

}

int metoda3() {

int codEroare = citesteFisier();

if (codEroare != 0)

return codEroare;

...

}

D up a cum am v azut, J av a p erm ite une i m e tod e sa arunce e x c e p tiileap arute ın cad rul e i la un niv e l sup erior, ad ic a func tiilor care o ap e leaz asau siste m ului. Cu alte cuv inte , o m e tod a p oate sa nu ısi asum e resp onsab il-itatea tratarii e x c e p tiilor ap arute ın cad rul e i:

int metoda1() {

try {

metoda2();

}

catch (TipExceptie e) {

//proceseazaEroare;

}

...

}

Page 90: Cristian Frasinaru-Curs Practic de Java.pdf

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R 89

int metoda2() throws TipExceptie {

metoda3();

...

}

int metoda3() throws TipExceptie {

citesteFisier();

...

}

3 .4 .3 G ruparea erorilor dupa tipul lor

In J av a e x ista c lase coresp unz atoare tuturor e x c e p tiilor care p ot ap area lae x e cutia unui p rog ram . A c e stea sunt g rup ate ın func tie d e sim ilaritatilelor ıntr-o ie rarh ie d e c lase . D e e x e m p lu, c lasa IOException se ocup a cue x c e p tiile c e p ot ap area la op eratii d e intrare / ie sire si d ife rentiaz a la rand ule i alte tip uri d e e x c e p tii, cum ar fi FileNotFoundException, EOFException,e tc .L a rand ul e i, c lasa IOException se ıncad reaz a ıntr-o cate g orie m ai larg a d ee x c e p tii si anum e c lasa Exception.R ad ac ina ac este i ie rarh ii e ste c lasa Throwable (v e z i ” Ie rarh ia c lase lor c e d e -sc riu e x c e p tii” ).

P rond erea une i e x c e p tii se p oate fac e fie la niv e lul c lase i sp e c ific e p en-tru ac ea e x c e p tie , fie la niv e lul une ia d in sup erc lase le sale , ın func tie d ene c e sitatile p rog ram ului, ınsa, cu c at c lasa folosita e ste m ai g eneric a cu atattratarea e x c e p tiilor p rog ram ul ısi p ie rd e d in fl e x ib ilitate .

try {

FileReader f = new FileReader("input.dat");

/* Acest apel poate genera exceptie

de tipul FileNotFoundException

Tratarea ei poate fi facuta in unul

din modurile de mai jos:

*/

}

catch (FileNotFoundException e) {

// Exceptie specifica provocata de absenta

// fisierului ’input.dat’

} // sau

Page 91: Cristian Frasinaru-Curs Practic de Java.pdf

90 CAPIT O L UL 3 . E X CE PT II

catch (IOException e) {

// Exceptie generica provocata de o operatie IO

} // sau

catch (Exception e) {

// Cea mai generica exceptie soft

} //sau

catch (Throwable e) {

// Superclasa exceptiilor

}

3 .5 Ierarh ia claselor ce descriu ex ceptii

R ad ac ina c lase lor c e d e sc riu e x c e p tii e ste c lasa Throwable iar c e le m ai im p or-tante sub c lase ale sale sunt Error, Exception si RuntimeException, caresunt la rand ul lor sup erc lase p entru o serie ıntreag a d e tip uri d e e x c e p tii.

E rorile , ob ie c te d e tip Error, sunt cazuri sp e c iale d e e x c e p tii g enerated e func tionarea anorm ala a e ch ip am entului h ard p e care ruleaz a un p ro-g ram J av a si sunt inv iz ib ile p rog ram atorilor. U n p rog ram J av a nu tre b uie satrate z e ap aritia ac estor erori si e ste im p rob ab il ca o m etod a J av a sa p rov oac ease m enea erori.

Page 92: Cristian Frasinaru-Curs Practic de Java.pdf

3 .6 . E X CE PT II L A E X E CUT IE 91

E x c e p tiile , ob ie c te le d e tip Exception, sunt e x c e p tiile stand ard (soft) caretre b uie tratate d e c atre p rog ram e le J av a. D up a cum am m ai z is tratarea ac es-tor e x c e p tii nu este o op tiune c i o constrang ere . E x c e p tiile care p ot ” sc ap a”netratate d e sc ind d in sub c lasa RuntimeException si se num esc excep tii laexecu tie .

M e tod e le care sunt ap e late uzual p entru un ob ie c t e x c e p tie sunt d efiniteın c lasa Throwable si sunt p ub lic e , astfe l ınc at p ot fi ap e late p entru oric e tipd e e x c e p tie . Cele m ai uzuale sunt:

• getMessage - afiseaz a d e taliul une i e x c e p tii;

• printStackTrace - afiseaz a inform atii com p le te d e sp re e x c e p tie si lo-calizarea e i;

• toString - m e tod a m ostenita d in c lasa Object, care furniz eaz a re p re z entareaca sir d e caractere a e x c e p tie i.

3 .6 E x ceptii la ex ecutie

In g eneral, tratarea e x c e p tiilor este ob lig atorie ın J av a. D e la ac est p rinc ip u sesustrag ınsa asa num ite le excep tii la execu tie sau, cu alte cuv inte , e x c e p tiilecare p rov in stric t d in v ina p rog ram atorului si nu g enerate d e o anum itasituatie e x te rna, cum ar fi lip sa unui fisie r.A c e ste e x c e p tii au o sup erc lasa com una RuntimeException si ın ac esatacate g orie sunt inc luse e x c e p tiile p rov ocate d e :

• op eratii aritm e tic e ile g ale (ım p artirea ıntre g ilor la z ero);ArithmeticException

• acc esarea m e m b rilor unui ob ie c t c e are v aloarea null;NullPointerException

• acc esarea eronata a e le m ente lor unui v e c tor.ArrayIndexOutOfBoundsException

E x c e p tiile la e x e cutie p ot ap area uriund e ın p rog ram si p ot fi e x tre md e num eroare iar ınc ercarea d e ” p rind e re ” a lor ar fi e x tre m d e anev oioasa.D in ac est m otiv , com p ilatorul p e rm ite ca ac este e x c e p tii sa ram ana netratate ,tratarea lor nefiind ınsa ile g ala. R eam intim ınsa c a, ın cazul ap aritie i oric aruitip d e e x c e p tie care nu are un analizor coresp unz ator, p rog ram ul v a fi term i-nat.

Page 93: Cristian Frasinaru-Curs Practic de Java.pdf

92 CAPIT O L UL 3 . E X CE PT II

int v[] = new int[10];

try {

v[10] = 0;

} catch (ArrayIndexOutOfBoundsException e) {

System.out.println("Atentie la indecsi!");

e.printStackTrace();

} // Corect, programul continua

v[11] = 0;

/* Nu apare eroare la compilare

dar apare exceptie la executie si

programul va fi terminat.

*/

System.out.println("Aici nu se mai ajunge...");

Im p artirea la 0 v a g enera o e x c e p tie d oar d ac a tip ul num ere lor ım p artitee ste aritm e tic ıntre g . In cazul tip urilor reale (float si double) nu v a fig enerata nic i o e x c e p tie , c i v a fi furnizat ca re zultat o constanta care p oatefi, func tie d e op e ratie , Infinity, -Infinity, sau Nan.

int a=1, int b=0;

System.out.println(a/b); // Exceptie la executie !

double x=1, y=-1, z=0;

System.out.println(x/z); // Infinity

System.out.println(y/z); // -Infinity

System.out.println(z/z); // NaN

3 .7 Crearea propriilor ex ceptii

A d e seori p oate ap area ne c esitatea cre arii unor e x c e p tii p rop rii p entru a p uneın e v id enta cazuri sp e c iale d e e rori p rov ocate d e m e tod e le c lase lor une i lib rarii,cazuri care nu au fost p re v azute ın ie rarh ia e x c e p tiilor stand ard J av a.O ex c e p tie p rop rie tre b uie sa se ıncad re z e ınsa ın ie rarh ia e x c e p tiilor J av a,cu alte cuv inte c lasa care o im p le m enteaz a tre b uie sa fie sub c lasa a une iad e ja e x istente ın ac easta ie rarh ie , p re fe rab il una ap rop iata ca se m nificatie ,sau sup erc lasa Exception.

Page 94: Cristian Frasinaru-Curs Practic de Java.pdf

3 .7 . CRE ARE A PRO PRIIL O R E X CE PT II 93

public class ExceptieProprie extends Exception {

public ExceptieProprie(String mesaj) {

super(mesaj);

// Apeleaza constructorul superclasei Exception

}

}

S a consid e ram urm atorul e x e m p lu, ın care c re am o c lasa c e d e sc rie p artialo stiv a d e num ere ıntre g i cu op eratiile d e ad aug are a unui e le m ent, resp e c -tiv d e scoatere a e le m entului d in v arful stiv e i. D ac a p re sup unem c a stiv ap oate m e m ora m ax im 100 d e e le m ente , am b e le op eratii p ot p rov oca e x c e p tii.P entru a p ersonaliza ac este e x c e p tii v om c rea o c lasa sp e c ific a d enum itaExceptieStiva:

L isting 3.3: E x c e p tii p rop rii

class ExceptieStiva extends Exception {

public ExceptieStiva(String mesaj) {

super(mesaj);

}

}

class Stiva {

int elemente [] = new int [100];

int n=0; // numarul de elemente din stiva

public void adauga(int x) throws ExceptieStiva {

if (n==100)

throw new ExceptieStiva("Stiva este plina!");

elemente[n++] = x;

}

public int scoate () throws ExceptieStiva {

if (n==0)

throw new ExceptieStiva("Stiva este goala!");

return elemente[n--];

}

}

S e c v enta ch e ie e ste extends Exception care sp e c ific a fap tul c a nouaclasa ExceptieStiva e ste sub c lasa a c lase i Exception si d e c i im p le m enteaz aob ie c te c e re p re z inta e x c e p tii.

Page 95: Cristian Frasinaru-Curs Practic de Java.pdf

94 CAPIT O L UL 3 . E X CE PT II

In g eneral, cod ul ad aug at c lase lor p entru e x c e p tii p rop rii e ste nese m nificativ :unul sau d oi constructori care afiseaza un m esaj d e e roare la ie sirea stand ard .P roc esul d e c reare a une i noi e x c e p tii p oate fi d us m ai d e p arte p rin ad aug areaunor noi m e tod e c lase i c e d e sc rie ac ea e x c e p tie , ınsa ac easta d e z v oltare nuısi are rostul ın m ajoritatea cazurilor. E x c e p tiile p rop rii sunt d escrise uzuald e c lase foarte sim p le , ch iar fara nic i un cod ın e le , cum ar fi:

class ExceptieSimpla extends Exception { }

A c easta c lasa se b az eaz a p e constructorul im p lic it c reat d e com p ilatorınsa nu are constructorul ExceptieSimpla(String s).

Page 96: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 4

Intrari si iesiri

4 .1 Introducere

4 .1.1 Ce sunt fl ux urile?

M ajoritatea ap licatiilor ne c esita c itirea unor inform atii care se g ase sc p eo sursa e x te rna sau trim ite rea unor inform atii c atre o d estinatie e x te rna.Inform atia se p oate g asi oriund e : ıntr-un fisie r p e d isc , ın re tea, ın m e m oriesau ın alt p rog ram si p oate fi d e oric e tip : d ate p rim itiv e , ob ie c te , im ag ini,sunete , e tc . P entru a ad uc e inform atii d intr-un m e d iu e x te rn, un p rog am J av atre b uie sa d e sch id a un ca n a l d e co m u n ica tie (fl u x) d e la sursa inform atiilor(fisie r, m e m orie , sock e t, e tc ) si sa c iteasc a se c v ential inform atiile re sp e c tiv e .

S im ilar, un p rog ram p oate trim ite inform atii c atre o d estinatie e x te rnad e sch iz and un canal d e com unicatie (fl ux ) c atre ac ea d estinatie si sc riindse c v ential inform atiile re sp e c tiv e .

Ind ife rent d e tip ul inform atiilor, c itirea/ scrie rea d e p e / c atre un m e d iue x te rn resp e c ta urm atorul alg oritm :

deschide canal comunicatie

while (mai sunt informatii) {

citeste/scrie informatie;

}

inchide canal comunicatie;

P entru a g eneraliza, atat sursa e x te rna a unor d ate c at si d e stinatia lorsunt v azute ca fiind niste p roc ese care p rod uc , re sp e c tiv consum a inform atii.

95

Page 97: Cristian Frasinaru-Curs Practic de Java.pdf

96 CAPIT O L UL 4 . INT RARI SI IE SIRI

D efi nitii:U n fl u x e ste un canal d e com unicatie unid ire c tional ıntre d oua p roc ese .U n p roc es care d e sc rie o sursa e x te rna d e d ate se num e ste p roces p rod u c a to r.U n p roc es care d e sc rie o d estinatie e x te rna p entru d ate se num e ste p rocesco n su m a to r.U n fl ux care c ite ste d ate se num e ste fl u x d e in tra re .U n fl ux care scrie d ate se num e ste fl u x d e ie sire .

O b servatii:Flux urile sunt canale d e com unicatie se riale p e 8 sau 16 b iti.Flux urile sunt unid ire c tionale , d e la p rod uc ator la consum ator.Fie care fl ux are un sing ur p roc es p rod uc ator si un sing ur p roc es consum ator.Intre d oua p roc ese p ot e x ista oric ate fl ux uri, oric e p roc es p utand fi atat p ro-d ucator c at si consum ator ın ac e lasi tim p , d ar p e fl ux uri d ife rite .Consum atorul si p rod ucatorul nu com unic a d ire c t p rintr-o interfata d e fl uxc i p rin interm e d iul cod ului J av a d e tratare a fl ux urilor.

Clase le si inte fe te le stand ard p entru lucrul cu fl ux uri se g ase sc ın p ach e tuljava.io. D e c i, oric e p rog ram care ne c esita op e ratii d e intrare sau ie sire tre -b uie sa contina instruc tiunea d e im p ort a p ach e tului java.io:

import java.io.*;

4 .1.2 Clasifi carea fl ux urilor

E x ista tre i tip uri d e c lasificare a fl ux urilor:

• D up a d irec tia canalului d e com unicatie d e sch is fl ux urile se ım p art ın:

– fl ux uri d e intrare (p entru c itirea d ate lor)

– fl ux uri d e ie sire (p entru scrie rea d ate lor)

• D up a tip u l d e d a te p e care op ereaz a:

– fl ux uri d e octe ti (com unicarea seriala se realiz eaz a p e 8 b iti)

– fl ux uri d e caractere (com unicarea seriala se realiz eaz a p e 16 b iti)

Page 98: Cristian Frasinaru-Curs Practic de Java.pdf

4 .1 . INT RO D UCE RE 97

• D up a a c tiu n ea lor:

– fl ux uri p rim are d e c itire / sc rie re a d ate lor (se ocup a e fe c tiv cuc itirea/ scrie rea d ate lor)

– fl ux uri p entru p roc esarea d ate lor

4 .1.3 Ierarh ia claselor pentru lucrul cu fl ux uri

Clase le rad ac ina p entru ierarh iile c e re p re z inta fl ux uri d e caractere sunt:

• R eader- p entru fl ux uri d e intrare si

• W riter- p entru fl ux uri d e ie sire .

A c e stea sunt sup erc lase ab stracte p entru toate c lase le c e im p le m enteaz afl ux uri sp e c ializate p entru c itirea/ scrie rea d ate lor p e 16 b iti si v or continem e tod e le com une tuturor.Ca o re g ula g enerala, toate c lase le d in ac este ie rarh ii v or av ea term inatiaReader sau Writer ın func tie d e tip ul lor, cum ar fi ın e x e m p le le : FileReader,BufferedReader, FileWriter, BufferedWriter, e tc . D e ase m enea, se ob -serv a ca o alta re g ula g enerala, fap tul c a unui fl ux d e intrare XReader ıicoresp und e uzual un fl ux d e ie sire XWriter, ınsa ac est lucru nu este ob lig a-toriu.

Clase le rad ac ina p entru ierarh ia fl ux urilor d e octe ti sunt:

• InputS tream - p entru fl ux uri d e intrare si

• O utputS tream - p entru fl ux uri d e ie sire .

A c e stea sunt sup erc lase ab stracte p entru c lase c e im p le m enteaz a fl ux urisp e c ializate p entru c itirea/ scrie rea d ate lor p e 8 b iti. Ca si ın cazul fl ux -urilor p e caractere d enum irile c lase lor v or av ea term inatia sup erc lase i lor:FileInputStream, BufferedInputStream, FileOutputStream,BufferedOutputStream, e tc ., fie c arui fl ux d e intrare XInputStream core -sp unz and u-i uzual un fl ux d e ie sire XOutputStream, fara ca ac est lucru safie ob lig atoriu.

Page 99: Cristian Frasinaru-Curs Practic de Java.pdf

98 CAPIT O L UL 4 . INT RARI SI IE SIRI

P ana la un p unct, e x ista un p arale lism ıntre ie rarh ia c lase lor p entru fl ux -uri d e caractere si c ea p entru fl ux urile p e octe ti. P entru m ajoritatea p ro-g ram e lor este re com and at ca scrie rea si c itirea d ate lor sa se fac a p rin inter-m e d iul fl ux urilor d e caractere , d eoare c e ac estea p erm it m anip ularea carac -tere lor U nicod e ın tim p c e fl ux urile d e octe ti p e rm it d oar lucrul p e 8 b iti -caractere A S CII.

4 .1.4 M etode com une fl ux urilor

S up erc lase le ab stracte Reader si InputStream d efinesc m e tod e sim ilare p en-tru c itirea d ate lor.

Reader InputStream

int read() int read()

int read(char buf[]) int read(byte buf[])

... ...

D e ase m enea, am b e le c lase p un la d isp oz itie m e tod e p entru m arcareaune i locatii ıntr-un fl ux , saltul p este un num ar d e p oz itii, re se tarea p oz itie icurente , e tc . A c e stea sunt ınsa m ai rar folosite si nu v or fi d etaliate .

S up erc lase le ab stracte Writer si OutputStream sunt d e ase m enea p arale le ,d efinind m e tod e sim ilare p entru scrie rea d ate lor:

Reader InputStream

void write(int c) void write(int c)

void write(char buf[]) void write(byte buf[])

void write(String str) -

... ...

Inch id e rea oric arui fl ux se realiz eaz a p rin m etod a close. In cazul ın careac easta nu este ap e lata e x p lic it, fl ux ul v a fi autom at ınch is d e c atre cole c toruld e g unoaie atunc i c and nu v a m ai e x ista nic i o re fe rinta la e l, ınsa ac est lucrutre b uie e v itat d eoare c e , la lucrul cu fl ux rui cu zona tam p on d e m e m orie ,d ate le d in m e m orie v or fi p ie rd ute la ınch id e rea fl ux ului d e c atre gc .

M e tod e le re fe ritoare la fl ux uri p ot g enera e x c e p tii d e tip ul IO E x ceptionsau d eriv ate d in ac easta c lasa, tratarea lor fiind ob lig atorie .

Page 100: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 99

4 .2 F olosirea fl ux urilor

A sa cum am v azut, fl ux urile p ot fi ım p artite ın func tie d e activ itatea lorın fl ux uri care se ocup a e fe c tiv cu c itirea/ scrie rea d ate lor si fl ux uri p entrup roc esarea d ate lor (d e filtrare). In continuare , v om v e d ea care sunt c e le m aiim p ortante c lase d in c e le d oua cate g orii si la c e folosesc ac estea, p re cum sim od alitatile d e c reare si utilizare a fl ux urilor.

4 .2 .1 F lux uri prim itive

Flux urile p rim itiv e sunt resp onsab ile cu c itirea/ scrie rea e fe c tiv a a d ate lor,p unand la d isp oz itie im p le m entari ale m e tod e lor d e b az a read, re sp e c tivwrite, d efinite ın sup erc lase . In func tie d e tip ul surse i d ate lor, e le p ot fiım p artite astfe l:

• F isierFileReader, FileWriterFileInputStream, FileOutputStreamN um ite si fl u xu ri fi sier, ac e stea sunt folosite p entru c itirea d ate lord intr-un fisie r, re sp e c tiv sc rie rea d ate lor ıntr-un fisie r si v or fi analizateıntr-o se c tiune se p arata (v e z i ” Flux uri p entru lucrul cu fisie re ” ).

• M em orieCharArrayReader, CharArrayWriter

ByteArrayInputStream, ByteArrayOutputStreamA c e ste fl ux uri folosesc p entru scrie rea/ c itirea inform atiilor ın/ d in m e m -orie si sunt create p e un v e c tor e x istent d e ja. Cu alte cuv inte , p e rm ittratarea v e c torilor ca sursa/ d e stinatie p entru crearea unor fl ux uri d eintrare / ie sire .

StringReader, StringWriter

P e rm it tratarea sirurilor d e caractere afl ate ın m e m orie ca sursa/ d e stinatiep entru crearea d e fl ux uri.

• P ipePipedReader, PipedWriter

PipedInputStream, PipedOutputStream

Im p le m enteaz a com p onente le d e intrare / ie sire ale une i cond ucte d e

Page 101: Cristian Frasinaru-Curs Practic de Java.pdf

100 CAPIT O L UL 4 . INT RARI SI IE SIRI

d ate (p ip e ). P ip e -urile sunt folosite p entru a canaliza ie sirea unui p ro-g ram sau fir d e e x e cutie c atre intrarea altui p rog ram sau fir d e e x e cutie .

4 .2 .2 F lux uri de procesare

Flux urile d e p roc esare (sau d e filtrare) sunt resp onsab ile cu p re luarea d ate lord e la un fl ux p rim itiv si p roc esarea ac estora p entru a le oferi ıntr-o alta form a,m ai utila d intr-un anum it p unct d e v e d e re . D e e x e m p lu, BufferedReaderp oate p re lua d ate d e la un fl ux FileReader si sa ofe re inform atia d intr-unfisie r linie cu linie . Fiind p rim itiv , FileReader nu p utea c iti d e c at caractercu caracter. U n fl ux d e p roc esare nu p oate fi folosit d e c at ım p reuna cu unfl ux p rim itiv .

Clase le c e d e sc riu ac este fl ux uri p ot fi ım p artite ın func tie d e tip ul d ep roc esare p e care ıl e fe c tueaza astfe l:

• ” B uff erizare”BufferedReader, BufferedWriter

BufferedInputStream, BufferedOutputStream

S unt folosite p entru a introd uc e un b uff er ın p roc esul d e c itire / sc rie rea inform atiilor, re d uc and astfe l num arul d e ac c e sari la d isp oz itiv ul c ere p re z inta sursa/ d estinatia orig inala a d ate lor. S unt m ult m ai efic iented e c at fl ux urile fara b uff er si d in ac est m otiv se re com and a folosirea lorori d e c ate ori e ste p osib il (v e z i ” Citirea si sc rie rea cu zona tam p on” ).

• F iltrareFilterReader, FilterWriter

FilterInputStream, FilterOutputStream

S unt c lase ab stracte c e d efinesc o interfata com una p entru fl ux uri carefiltreaz a autom at d ate le c itite sau scrise (v e z i ” Flux uri p entru filtrare ” ).

• Conversie octeti-caractereInputStreamReader, OutputStreamWriter

Form eaz a o p unte d e le g atura ıntre fl ux urile d e caractere si fl ux uriled e octe ti. U n fl ux InputStreamReader c ite ste octe ti d intr-un fl uxInputStream si ıi conv erte ste la caractere , folosind cod ificarea stan-d ard a caractere lor sau o cod ificare sp e c ificata d e p rog ram . S im ilar,un fl ux OutputStreamWriter conv erte ste caractere ın octe ti si trim itere zutatul c atre un fl ux d e tip ul OutputStream.

Page 102: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 101

• ConcatenareSequenceInputStream

Concateneaz a m ai m ulte fl ux uri d e intrare ıntr-unul sing ur (v e z i ” Con-catenarea fisie re lor” ).

• S erializareObjectInputStream, ObjectOutputStream

S unt folosite p entru serializarea ob ie c te lor (v e z i ” S e rializarea ob ie c te lor” ).

• Conversie tipuri de dateDataInputStream, DataOutputStream

Folosite la scrie rea/ c itirea d ate lor d e tip p rim itiv ıntr-un form at b inar,ind e p end ent d e m asina p e care se lucreaz a (v e z i ” Folosirea c lase lorD ataInp utS tream si D ataOutp utS tream ” ).

• N um arareLineNumberReader

LineNumberInputStream

Ofera si p osib ilitatea d e num arare autom ata a liniilor c itite d e la unfl ux d e intrare .

• Citire ın avansPushbackReader

PushbackInputStream

S unt fl ux uri d e intrare care au un b uff er d e 1-caracter(octe t) ın careeste c itit ın av ans si caracterul (octetul) care urm eaz a c e lui curent c itit.

• A fi sarePrintWriter

PrintStream

Ofera m e tod e conv enab ile p entru afisarea inform atiilor.

4 .2 .3 Crearea unui fl ux

Oric e fl ux este un ob ie c t al c lase i c e im p le m enteaz a fl ux ul resp e c tiv . Creareaunui fl ux se realiz eaz a asad ar sim ilar cu crearea ob ie c te lor, p rin instruc tiuneanew si inv ocarea unui constructor coresp unz ator al c lase i re sp e c tiv e :

E x e m p le :

Page 103: Cristian Frasinaru-Curs Practic de Java.pdf

102 CAPIT O L UL 4 . INT RARI SI IE SIRI

//crearea unui flux de intrare pe caractere

FileReader in = new FileReader("fisier.txt");

//crearea unui flux de iesire pe caractere

FileWriter out = new FileWriter("fisier.txt");

//crearea unui flux de intrare pe octeti

FileInputStream in = new FileInputStream("fisier.dat");

//crearea unui flux de iesire pe octeti

FileOutputStrem out = new FileOutputStream("fisier.dat");

A sad ar, c rearea unui fl ux p rim itiv d e d ate care c ite ste / sc rie inform atii d ela un d isp oz itiv e x te rn are form atul g eneral:

F lux P rim itiv num eF lux = new F lux P rim itiv(dispoz itivE x tern);

Flux urile d e p roc esare nu p ot e x ista d e sine statatoare c i se sup rap un p eun fl ux p rim itiv d e c itire / sc rie re a d ate lor. D in ac est m otiv , constructoriic lase lor p entru fl ux urile d e p roc esare nu p rim e sc ca arg um ent un d isp oz itive x te rn d e m e m orare a d ate lor c i o re fe rinta la un fl ux p rim itiv re sp onsab ilcu c itirea/ scrie rea e fe c tiv a a d ate lor:

Exemple:

//crearea unui flux de intrare printr-un buffer

BufferedReader in = new BufferedReader(

new FileReader("fisier.txt"));

//echivalent cu

FileReader fr = new FileReader("fisier.txt");

BufferedReader in = new BufferedReader(fr);

//crearea unui flux de iesire printr-un buffer

BufferedWriter out = new BufferedWriter(

new FileWriter("fisier.txt")));

//echivalent cu

FileWriter fo = new FileWriter("fisier.txt");

BufferedWriter out = new BufferedWriter(fo);

A sad ar, c rearea unui fl ux p entru p roc esarea d ate lor are form atul g eneral:

Page 104: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 103

F lux P rocesare num eF lux = new F lux P rocesare(fl ux P rim itiv);

In g eneral, fl ux urile p ot fi com p use ın suc c esiuni oric at d e lung i:

DataInputStream in = new DataInputStream(

new BufferedInputStream(

new FileInputStream("fisier.dat")));

4 .2 .4 F lux uri pentru lucrul cu fi siere

Flux urile p entru lucrul cu fisie re sunt c e le m ai usor d e ınte le s, ıntruc atop eratia lor d e b az a e ste c itirea, resp e c tiv sc rie rea unui caracter sau octetd intr-un sau ıntr-un fisie r sp e c ificat uzual p rin num e le sau com p le t sau re lativla d ire c torul curent.

D up a cum am v azut d e ja, c lase le care im p le m enteaz a ac e ste fl ux uri sunturm atoare le :

FileReader, FileWriter - caractere

FileInputStream, FileOutputStream - octeti

Constructorii ac estor c lase ac c e p ta ca arg um ent un ob ie c t care sa sp e c ific eun anum e fisie r. A c e sta p oate fi un sir d e caractere , on ob ie c t d e tip File

sau un ob ie c t d e tip FileDesciptor (v e z i ” Clasa File ” ).Constructorii c lase i FileReader sunt:

public FileReader(String fileName)

throws FileNotFoundException

public FileReader(File file)

throws FileNotFoundException

public FileReader(FileDescriptor fd)

Constructorii c lase i FileWriter:

public FileWriter(String fileName)

throws IOException

public FileWriter(File file)

throws IOException

public FileWriter(FileDescriptor fd)

public FileWriter(String fileName, boolean append)

throws IOException

Page 105: Cristian Frasinaru-Curs Practic de Java.pdf

104 CAPIT O L UL 4 . INT RARI SI IE SIRI

Cei m ai uzuali constructori sunt c e i care p rim e sc ca arg um ent num e lefisie rului. A c e stia p ot p rov oca e x c e p tii d e tip ul FileNotFoundException ıncazul ın care fisie rul cu num e le sp e c ificat nu ex ista. D in ac est m otiv oric ec reare a unui fl ux d e ac est tip tre b uie facuta ıntr-un b loc try-catch saum etod a ın care sunt create fl ux urile re sp e c tiv e tre b uie sa arunce e x c e p tiiled e tip ul FileNotFoundException sau d e tip ul sup erc lase i IOException.

S a consid e ram ca e x e m p lu un p rog ram care cop ie continutul unui fisie rcu num e le ” in.tx t” ıntr-un alt fisie r cu num e le ” out.tx t” . A m b e le fisie re suntconsid e rate ın d ire c torul curent.

L isting 4.1: Cop ie rea unui fisie r

import java.io.*;

public class Copiere {

public static void main(String [] args) {

try {

FileReader in = new FileReader("in.txt");

FileWriter out = new FileWriter("out.txt");

int c;

while ((c = in.read()) != -1)

out.write(c);

in.close ();

out.close();

} catch(IOException e) {

System.err.println("Eroare la operatiile cu fisiere!");

e.printStackTrace ();

}

}

}

In cazul ın care v om lansa ap licatia iar ın d ire c torul curent nu ex ista unfisie r cu num e le ” in.tx t” , v a fi g enerata o e x c e p tie d e tip ulFileNotFoundException. A c easta v a fi p rinsa d e p rog ram d eoare c e , IOExceptione ste sup erc lasa p entru FileNotFoundException.D ac a e x ista fisie rul ” in.tx t” , ap licatia v a crea un nou fisie r ” out.tx t” ın carev a fi cop iat continutul p rim ului. D ac a e x ista d e ja fisie rul ” out.tx t” e l v a fi re -

Page 106: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 105

scris. D ac a d oream sa fac e m op eratia d e ad aug are(ap p end ) si nu d e resc rie rep entru fisie rul ” out.tx t” foloseam :

FileWriter out = new FileWriter("out.txt", true);

4 .2 .5 Citirea si scrierea cu b uff er

Clase le p entru c itirea/ scrie rea cu zona tam p on sunt:

BufferedReader, BufferedWriter - caractere

BufferedInputStream, BufferedOutputStream - octeti

S unt folosite p entru a introd uc e un b uff er (zona d e m e m orie ) ın p roc e -sul d e c itire / sc rie re a inform atiilor, re d uc and astfe l num arul d e ac c e sari aled isp oz itiv ului c e re p re z inta sursa/ d estinatia ate lor. D in ac est m otiv , suntm ult m ai efic iente d e c at fl ux urile fara b uff er si d in ac est m otiv se re com and afolosirea lor ori d e c ate ori e ste p osib il.

Clasa BufferedReader c ite ste ın av ans d ate si le m e m oreaz a ıntr-o zonatam p on. A tunc i c and se e x e cuta o op eratie d e c itire , caracterul v a fi p re -luat d in b uff er. In cazul ın care b uff er-ul este g ol, c itirea se fac e d ire c t d infl ux si, od ata cu c itirea caracterului, v or fi m e m orati ın b uff er si caractere lecare ıi urm eaz a. E v id ent, BufferedInputStream func tioneaz a d up a ac e lasip rinc ip iu, sing ura d ife renta fiind fap tul c a sunt c ititi oc te ti.

S im ilar lucreaza si c lase le BufferedWriter si BufferedOutputStream.L a op eratiile d e sc rie re d ate le sc rise nu v or ajung e d ire c t la d estinatie , c i v orfi m e m orate jntr-un b uff er d e o anum ita d im ensiune . A tunc i c and b uff eruleste p lin, continutul ac estuia v a fi transferat autom at la d estinatie .

Flux urile d e c itire / sc rie re cu b uff er sunt fl ux uri d e p roc esare si suntfolosite p rin sup rap unere cu alte fl ux uri, d intre care ob lig atoriu unul estep rim itiv .

BufferedOutputStream out = new BufferedOutputStream(

new FileOutputStream("out.dat"), 1024)

//1024 este dimensiunea bufferului

Constructorii c e i m ai folositi ai ac e stor c lase sunt urm atorii:

BufferedReader(Reader in)

BufferedReader(Reader in, int dim_buffer)

BufferedWriter(Writer out)

Page 107: Cristian Frasinaru-Curs Practic de Java.pdf

106 CAPIT O L UL 4 . INT RARI SI IE SIRI

BufferedWriter(Writer out, int dim_buffer)

BufferedInputStream(InputStream in)

BufferedInputStream(InputStream in, int dim_buffer)

BufferedOutputStream(OutputStream out)

BufferedOutputStream(OutputStream out, int dim_buffer)

In cazul constructorilor ın care d im ensiunea b uff er-ului nu este sp e c ificata,ac easta p rim e ste v aloarea im p lic ita d e 512 octe ti (caractere ).

M e tod e le ac estor c lase sunt c e le uzuale d e tip ul read si write. P e lang aac estea, c lase le p entru scrie re p rin b uff er m ai au si m e tod a flush care g ole stee x p lic it zona tam p on, ch iar d ac a ac easta nu este p lina.

BufferedWriter out = new BufferedWriter(

new FileWriter("out.dat"), 1024)

//am creat un flux cu buffer de 1024 octeti

for(int i=0; i<1000; i++)

out.write(i);

//bufferul nu este plin, in fisier nu s-a scris nimic

out.flush();

//bufferul este golit, datele se scriu in fisier

M etoda readL ineE ste sp e c ific a fl ux urilor d e c itire cu b uff er si p e rm ite c itirea linie cu linie ad ate lor d e intrare . O linie re p re z inta o suc c esiune d e caractere te rm inata cusim b olul p entru sfarsit d e linie , d e p end ent d e p latform a d e lucru. A c e staeste re p re z entat ın J av a p rin se c v enta escap e ’\n’;

BufferedReader br = new BufferedReader(new FileReader("in"))

String linie;

while ((linie = br.readLine()) != null) {

...

//proceseaza linie

}

br.close();

}

Page 108: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 107

4 .2 .6 Concatenarea fl ux urilor

Clasa S eq uenceInputS tream p e rm ite une i ap licatii sa com b ine serial m aim ulte fl ux uri d e intrare astfe l ınc at ac estea sa ap ara ca un sing ur fl ux d eintrare . Citirea d ate lor d intr-un astfe l d e fl ux se fac e astfe l: se c ite ste d inp rim ul fl ux d e intrare sp e c ificat p ana c and se ajung e la sfarsitul ac estuia,d up a care p rim ul fl ux d e intrare e ste ınch is si se d e sch id e autom at urm atorulfl ux d e intrare d in care se v or c iti ın continuare d ate le , d up a care p roc esul sere p e ta p ana la term inarea tuturor fl ux urilor d e intrare .

Constructorii ac este i c lase sunt:

SequenceInputStream(Enumeration e)

SequenceInputStream(InputStream s1, InputStream s2)

P rim ul construieste un fl ux se c v ential d intr-o m ultim e d e fl ux uri d e in-trare . Fie care ob ie c t ın enum erarea p rim ita ca p aram etru tre b uie sa fie d etip ul InputStream.Cel d e -al d oilea construie ste un fl ux d e intrare care com b ina d oar d oua fl ux uris1 si s2, p rim ul fl ux c itit fiind s1.

E x e m p lul c e l m ai e loc v ent d e folosirea a ac este i c lase este concatenarea ad oua sau m ai m ultor fisie re :

L isting 4.2: Concatenarea a d oua fisie re

/* Concatenarea a doua fisiere

ale caror nume sunt primite de la linia de comanda.

Rezultatul concatenarii este afisat pe ecran.

*/

import java.io.*;

public class Concatenare {

public static void main(String args []) {

if (args.length <= 1) {

System.out.println("Argumente insuficiente!");

System.exit(-1);

}

try {

FileInputStream f1 = new FileInputStream(args [0]);

FileInputStream f2 = new FileInputStream(args [1]);

SequenceInputStream s = new SequenceInputStream(f1, f2)

;

int c;

while ((c = s.read()) != -1)

System.out.print ((char)c);

Page 109: Cristian Frasinaru-Curs Practic de Java.pdf

108 CAPIT O L UL 4 . INT RARI SI IE SIRI

s.close();

//f1 si f2 sunt inchise automat

} catch (IOException e) {

e.printStackTrace ();

}

}

}

P entru concatenarea m ai m ultor fisie re e x ista d oua v ariante :

• folosirea une i enum erari - p rim ul constructor (v e z i ” Cole c tii” );

• concatenarea p e rand a ac estora folosind al 2-lea constructor; con-catenarea a 3 fisie re v a construi un fl ux d e intrare astfe l:

FileInputStream f1 = new FileInputStream(args[0]);

FileInputStream f2 = new FileInputStream(args[1]);

FileInputStream f3 = new FileInputStream(args[2]);

SequenceInputStream s = new SequenceInputStream(

f1, new SequenceInputStream(f2, f3));

4 .2 .7 F lux uri pentru fi ltrarea datelor

U n fl ux d e filtrare se ataseaz a altui fl ux p entru a filtra d ate le care suntc itite / sc rise d e c atre ac e l fl ux . Clase le p entru filtrarea d ate lor sup erc lase leab stracte :

• F ilterInputS tream - p entru filtrarea fl ux urilor d e intrare si

• F ilterO utputS tream - p entru filtrarea fl ux urilor d e ie sire .

Cele m ai im p ortante fl ux ruri p entru filtrarea d ate lor sunt im p le m entated e c lase le :

DataInputStream, DataOutputStream

BufferedInputStream, BufferedOutputStream

LineNumberInputStream

PushbackInputStream

PrintStream

Page 110: Cristian Frasinaru-Curs Practic de Java.pdf

4 .2 . F O L O SIRE A F L UX URIL O R 109

Ob serv ati c a toate ac este c lase d e sc riu fl ux uri d e octe ti.

Filtrarea d ate lor nu tre b uie v azuta ca o m etod a d e a e lim ina anum itiocte ti d intr-un fl ux c i d e a transform a ac e sti octe ti ın d ate care sa p oata fiinterp re tate sub alta form a. A sa cum am v azut la c itirea/ scrie rea cu zonatam p on, c lase le d e filtrare BufferedInputStream si BufferedOutputStreamcole c teaz a d ate le unui fl ux ıntr-un b uff er, urm and ca c itirea/ sc rie rea sa sefac a p rin interm e d iu ac e lui b uff er.

A sad ar, fl ux urile d e filtrare nu elim ina d ate c itite sau scrise d e un anum itfl ux , c i introd uc o noua m od alitate d e m anip ulare a lor, e le m ai fiind num itesi fl u xu ri d e p rocesa re . D in ac est m otiv , fl ux urile d e filtrare v or contineanum ite m e tod e sp e c ializate p entru c itirea/ sc rie rea d ate lor, alte le d e c at c e lecom une tuturor fl ux urilor. D e e x e m p lu, c lasa BufferedInputStream p unela d isp oz itie m e tod a readLine p entru c itirea une i linii d in fl ux ul d e intrare .

Folosirea fl ux urilor d e filtrare se fac e p rin atasarea lor d e un fl ux care seocup a e fe c tiv d e c itirea/ scrie rea d ate lor:FluxFiltrare numeFlux = new FluxFiltrare(referintaAltFlux);

4 .2 .8 Clasele DataInputStream si DataOutputStream

A c e ste c lase ofera m e tod e p rin care un fl ux nu m ai e ste v azut ca o ınsiruired e octe ti, c i d e d ate p rim itiv e . P rin urm are , v or furniza m etod e p entruc itirea si sc rie rea d ate lor la niv e l d e tip p rim itiv si nu la niv e l d e octet.Clase le care ofera un astfe l d e sup ort im p le m enteaz a interfe te le DataInput,re sp e c tiv DataOutput. A c e stea d efinesc m e tod e le p e care tre b uie sa le p una lad isp oz itie ın v e d e rea c itire ii/ sc rie rii d ate lor d e tip p rim itiv . Cele m ai folositem e tod e , alte le d e c at c e le com une tuturor fl ux urilor, sunt d ate ın tab e lul d em ai jos:

Page 111: Cristian Frasinaru-Curs Practic de Java.pdf

110 CAPIT O L UL 4 . INT RARI SI IE SIRI

D ataInputS tream D ataO utputS treamreadBoolean writeBoolean

readByte writeByte

readChar writeChar

readDouble writeDouble

readFloat writeFloat

readInt writeInt

readLong writeLong

readShort writeShort

readUTF writeUTF

A c e ste m e tod e au d enum irile g eneric e d e readXXX si w riteXXX, sp e c ifi-cate d e interfe te le DataInput si DataOutput si p ot p rov oca e x c e p tii d e tip ulIOException. D enum irile lor sunt sug estiv e p entru tip ul d e d ate p e care ılp re lucreaz a. m ai p utin readUTF si w rite U T F care se ocup a cu ob ie c te d e tipString, fiind sing urul tip re fe rinta p e rm is d e ac este c lase .

S c rie rea d ate lor folosind fl ux uri d e ac est tip se fac e ın form at b inar, c e eac e ınseam na c a un fisie r ın care au fost scrise inform atii folosind m e tod ewriteXXX nu va p utea fi c itit d e c at p rin m etod e readXXX.

T ransform area une i v alori ın form at b inar se num e ste seria liza re . Clase leDataInputStream si DataOutputStream p e rm it se rializarea tip urilor p rim -itiv e si a sirurilor d e caractere . S e rializarea c e lorlalte tip uri re fe rinta v a fifacuta p rin interm e d iul altor c lase , cum ar fi ObjectInputStream siObjectOutputStream (v e z i ” S e rializarea ob ie c te lor” ).

4 .3 Intrari si iesiri form atate

Inc e p and cu v ersiunea 1.5, lim b ajul J av a p une la d isp oz itii m od alitati sim -p lificate p entru afisarea form atata a unor inform atii, re sp e c tiv p entru c itiread e d ate form atate d e la tastatura.

4 .3 .1 Intrari form atate

Clasa java.util.S canner ofera o solutie sim p la p entru form atarea unor inform atiic itite d e p e un fl ux d e intrare fie p e octe ti, fie p e caractere , sau ch iar d intr-unob ie c t d e tip File. P entru a c iti d e la tastatura v om sp e c ifica ca arg um ental constructorului fl ux ul System.in:

Page 112: Cristian Frasinaru-Curs Practic de Java.pdf

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE 111

Scanner s = Scanner.create(System.in);

String nume = s.next();

int varsta = s.nextInt();

double salariu = s.nextDouble();

s.close();

4 .3 .2 Iesiri form atate

Clase le PrintStream si PrintWriter p un la d isp oz itiile , p e lang a m e tod e leprint, println care ofereau p osib ilitatea d e a afisa un sir d e caractere , sim e tod e le form at, printf (e ch iv alente) c e p e rm it afisarea form atata a unorv ariab ile .

System.out.printf("%s %8.2f %2d %n", nume, salariu, varsta);

Form atarea sirurilor d e caractere se b az eaz a p e c lasa java.util.F orm atter.

4 .4 F lux uri standard de intrare si iesire

M e rg and p e linia introd usa d e siste m ul d e op erare U N IX, oric e p rog ram J av aare :

• o intrare stand ard

• o ie sire stand ard

• o ie sire stand ard p entru erori

In g eneral, intrarea stand ard este tastatura iar ie sirea stand ard este e c ranul.Intrarea si ie sirea stand ard sunt re p re z entate d e ob ie c te p re -c reate c e

d e sc riu fl ux uri d e d ate care com unic a cu d isp oz itiv e le stand ard ale siste m ului.A c e ste ob ie c te sunt d efinite p ub lic e ın c lasa System si sunt:

• S y stem .in - fl ux ul stand ar d e intrare , d e tip InputStream

• S y stem .out - fl ux ul stand ar d e ie sire , d e tip PrintStream

• S y stem .err - fl ux ul stand ar p entru erori, d e tip PrintStream

Page 113: Cristian Frasinaru-Curs Practic de Java.pdf

112 CAPIT O L UL 4 . INT RARI SI IE SIRI

4 .4 .1 A fi sarea inform atiilor pe ecran

A m v azut d e ja num eroase e x e m p le d e utilizare a fl ux ului stand ard d e ie sire ,e l fiind folosit la afisarea oric aror re zultate p e e c ran (ın m od ul consola):

System.out.print (argument);

System.out.println(argument);

System.out.printf (format, argumente...);

System.out.format (format, argumente...);

Flux ul stand ard p entru afisarea erorilor se folose ste sim ilar si ap are uzualın se c v ente le d e tratare a e x c e p tiilor. Im p lic it, e ste ac e lasi cu fl ux ul stand ardd e ie sire .

catch(Exception e) {

System.err.println("Exceptie:" + e);

}

Flux urile d e ie sire p ot fi folosite asad ar fara p rob le m e d eoare c e tip ul loreste PrintStream, c lasa concreta p entru scrie rea d ate lor. In sch im b , fl ux ulstand ard d e intrare System.out e ste d e tip InputStream, care e ste o c lasaab stracta, d e c i p entru a-l p utea utiliza efic ient v a tre b ui sa-l folosim ım p reunacu un fl ux d e p roc esare(filtrare) care sa p e rm ita c itirea fac ila a d ate lor.

4 .4 .2 Citirea datelor de la tastatura

U zual, v om d ori sa folosim m e tod a readLine p entru c itirea d ate lor d e latastatura si d in ac est m otiv v om folosi intrarea stand ard ım p reuna cu o c lasad e p roc esare care ofera ac easta m e tod a. E x e m p lul tip ic e ste :

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

System.out.print("Introduceti o linie:");

String linie = stdin.readLine()

System.out.println(linie);

In e x e m p lul urm ator este p re z entat un p rog ram care afiseaza liniile intro-d use d e la tastatura p ana ın m om entul ın care se introd uc e linia ” e x it” sauo linie v id a si m entioneaz ad ac a sirul resp e c tiv re p re z inta un num ar sau nu.

Page 114: Cristian Frasinaru-Curs Practic de Java.pdf

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE 113

L isting 4.3: Citirea d ate lor d e la tastatura

/* Citeste siruri de la tastatura si verifica

daca reprezinta numere sau nu

*/

import java.io.*;

public class EsteNumar {

public static void main(String [] args) {

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

try {

while(true) {

String s = stdin.readLine ();

if (s.equals("exit") || s.length ()==0)

break;

System.out.print(s);

try {

Double.parseDouble(s);

System.out.println(": DA");

} catch(NumberFormatException e) {

System.out.println(": NU");

}

}

} catch(IOException e) {

System.err.println("Eroare la intrarea standard!");

e.printStackTrace ();

}

}

}

Inc e p and cu v ersiunea 1.5, v arianta c ea m ai com od a d e c itire a d ate lord e la tastatura e ste folosirea c lase i java.util.Scanner.

4 .4 .3 R edirectarea fl ux urilor standard

R e d ire c tarea fl ux urilor stand ard p resup une stab ilirea une i alte surse d e c attastatura p entru c itirea d ate lor, resp e c tiv alte d e stinatii d e c at e c ranul p entruc e le d oua fl ux uri d e ie sire . In c lasa System e x ista urm atoare le m e tod e static ecare realiz eaz a ac est lucru:

setIn(InputStream) - redirectare intrare

setOut(PrintStream) - redirectare iesire

setErr(PrintStream) - redirectare erori

Page 115: Cristian Frasinaru-Curs Practic de Java.pdf

114 CAPIT O L UL 4 . INT RARI SI IE SIRI

R e d ire c tarea ie sirii e ste utila ın sp e c ial atunc i c and sunt afisate foarte m ulted ate p e e c ran. P ute m re d ire c ta afisarea c atre un fisie r p e care sa-l c itim d up ae x e cutia p rog ram ului. S e c v enta c lasic a d e re d ire c tare a ie sirii e ste c atre unfisie r e ste :

PrintStream fis = new PrintStream(

new FileOutputStream("rezultate.txt")));

System.setOut(fis);

R e d ire c tarea erorilor ıntr-un fisie r p oate fi d e ase m enea utila si se fac e ıntr-om aniera sim ilara:

PrintStream fis = new PrintStream(

new FileOutputStream("erori.txt")));

System.setErr(fis);

R e d ire c tarea intrarii p oate fi folositoare p entru un p rog ram ın m od con-sola care p rim e ste m ai m ulte v alori d e intrare . P entru a nu le scrie d e latastatura d e fie care d ata ın tim p ul testarii p rog ram ului, e le p ot fi p use ıntr-un fisie r, re d ire c tand intrarea stand ard c atre ac e l fisie r. In m om entul c andtestarea p rog ram ului a luat sfarsit re d ire c tarea p oate fi e lim inata, d ate le fiindc e rute d in nou d e la tastatura.

L isting 4.4: E x e m p lu d e folosire a re d ire c tarii:

import java.io.*;

class Redirectare {

public static void main(String [] args) {

try {

BufferedInputStream in = new BufferedInputStream(

new FileInputStream("intrare.txt"));

PrintStream out = new PrintStream(

new FileOutputStream("rezultate.txt"));

PrintStream err = new PrintStream(

new FileOutputStream("erori.txt"));

System.setIn(in);

System.setOut(out);

System.setErr(err);

BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));

Page 116: Cristian Frasinaru-Curs Practic de Java.pdf

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE 115

String s;

while((s = br.readLine ()) != null) {

/* Liniile vor fi citite din fisierul intrare.txt

si vor fi scrise in fisierul rezultate.txt

*/

System.out.println(s);

}

// Aruncam fortat o exceptie

throw new IOException("Test");

} catch(IOException e) {

/* Daca apar exceptii ,

ele vor fi scrise in fisierul erori.txt

*/

System.err.println("Eroare intrare/iesire!");

e.printStackTrace ();

}

}

}

4 .4 .4 A naliza lex icala pe fl ux uri (clasa StreamTokenizer)

Clasa StreamTokenizer p roc eseaz a un fl ux d e intrare d e oric e tip si ıl ım p arteın ” atom i le x icali” . R e zultatul v a consta ın fap tul c a ın loc sa se c iteasc aocte ti sau caractere , se v or c iti, p e rand , atom ii le x icali ai fl ux ului resp e c tiv .P rintr-un a to m lexica l se ın]e le g e ın g eneral:

• un id entificator (un sir care nu este ıntre g h ilim e le )

• un num ar

• un sir d e caractere

• un com entariu

• un se p arator

A tom ii le x icali sunt d esp artiti ıntre e i d e se p aratori. Im p lic it, ac e sti se p ara-tori sunt c e i ob isnuti: sp atiu, tab , v irg ula, p unct si v irg ula, e tc ., ınsa p ot fisch im b ati p rin d iv e rse m e tod e ale c lase i.

Constructorii c lase i sunt:

Page 117: Cristian Frasinaru-Curs Practic de Java.pdf

116 CAPIT O L UL 4 . INT RARI SI IE SIRI

public StreamTokenizer(Reader r)

public StreamTokenizer(InputStream is)

Id entificarea tip ului si v alorii unui atom le x ical se fac e p rin interm e d iulv ariab ile lor:

• T T E O F - atom c e m arch eaz a sfaarsitul fl ux ului

• T T E O L - atom c e m arch eaz a sfarsitul une i linii

• T T N U M B E R - atom d e tip num ar

• T T W O R D - atom d e tip cuv ant

• tty pe- tip ul ultim ului atom c itit d in fl ux

• nval- v aloarea unui atom num eric

• sval - v aloarea unui atom d e tip cuv ant

Citirea atom ilor d in fl ux se fac e cu m etod a nex tT ok en(), care returnez atip ul atom ului le x ical c itit si sc rie ın v ariab ile le nval sau sval v aloarea core -sp unzatoare atom ului.

E x e m p lul tip ic d e folosire a unui analizor le x ical este c itirea une i se c v ented e num ere si siruri afl ate ıntr-un fisie r sau p rim ite d e la tastatura:

L isting 4.5: Citirea unor atom i le x icali d intr-un fisie r

/* Citirea unei secvente de numere si siruri

dintr -un fisier specificat

si afisarea tipului si valorii lor

*/

import java.io.*;

public class CitireAtomi {

public static void main(String args []) throws IOException{

BufferedReader br = new BufferedReader(new FileReader("

fisier.txt"));

StreamTokenizer st = new StreamTokenizer(br);

int tip = st.nextToken ();

//Se citeste primul atom lexical

Page 118: Cristian Frasinaru-Curs Practic de Java.pdf

4 .5 . CL ASA RANDOMACCESFILE (F ISIE RE CU ACCE S D IRE CT ) 117

while (tip != StreamTokenizer.TT_EOF) {

switch (tip) {

case StreamTokenizer.TT_WORD:

System.out.println("Cuvant: " + st.sval);

break;

case StreamTokenizer.TT_NUMBER:

System.out.println("Numar: " + st.nval);

}

tip = st.nextToken ();

// Trecem la urmatorul atom

}

}

}

A sad ar, m od ul d e utilizare tip ic p entru un analizor le x ical este ıntr-o b u-c la ” w h ile ” , ın care se c ite sc atom ii unul c ate unul cu m etod a nextToken,p ana se ajung e la sfarsitul fl ux ului (TT EOF). In cad rul b uc le i ” w h ile ” se d e te r-m ina tip ul atom ul curent curent (ıntors d e m e tod a nextToken) si ap oi se afl av aloarea num eric a sau sirul d e caractere coresp unz ator atom ului resp e c tiv .

In cazul ın care tip ul atom ilor nu ne intereseaz a, e ste m ai sim p lu sac itim fl ux ul linie cu linie si sa folosim c lasa StringTokenizer, care realiz eaz aım p artirea unui sir d e caractere ın atom i le x icali, sau m etod a split a clase iString.

4 .5 Clasa RandomAccesFile (fi siere cu acces di-

rect)

D up a cum am v azut, fl ux urile sunt p roc ese se c v entiale d e intrare / ie sire .A c e stea sunt ad e c v ate p entru lucrul cu m e d ii se c v entiale d e m e m orare ad ate lor, cum ar fi b and a m ag netic a sau p entru transm ite rea inform atiilorp rin re tea, d e si sunt foarte utile si p entru d isp oz itiv e ın care inform atia p oatefi ac c e sata d ire c t.

Clasa RandomAccesFile are urm atoare le caracteristic i:

• p e rm ite ac c e sul nese c v ential (d ire c t) la continutul unui fisie r;

• e ste o c lasa d e sine statatoare , sub c lasa d ire c ta a c lase i Object;

• se g ase ste ın p ach e tul java.io;

Page 119: Cristian Frasinaru-Curs Practic de Java.pdf

118 CAPIT O L UL 4 . INT RARI SI IE SIRI

• im p le m enteaz a interfe te le DataInput si DataOutput, c e ea c e ınseam naca sunt d isp onib ile m e tod e d e tip ul readXXX, writeXXX, ıntoc m ai cala c lase le DataInputStream si DataOutputStream;

• p e rm ite atat c itirea c at si sc rie re d in/ in fisie re cu ac c es d ire c t;

• p e rm ite sp e c ificarea m od ului d e ac c e s al unui fisie r (read -only , read -w rite ).

Constructorii ac este i c lase sunt:

RandomAccessFile(StringnumeFisier, StringmodAcces)

throws IOException

RandomAccessFile(StringnumeFisier, StringmodAcces)

throws IOException

und e m od A cces p oate fi:

• ” r” - fisie rul este d e sch is num ai p entru c itire (read -only )

• ” rw ” - fisie rul este d e sch is p entru c itire si sc rie re (read -w rite )

E x e m p le :

RandomAccesFile f1 = new RandomAccessFile("fisier.txt", "r");

//deschide un fisier pentru citire

RandomAccesFile f2 = new RandomAccessFile("fisier.txt", "rw");

//deschide un fisier pentru scriere si citire

Clasa RandomAccesFile sup orta notiunea d e po in ter d e fi sier. A c e sta esteun ind icator c e sp e c ific a p oz itia curenta ın fisie r. L a d esch id e rea unui fisie rp ointerul are v aloarea 0, ind ic and ınc e p utul fisie rului. A p e luri la m e tod e led e c itire / sc rire re d e p laseaz a p ointerul fisie rului cu num arul d e octe ti c ititisau scrisi d e m e tod e le resp e c tiv e .

In p lus fatad e m e tod e le d e tip read si write c lasa p une la d isp oz itie sim e tod e p entru controlul p oz itie i p ointerului d e fisie r. A c e stea sunt:

• skipBytes - m uta p ointerul fisie rului ınainte cu un num ar sp e c ificat d eocte ti

• seek - p oz itioneaza p ointerului fisie rului ınaintea unui octet sp e c ificat

• getFilePointer - re turneaz a p oz itia p ointerului d e fisie r.

Page 120: Cristian Frasinaru-Curs Practic de Java.pdf

4 .6 . CL ASA FILE 119

4 .6 Clasa File

Clasa File nu se re fe ra d oar la un fisie r c i p oate re p re z enta fie un fisie ranum e , fie m ultim ea fisie re lor d intr-un d ire c tor.

S p e c ificarea unui fisie r/ d ire c tor se fac e p rin sp e c ificarea c aii ab solute sp reac e l fisie r sau a c aii re lativ e fata d e d ire c torul curent. A c e stea tre b uie sa re -sp e c te conv entiile d e sp e c ificare a c ailor si num e lor fisie re lor d e p e p latform ad e lucru.U tilitate c lase i File consta ın furnizarea une i m od alitati d e a ab stractizad e p end ente le cailor si num e lor fisie re lor fatad e m asina g az d a, p re cum sip unerea la d isp oz itie a unor m etod e p entru lucrul cu fisere si d ire c toare laniv e lul siste m ului d e op erare .

A stfe l, ın ac easta c lasa v om g asi m e tod e p entru testarea e x istente i, ste rg e rea,re d enum irea unui fisie r sau d ire c tor, c rearea unui d ire c tor, listarea fisie re lord intr-un d ire c tor, e tc .

T re b uie m entionat si fap tul c a m ajoritatea constructorilor fl ux urilor carep e rm it ac c e sul la fisie re ac c e p ta ca arg um ent un ob ie c t d e tip File ın loculunui sir c e re p re z inta num e le fisie rului resp e c tiv .

File f = new File("fisier.txt");

FileInputStream in = new FileInputStream(f)

Cel m ai uzual constructor al c lase i File e ste :

public File(String numeFisier)

M e tod e le m ai im p ortante ale c lase i File au d enum iri sug estiv e si v or fip re z entate p rin interm e d iul e x e m p lului urm ator care listeaz a fisie re le si sub -d ire c toare le unui d ire c tor sp e c ificat si, p entru fiecare d in e le afiseaz a d iv e rseinform atii:

L isting 4.6: L istarea continutului unui d ire c tor

/* Programul listeaza fisierele si subdirectoarele unui

director.

Pentru fiecare din ele vor fi afisate diverse informatii.

Numele directorului este primit ca argument de la

linia de comanda , sau este directorul curent.

*/

import java.io.*;

Page 121: Cristian Frasinaru-Curs Practic de Java.pdf

120 CAPIT O L UL 4 . INT RARI SI IE SIRI

import java.util .*;

public class ListareDirector {

private static void info(File f) {

// Afiseaza informatii despre un fisier sau director

String nume = f.getName ();

if(f.isFile ())

System.out.println("Fisier: " + nume);

else

if(f.isDirectory ())

System.out.println("Director: " + nume);

System.out.println(

"Cale absoluta: " + f.getAbsolutePath () +

"\n Poate citi: " + f.canRead () +

"\n Poate scrie: " + f.canWrite () +

"\n Parinte: " + f.getParent () +

"\n Cale: " + f.getPath () +

"\n Lungime: " + f.length () +

"\n Data ultimei modificari: " +

new Date(f.lastModified ()));

System.out.println("--------------");

}

public static void main(String [] args) {

String nume;

if (args.length == 0)

nume = "."; // directorul curent

else

nume = args [0];

try {

File director = new File(nume);

File[] continut = director.listFiles ();

for(int i = 0; i < continut.length; i++)

info(continut[i]);

} catch(Exception e) {

e.printStackTrace ();

}

}

}

Page 122: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 5

Interfete

5 .1 Introducere

5 .1.1 Ce este o interfata ?

Interfe te le d uc conce p tul d e c lasa ab stracta cu un p as ınainte p rin e lim inareaoric aror im p le m entari d e m e tod e , p unand ın p ractic a unul d in conce p te lep rog ram arii orientate ob ie c t si anum e c e l d e se p arare a m od e lului unui ob ie c t(interfata) d e im p le m entarea sa. A sad ar, o interfata p oate fi p riv ita ca unp ro toco l d e co m u n ica re ıntre ob ie c te .

O interfata J av a d efine ste un set d e m e tod e d ar nu sp e c ific a nic i o im p le -m entare p entru e le . O clasa care im p le m enteaz a o interfata tre b uie ob lig ato-riu sa sp e c ific e im p le m entari p entru toate m e tod e le interfe te i, sup unand u-seasad ar unui anum it com p ortam ent.

D efi nitie

O in terfa ta e ste o cole c tie d e m e tod e fara im p le m entare si d e c laratii d econstante .

Interfe te le p e rm it, alaturi d e c lase , d efinirea unor noi tip uri d e d ate .

121

Page 123: Cristian Frasinaru-Curs Practic de Java.pdf

122 CAPIT O L UL 5 . INT E RF E T E

5 .2 F olosirea interfetelor

5 .2 .1 D efi nirea unei interfete

D efinirea une i interfe te se fac e p rin interm e d iul cuv antului ch e ie interface:

[public] interface NumeInterfata

[extends SuperInterfata1, SuperInterfata2...]

{

/* Corpul interfetei:

Declaratii de constane

Declaratii de metode abstracte

*/

}

O interfata p oate av ea un sing ur m od ificator si anum e public. O interfatap ub lic a e ste ac c e sib ila tuturor c lase lor, ind ife rent d e p ach e tul d in care facp arte , im p lic it niv e lul d e ac c e s fiind d oar la niv e lul p ach e tului d in care fac ep arte interfata.

O interfata p oate e x tind e oric ate interfe te . A c e stea se num esc su perin terfe tesi sunt se p arate p rin v irg ula. (v e z i ” M ostenirea m ultip la p rin interm e d iulinterfe te lor” ).

Corp ul une i interfe te p oate contine :

• constante: ac e stea p ot fi sau nu d e c larate cu m od ificatorii public,static si final care sunt im p lic iti, nic i un alt m od ificator nep utandap area ın d e c laratia une i v ariab ile d intr-o interfata. Constante le une iinterfe te tre b uie ob lig atoriu initializate .

interface Exemplu {

int MAX = 100;

// Echivalent cu:

public static final int MAX = 100;

int MAX;

// Incorect, lipseste initializarea

private int x = 1;

// Incorect, modificator nepermis

}

Page 124: Cristian Frasinaru-Curs Practic de Java.pdf

5 .2 . F O L O SIRE A INT E RF E T E L O R 123

• m etode fara im plem entare: ac e stea p ot fi sau nu d e c larate cu m od -ificatorul public, care este im p lic it; nic i un alt m od ificator nu p oateap area ın d e c laratia une i m e tod e a une i interfe te .

interface Exemplu {

void metoda();

// Echivalent cu:

public void metoda();

protected void metoda2();

// Incorect, modificator nepermis

A tentie

• V ariab ile le une i interfe te sunt im p lic it p ub lic e ch iar d ac a nu sunt d e c laratecu m od ificatorul public.

• V ariab ile le une i interfe te sunt im p lic it constante ch iar d ac a nu suntd e c larate cu m od ificatorii static si final.

• M e tod e le une i interfe te sunt im p lic it p ub lic e ch iar d ac a nu sunt d e c laratecu m od ificatorul public.

• In v ariante le m ai v e ch i d e J av a era p erm is si m od ificatorul abstractın d e c laratia interfe te i si ın d e c laratiile m e tod e lor, ınsa ac est lucru num ai este v alab il, d eoare c e atat interfata c at si m e tod e le sale nu p ot fialtfe l d e c at ab stracte .

5 .2 .2 Im plem entarea unei interfete

Im p le m entarea une ia sau m ai m ultor interfe te d e c atre o c lasa se fac e p rininterm e d iul cuv antului ch e ie im plem ents:

class NumeClasa implements NumeInterfata

sau

class NumeClasa implements Interfata1, Interfata2, ...

Page 125: Cristian Frasinaru-Curs Practic de Java.pdf

124 CAPIT O L UL 5 . INT E RF E T E

O clasa p oate im p le m enta oric ate interfe te sau p oate sa nu im p le m ente z enic i una.

In cazul ın care o c lasa im p le m enteaz a o anum ita interfata, atunc i tre -b uie ob lig atoriu sa sp e c ific e cod p entru toate m e tod e le interfe te i. D in ac estm otiv , od ata c reata si folosita la im p le m entarea unor c lase , o interfata num ai tre b uie m od ificata, ın sensul c a ad aug area unor m etod e noi sau sch im -b area sig naturii m e tod e lor e x istente v or d uc e la erori ın com p ilarea c lase lorcare o im p le m enteaz a. E v id ent, o c lasa p oate av ea si alte m e tod e si v ariab ilem e m b re ın afara d e c e le d efinite ın interfata.

A tentie

M od ificarea une i interfe te im p lic a m od ificarea tuturor c lase lor care im -p le m enteaz a ac ea interfata.

O interfata nu este o c lasa, d ar oric e re fe rinta d e tip interfata p oate p rim ica v aloare o re fe rinta la un ob ie c t al une i c lase c e im p le m enteaz a interfataresp e c tiv a. D in ac est m otiv , interfe te le p ot fi p riv ite ca tip uri d e d ate si v omsp une ad esea c a un ob ie c t are tip ul X, und e X e ste o interfata, d ac a ac estaeste o instanta a une i c lase c e im p le m enteaz a interfata X.

Im p le m entarea une i interfe te p oate sa fie si o c lasa ab stracta.

5 .2 .3 E x em plu: im plem entarea unei stive

S a consid e ram urm atorul e x e m p lu. D orim sa im p le m entam un nou tip d ed ate num it S ta ck , care sa m od e le z e notiunea d e stiv a d e ob ie c te . Ob ie c te led e tip stiv a, ind ife rent d e im p le m entarea lor, v or tre b ui sa contina m e tod e le :

• push - ad aug a un nou ele m ent in stıv a

• pop - e lim ina e le m entul d in v arful stiv e i

• peek - re turneaz a v arful stiv e i

• empty - te steaz a d ac a stiv a este v id a

• toString - re turneaz a continutul stiv e i sub form a unui sir d e caractere .

Page 126: Cristian Frasinaru-Curs Practic de Java.pdf

5 .2 . F O L O SIRE A INT E RF E T E L O R 125

D in p unctul d e v e d e re al structurii interne , o stiv a p oate fi im p le m entatafolosind un v e ctor sau o lista ınlantuita, am b e le solutii av and av antaje sid e zav antaje . P rim a solutie e ste m ai sim p lu d e ınte le s, ın tim p c e a d oua estem ai efic ienta d in p unctul d e v e d e re al folosirii m e m orie i. D eoare c e nu d orimsa le g am tip ul d e d ate S ta ck d e o anum ita im p le m entare structurala, ıl v omd efini p rin interm e d iul une i interfe te . V om v e d ea im e d iat av antaje le ac este iab ord ari.

L isting 5.1: Interfata c e d e sc rie stiv a

public interface Stack {

void push(Object item) throws StackException;

void pop() throws StackException;

Object peek() throws StackException;

boolean empty();

String toString ();

}

P entru a trata situatiile anorm ale care p ot ap area atunc i c and ınc e rc amsa p une m un ele m ent ın stiv a si nu este p osib il d in lip sa d e m e m orie , sauınc erc am sa ac c e sam v arful stiv e i si ac easta este v id a, v om d efini o e x c e p tiep rop rie StackException:

L isting 5.2: T ip ul d e e x c e p tie g enerat d e stiv a

public class StackException extends Exception {

public StackException () {

super();

}

public StackException(String msg) {

super(msg);

}

}

D am ın continuare p rim a im p le m entare a stiv e i, folosind un v e ctor:

L isting 5.3: Im p le m entarea stiv e i folosind un v e ctor

// Implementarea stivei folosind un vector de obiecte.

public class StackImpl1 implements Stack {

private Object items [];

// Vectorul ce contine obiectele

Page 127: Cristian Frasinaru-Curs Practic de Java.pdf

126 CAPIT O L UL 5 . INT E RF E T E

private int n=0;

// Numarul curent de elemente din stiva

public StackImpl1(int max) {

// Constructor

items = new Object[max];

}

public StackImpl1 () {

this (100);

}

public void push(Object item) throws StackException {

if (n == items.length)

throw new StackException("Stiva este plina!");

items[n++] = item;

}

public void pop() throws StackException {

if (empty())

throw new StackException("Stiva este vida!");

items[--n] = null;

}

public Object peek() throws StackException {

if (empty())

throw new StackException("Stiva este vida!");

return items[n-1];

}

public boolean empty() {

return (n==0);

}

public String toString () {

String s="";

for(int i=n-1; i>=0; i--)

s += items[i]. toString () + " ";

return s;

}

}

R e m arcati c a, d e si ın interfata m e tod e le nu sunt d e c larate e x p lic it cum od ificatorul public, e le sunt totusi p ub lic e si tre b uie d e c larate ca atare ınc lasa.T re b uie re m arcat si fap tul c a m e tod a toString e ste d efinita d e ja ın c lasaObject, d e c i c lasa noastra o are d e ja im p le m entata si nu am fi ob tinut nic io eroare la com p ilare d ac a nu o im p le m entam e x p lic it. Ceea c e fac e m acumeste d e fap t sup rad efinirea e i.

Page 128: Cristian Frasinaru-Curs Practic de Java.pdf

5 .2 . F O L O SIRE A INT E RF E T E L O R 127

O alta ob se rv atie im p ortanta se re fe ra la fap tul c a tre b uie sa d e c laram ıncad rul interfe te i si e x c e p tiile aruncate d e m e tod e , c e tre b uie ob lig atoriutratate .

S a v e d e m acum m od alitatea d e im p le m entare a stiv e i folosind o listaınlantuita:

L isting 5.4: Im p le m entarea stiv e i folosind o lista

// Implementarea stivei folosind o lista inlantuita.

public class StackImpl2 implements Stack {

class Node {

//Clasa interna ce reprezinta un nod al listei

Object item; // informatia din nod

Node link; // legatura la urmatorul nod

Node(Object item , Node link) {

this.item = item;

this.link = link;

}

}

private Node top=null;

// Referinta la varful stivei

public void push(Object item) {

Node node = new Node(item , top);

top = node;

}

public void pop() throws StackException {

if (empty())

throw new StackException("Stiva este vida!");

top = top.link;

}

public Object peek() throws StackException {

if (empty())

throw new StackException("Stiva este vida!");

return top.item;

}

public boolean empty() {

return (top == null);

}

public String toString () {

String s="";

Node node = top;

while (node != null) {

Page 129: Cristian Frasinaru-Curs Practic de Java.pdf

128 CAPIT O L UL 5 . INT E RF E T E

s += (node.item).toString () + " ";

node = node.link;

}

return s;

}

}

S ing ura ob serv atie p e care o fac e m aic i e ste c a, d e si m e tod a push d ininterfata d e c lara aruncarea unor e x c e p tii d e tip ul StackException, nu esteob lig atoriu ca m etod a d in c lasa sa sp e c ific e si ea ac est lucru, atat tim p c atnu g enereaz a e x c e p tii d e ac e l tip . Inv ers este ınsa ob lig atoriu.

In continuare este p re z entata o m ic a ap licatie d e m onstrativ a care folose stetip ul d e d ate nou creat si c e le d oua im p le m entari ale sale :

L isting 5.5: Folosirea stiv e i

public class TestStiva {

public static void afiseaza(Stack s) {

System.out.println("Continutul stivei este: " + s);

}

public static void main(String args []){

try {

Stack s1 = new StackImpl1 ();

s1.push("a");

s1.push("b");

afiseaza(s1);

Stack s2 = new StackImpl2 ();

s2.push(new Integer (1));

s2.push(new Double (3.14));

afiseaza(s2);

} catch (StackException e) {

System.err.println("Eroare la lucrul cu stiva!");

e.printStackTrace ();

}

}

}

Ob serv ati folosirea interfe te i Stack ca un tip d e d ate , c e ad uc e fl e x ib ilitatesp orita ın m anev rarea c lase lor c e im p le m enteaz a tip ul resp e c tiv . M e tod a

Page 130: Cristian Frasinaru-Curs Practic de Java.pdf

5 .3 . INT E RF E T E SI CL ASE AB ST RACT E 129

afiseaza acc e p ta ca arg um ent oric e ob ie c t al une i c lase c e im p le m enteaz aStack.

O b servatieIn p ach e tul java.util e x ista c lasa Stack care m od e leaz a notiune d e stiv a

d e ob ie c te si, e v id ent, ac easta v a fi folosita ın ap licatiile c e au nev oie d e ac esttip d e d ate . E x e m p lu oferit d e noi nu are le g atura cu ac easta c lasa si are rolp ur d e m onstrativ .

5 .3 Interfete si clase ab stracte

L a p rim a v e d e re o interfata nu este altc e v a d e c at o c lasa ab stracta ın caretoate m e tod e le sunt ab stracte (nu au nic i o im p le m entare).A sad ar, o cla sa a bstra cta n u a r p u tea ın locu i o in terfa ta ?R asp unsul la intre b are d e p ind e d e situatie , ınsa ın g eneral este ’N u ’.D eose b irea consta ın fap tul c a une le c lase sunt fortate sa e x tind a o anum itac lasa (d e e x e m p lu oric e ap p le t tre b uie sa fie sub c lasa a c lase i Applet) si nu arm ai p utea sa e x tind a o alta c lasa, d eoare c e ın J av a nu ex ista d e c at m osteniresim p la. Fara folosirea interfe te lor nu am p utea forta c lasa resp e c tiv a sare sp e c te d iv e rse tip uri d e p rotocoale .

L a niv e l conce p tual, d ife renta consta ın:

• e x tind erea une i c lase ab stracte forteaz a o re latie ıntre c lase ;

• im p le m entarea une i interfe te sp e c ific a d oar nec esitatea im p le m entariiunor anum ie m e tod e .

In m ulte situatii interfe te le si c lase le ab stracte sunt folosite ım p reunap entru a im p le m enta c at m ai fl e x ib il si efic ient o anum ita ie rarh ie d e c lase . U ne x e m p lu sug estiv e ste d at d e c lase le c e d e sc riu cole c tii. Ca sa p articulariz am ,e x ista:

• interfata L ist care im p une p rotocolul p e care tre b uie sa ıl re sp e c te oc lasa d e tip lista,

• c lasa ab stracta A b stractL ist care im p le m enteaz a interfata List siofe ra im p le m entari concrete p entru m etod e le com une tuturor tip urilord e lista,

Page 131: Cristian Frasinaru-Curs Practic de Java.pdf

130 CAPIT O L UL 5 . INT E RF E T E

• c lase concrete , cum ar fi L ink edL ist, A rray L ist care e x tind AbstractList.

5 .4 M ostenire m ultipla prin interfete

Interfe te le nu au nic i o im p le m entare si nu p ot fi instantiate . D in ac est m otiv ,nu re p re z inta nic i o p rob le m a ca anum ite c lase sa im p le m ente z e m ai m ulteinterfe te sau ca o interfata sa e x tind a m ai m ulte interfe te (sa aib a m ai m ultesup erinterfe te )

class NumeClasa implements Interfata1, Interfata2, ...

interface NumeInterfata extends Interfata1, Interfata2, ...

O interfata m osteneste atat constante le c at si d e c laratiile d e m e tod e d e lasup erinterfe te le sale . O clasa m osteneste d oar constante le une i interfe te sire sp onsab ilitatea im p le m entarii m e tod e lor sale .

S a consid e ram un ex e m p lu d e c lasa care im p le m enteaza m ai m ulte interfe te :

interface Inotator {

void inoata();

}

interface Zburator {

void zboara();

}

interface Luptator {

void lupta();

}

class Erou implements Inotator, Zburator, Luptator {

public void inoata() {}

public void zboara() {}

public void lupta() {}

}

E x e m p lu d e interfata care e x tind e m ai m ulte interfe te :

interface Monstru {

void ameninta();

}

interface MonstruPericulos extends Monstru {

void distruge();

Page 132: Cristian Frasinaru-Curs Practic de Java.pdf

5 .4 . M O ST E NIRE M UL T IPL A PRIN INT E RF E T E 131

}

interface Mortal {

void omoara();

}

interface Vampir extends MonstruPericulos, Mortal {

void beaSange();

}

class Dracula implements Vampir {

public void ameninta() {}

public void distruge() {}

public void omoara()() {}

public void beaSange() {}

}

E v id ent, p ot ap area situatii d e am b ig uitate , atunc i c and e x ista constantesau m etod e cu ac e leasi num e ın m ai m ulte interfe te , ınsa ac est lucru tre b uieıntotd eauna ev itat, d eoare c e sc rie rea unui cod care p oate fi confuz este un stilp rost d e p rog ram are . In cazul in care ac est lucru se ıntam p la, com p ilatorulnu v a furniza eroare d e c at d ac a se ınc earc a re fe rirea constante lor am b ig uefara a le p refix a cu num e le interfe te i sau d ac a m e tod e le cu ac e lasi num e nup ot fi d eosb ite , cum ar fi situatia c and au ace easi lista d e arg um ente d artip uri re turnate incom p atib ile .

interface I1 {

int x=1;

void metoda();

}

interface I2 {

int x=2;

void metoda(); //corect

//int metoda(); //incorect

}

class C implements I1, I2 {

public void metoda() {

System.out.println(I1.x); //corect

System.out.println(I2.x); //corect

System.out.println(x); //ambiguitate

Page 133: Cristian Frasinaru-Curs Practic de Java.pdf

132 CAPIT O L UL 5 . INT E RF E T E

}

}

S a re cap itulam c ate v a lucruri le g ate d e c lase si interfe te :

• O clasa nu p oate av ea d e c at o sup erc lasa.

• O clasa p oate im p le m enta oric ate interfe te .

• O clasa tre b uie ob lig atoriu sa trate z e m e tod e le d in interfe te le p e carela im p le m enteaz a.

• Ie rarh ia interfe te lor este ind e p end enta d e ie rarh ia c lase lor care le im -p le m enteaz a.

5 .5 U tilitatea interfetelor

D up a cum am v azut, o interfata d efine ste un p rotocol c e p oate fi im p le m entatd e oric e c lasa, ind ife rent d e ie rarh ia d e c lase d in care fac e p arte . Interfe te lesunt utile p entru:

• d efinirea unor sim ilaritati ıntre c lase ind e p end ente fara a forta artific ialo le g atura ıntre e le ;

• asig ura c a toate c lase le care im p le m enteaz a o interfata p un la d ip oz itiem e tod e le sp e c ificate ın interfata - d e aic i re zulta p osib ilitatea im p le -m entarii unor c lase p rin m ai m ulte m od alitati si folosirea lor ıntr-om aniera unitara;

• d efinirea unor g rup uri d e constante ;

• transm ite rea m etod e lor ca p aram etri;

5 .5 .1 Crearea g rupurilor de constante

D eoare c e oric e v ariab ila a une i interfe te e ste im p lic it d e c larata cu public,static si final, interfe te le re p re z inta o m e tod a conv enab ila d e c reare a unorg rup uri d e constante care sa fie folosite g lob al ıntr-o ap licatie :

Page 134: Cristian Frasinaru-Curs Practic de Java.pdf

5 .5 . UT IL IT AT E A INT E RF E T E L O R 133

public interface Luni {

int IAN=1, FEB=2, ..., DEC=12;

}

Folosirea ac estor constante se fac e p rin e x p resii d e g enulNumeInterfata.constanta, ca ın e x e m p lul d e m ai jos:

if (luna < Luni.DEC)

luna ++

else

luna = Luni.IAN;

5 .5 .2 T ransm iterea m etodelor ca param etri

D eoare c e nu ex ista p ointeri p rop riu-z isi, transm ite rea m etod e lor ca p aram etrie ste realizata ın J av a p rin interm e d iul interfe te lor. A tunc i c and o m etod atre b uie sa p rim easc a ca arg um ent d e intrare o re fe rinta la o alta func tiene c e sara e x e cutie i sale , cunoscuta d oar la m om entul e x e cutie i, atunc i arg u-m entul resp e c tiv v a fi d e c larat d e tip ul une i interfe te care contine m e tod aresp e c tiv a. L a e x e cutie m e tod a v a p utea p rim i ca p aram etru oric e ob ie c t c eim p le m enteaz a interfata resp e c tiv a si d e c i contine si cod ul func tie i re sp e c tiv e ,ac easta urm and sa fie ap e lata norm al p entru a ob tine re zultatul d orit.

A c easta te h nic a, d enum ita si ca ll-ba ck , e ste e x tre m d e folosita ın J av asi tre b uie neap arat ınte leasa. S a consid e ram m ai m ulte e x e m p le p entru aclarifica lucrurile .

P rim ul e x e m p lu se re fe ra la e x p lorarea nod urilor unui g raf. In fiecarenod tre b uie sa se e x e cute p re lucrarea inform atie i d in nod ul resp e c tiv p rininterm e d iul une i func tii p rim ite ca p aram etru. P entru aceasta, v om d efini ointerfata Functie care v a sp e c ifica m e tod a trim isa ca p aram etru.

interface Functie {

public void executa(Nod u);

}

class Graf {

//...

void explorare(Functie f) {

//...

Page 135: Cristian Frasinaru-Curs Practic de Java.pdf

134 CAPIT O L UL 5 . INT E RF E T E

if (explorarea a ajuns in nodul v) {

f.executa(v);

//...

}

}

}

//Definim doua functii

class AfisareRo implements Functie {

public void executa(Nod v) {

System.out.println("Nodul curent este: " + v);

}

}

class AfisareEn implements Functie {

public void executa(Nod v) {

System.out.println("Current node is: " + v);

}

}

public class TestCallBack {

public static void main(String args[]) {

Graf G = new Graf();

G.explorare(new AfisareRo());

G.explorare(new AfisareEn());

}

}

A l d oilea x e m p lu v a fi p re z entat ın se c tiunea urm atoare , ıntruc at fac ep arte d in A P I-ul stand ard J av a si v or fi p use ın e v id enta, p rin interm e d iulsau, si alte te h nic i d e p rog ram are .

5 .6 Interfata FilenameFilter

Instante le c lase lor c e im p le m enteaz a ac easta interfata sunt folosite p entru acrea filtre p entru fisie re si sunt p rim ite ca arg um ente d e m e tod e care listeaz acontinutul unui d ire c tor, cum ar fi m etod a list a clase i File.A sad ar, p ute m sp une c a m e tod a list p rim e ste ca arg um ent o alta func tiecare sp e c ific a d ac a un fisie r v a fi returnat sau nu (crite riul d e filtrare).

Page 136: Cristian Frasinaru-Curs Practic de Java.pdf

5 .6 . INT E RF AT A FILENAMEFILTER 135

Interfata FilenameFilter are o sing ura m e tod a: accept care sp e c ific ac rite riul d e filtrare si anum e , te steaz a d ac a num e le fisie rului p rim it ca p ara-m e tru ınd e p line ste cond itiile d orite d e noi.

D efinitia interfe te i e ste :

public interface FilenameFilter {

public boolean accept(File dir, String numeFisier);

}

A sad ar, oric e c lasa d e sp e c ificare a unui filtru care im p le m ente z a interfataFilenameFilter tre b uie sa im p le m ente z e m e tod a accept a aceste i interfe te .A c e ste c lase m ai p ot av ea si alte m e tod e , d e e x e m p lu un constructor care sap rim easca crite riul d e filtrare . In g eneral, o c lasa d e sp e c ificare a unui filtruare urm atorul form at:

class FiltruFisiere implements FilenameFilter {

String filtru;

// Constructorul

FiltruFisiere(String filtru) {

this.filtru = filtru;

}

// Implementarea metodei accept

public boolean accept(File dir, String nume) {

if (filtrul este indeplinit)

return true;

else

return false;

}

}

M e tod e le c e le m ai uzuale ale c lase i String folosite p entru filtrarea fisie re lorsunt:

• endsW ith - te steaz a d ac a un sir are o anum ita te rm inatie

• index O f - te steaz a d ac a un sir contine un anum it sub sir, re turnandp oz itia ac estuia, sau 0 ın caz contrar.

Page 137: Cristian Frasinaru-Curs Practic de Java.pdf

136 CAPIT O L UL 5 . INT E RF E T E

Instante le c lase lor p entru filtrare sunt p rim ite ca arg um ente d e m e tod ed e listare a continutului unui d ire c tor. O astfe l d e m e tod a e ste list d inc lasa File:

String[] list (FilenameFilter filtru)

Ob serv ati c a aic i interfata este folosita ca un tip d e d ate , ea fiind sub sti-tuita cu oric e c lasa care o im p le m enteaz a. A c e sta este un ex e m p lu tip ic d etransm ite re a une i func tii (func tia d e filtrare accept) ca arg um ent al une im e tod e .

S a consid e ram e x e m p lul com p le t ın care d orim sa listam fisie re le d in d i-re c torul curent care au o anum ita e x tensie .

L isting 5.6: L istarea fisie re lor cu o anum ita e x tensie

/* Listarea fisierelor din directorul curent

care au anumita extensie primita ca argument.

Daca nu se primeste nici un argument , vor fi listate toate

.

*/

import java.io.*;

class Listare {

public static void main(String [] args) {

try {

File director = new File(".");

String [] list;

if (args.length > 0)

list = director.list(new Filtru(args [0]));

else

list = director.list();

for(int i = 0; i < list.length; i++)

System.out.println(list[i]);

} catch(Exception e) {

e.printStackTrace ();

}

}

}

class Filtru implements FilenameFilter {

String extensie;

Filtru (String extensie) {

this.extensie = extensie;

Page 138: Cristian Frasinaru-Curs Practic de Java.pdf

5 .6 . INT E RF AT A FILENAMEFILTER 137

}

public boolean accept (File dir , String nume) {

return ( nume.endsWith("." + extensie) );

}

}

5 .6 .1 F olosirea claselor anonim e

In cazul ın care nu av e m ne v oie d e c lasa care re p re z inta filtrul p entru listareafisie re lor d intr-un d ire c tor d e c at o sing ura d ata, p entru a e v ita crearea une inoi c lase d e sine statatoare care sa fie folosita p entru instantie rea unui sing urob ie c t, p ute m folosi c lasa interna anonim a, ac easta situatie fiind un ex e m p lutip ic d e folosire a ac estora.

L isting 5.7: Folosirea une i c lase anonim e

/* Listarea fisierelor din directorul curent

folosind o clasa anonima pentru filtru.

*/

import java.io.*;

class Listare {

public static void main(String [] args) {

try {

File director = new File(".");

String [] list;

if (args.length > 0) {

final String extensie = args [0];

list = director.list(new FilenameFilter () {

// Clasa interna anonima

public boolean accept (File dir , String nume) {

return ( nume.endsWith("." + extensie) );

}

});

}

else

list = director.list();

for(int i = 0; i < list.length; i++)

System.out.println(list[i]);

} catch(Exception e) {

e.printStackTrace ();

}

Page 139: Cristian Frasinaru-Curs Practic de Java.pdf

138 CAPIT O L UL 5 . INT E RF E T E

}

}

A sad ar, o m od alitate uzuala d e folosire a c lase lor anonim e p entru instantie reaunui ob ie c t care tre b uie sa re sp e c te o interfata e ste :

metoda(new Interfata() {

// Implementarea metodelor interfetei

});

5 .7 Com pararea ob iectelor

A m v azut ın p rim ul cap itol c a o solutie fac ila si efic ienta d e sortare a unuiv e c tor este folosirea m etod e i sort d in c lasa java.util.Arrays.

int v[]={3, 1, 4, 2};

java.util.Arrays.sort(v);

// Sorteaza vectorul v

// Acesta va deveni {1, 2, 3, 4}

In cazul ın care e le m ente le d in v e c tor sunt d e tip p rim itiv , ca in e x e m -p lul d e m ai sus, nu ex ista nic i o p rob le m a ın a d ete rm ina ord inea fireasc aa e le m ente lor. Ce se ıntam p la ınsa atunc i c and v e c torul contine re fe rinte laob ie c te d e un anum it tip ? S a consid e ram urm atorul e x e m p lu, ın care d orimsa sortam un v e c tor form at d in instante ale c lase i Persoana, d efinita m ai jos:

L isting 5.8: Clasa P ersoana (fara sup ort p entru com p arare)

class Persoana {

int cod;

String nume;

public Persoana(int cod , String nume) {

this.cod = cod;

this.nume = nume;

}

public String toString () {

return cod + " \t " + nume;

}

}

Page 140: Cristian Frasinaru-Curs Practic de Java.pdf

5 .7 . CO M PARARE A O B IE CT E L O R 139

P rog ram ul urm ator ar tre b ui sa sorte z e un v e c tor d e p e rsoane :

L isting 5.9: S ortarea unui v e c tor d e tip re fe rinta

class Sortare {

public static void main(String args []) {

Persoana p[] = new Persoana [4];

p[0] = new Persoana(3, "Ionescu");

p[1] = new Persoana(1, "Vasilescu");

p[2] = new Persoana(2, "Georgescu");

p[3] = new Persoana(4, "Popescu");

java.util.Arrays.sort(p);

System.out.println("Persoanele ordonate dupa cod:");

for(int i=0; i<p.length; i++)

System.out.println(p[i]);

}

}

L a e x e cutia ac este i ap licatii v a fi ob tinuta o e x c e p tie , d eoare c e m e tod asort nu stie care este ord inea naturala a ob ie c te lor d e tip Persoana. V atre b ui, ıntr-un fe l sau altul, sa sp e c ific am ac est lucru.

5 .7 .1 Interfata Comparable

Interfata Comparable im p une o ord ine totala asup ra ob ie c te lor une i c lase c eo im p le m enteaz a. A c easta ord ine se num e ste o rd in ea n a tu ra la a clase i si e stesp e c ificata p rin interm e d iul m e tod e i com pareT o. D efinitia interfe te i e ste :

public interface Comparable {

int compareTo(Object o);

}

A sad ar, o c lasa ale c are i instante tre b uie sa fie com p arab il v a im p le m entam etod a compareTo care tre b uie sa re turnez e :

• o valoare strict neg ativa: d ac a ob ie c tul curent (this) este m ai m icd e c a ob ie c tul p rim it ca arg um ent;

• zero: d ac a ob ie c tul curent este ega l d e c a ob ie c tul p rim it ca arg um ent;

Page 141: Cristian Frasinaru-Curs Practic de Java.pdf

140 CAPIT O L UL 5 . INT E RF E T E

• o valoare strict poz itiva: d ac a ob ie c tul curent este m ai m a re d e c aob ie c tul p rim it ca arg um ent.

R eam intim c a m e tod a equals, m ostenita d in Object d e toate c lase le ,d e te rm ina d ac a d oua ob ie c te sunt e g ale (au ace easi v aloare). S p unem c aord inea naturala a une i c lase C e ste co n siten ta cu equals d ac a si num aid ac a (e1.compareTo((Object)e2) == 0) are ac e eassi v aloare log ic a cue1.equals((Object)e2, p entru oric e e1, e2 instante ale lui C.

null nu este instanta a nic i une i c lase si e.compareTo(null) tre b uie saarunce o e x c e p tie d e tip NullPointerException ch iar d ac a e.equals(null)

returneaz a false.

S a p re sup unem c a d orim ca ord inea naturala a p ersoanelor sa fie d up acod ul lor intern.

L isting 5.10: Clasa P ersoana cu sup ort p entru com p arare

class Persoana implements Comparable {

int cod;

String nume;

public Persoana(int cod , String nume) {

this.cod = cod;

this.nume = nume;

}

public String toString () {

return cod + " \t " + nume;

}

public boolean equals(Object o) {

if (!(o instanceof Persoana))

return false;

Persoana p = (Persoana) o;

return (cod == p.cod) && (nume.equals(p.nume));

}

public int compareTo(Object o) {

if (o==null)

throw new NullPointerException ();

if (!(o instanceof Persoana))

throw new ClassCastException("Nu pot compara!");

Persoana p = (Persoana) o;

Page 142: Cristian Frasinaru-Curs Practic de Java.pdf

5 .7 . CO M PARARE A O B IE CT E L O R 141

return (cod - p.cod);

}

}

Ob serv ati folosirea op eratorului instanceof, care v e rific a d ac a un ob ie c te ste instanta a une i anum ite c lase . M e tod a compareTo v a arunca o e x c e p tied e tip ul ClassCastException d ac a se ınc earc a com p ararea unui ob ie c t d etip Persoana cu un ob ie c t d e alt tip . M e tod a equals v a returna, p ur sisim p lu, false.

5 .7 .2 Interfata Comparator

In cazul ın care d orim sa sortam e le m ente le unui v e c tor c e contine re fe rinted up a alt crite riu d e c at ord inea naturala a e le m enete lor, av e m ne v oie d e o altasolutie . A c easta este oferita tot d e m e tod a sort d in c lasa java.util.Arrays,d ar ın v arianta ın care , p e lang a v e c torul c e tre b uie sortat, v om transm iteun arg um ent d e tip Comparator care sa sp e c ific e m od alitatea d e com p ararea e le m ente lor.

Interfata java.util.Comparator contine m e tod a com pare, care im p uneo ord ine totala asup ra e le m ente lor une i cole c tii. A c easta returneaz a un ıntre gcu ac e easi se m nificatie ca la m etod a compareTo a interfe te i Comparator siare urm atoarea d efinitie : int compare(Object o1, Object o2);

S a p re sup unem c a d orim sa sortam p e rsoanele ord onate d up a num e le lor.P entru d efinirea com p aratorului v om folosi o c lasa anonim a.

L isting 5.11: S ortarea unui v e c tor folosind un com p arator

import java.util .*;

class Sortare {

public static void main(String args []) {

Persoana p[] = new Persoana [4];

p[0] = new Persoana(3, "Ionescu");

p[1] = new Persoana(1, "Vasilescu");

p[2] = new Persoana(2, "Georgescu");

p[3] = new Persoana(4, "Popescu");

Arrays.sort(p, new Comparator () {

public int compare(Object o1, Object o2) {

Persoana p1 = (Persoana)o1;

Persoana p2 = (Persoana)o2;

return (p1.nume.compareTo(p2.nume));

Page 143: Cristian Frasinaru-Curs Practic de Java.pdf

142 CAPIT O L UL 5 . INT E RF E T E

}

});

System.out.println("Persoanele ordonate dupa nume:");

for(int i=0; i<p.length; i++)

System.out.println(p[i]);

}

}

Ob serv ati cum com p ararea a d oua siruri d e caractere se fac e tot cu m etod acompareTo, c lasa String im p le m enand interfata Comparable.

5 .8 A daptori

In cazul ın care o interfata contine m ai m ulte m e tod e si, la un m om entd at, av e m ne v oie d e un ob ie c t care im p le m enteaz a interfata resp e c tiv d ar nusp e c ific a cod d e c at p entru o sing ura m e tod a, e l tre b ui totusi sa im p le m ente z etoate m e tod e le interfe te i, ch iar d ac a nu sp e c ific a nic i un cod .

interface X {

void metoda_1();

void metoda_2();

...

void metoda_n();

}

...

// Avem nevoie de un obiect de tip X

// ca argument al unei functii

functie(new X() {

public void metoda_1() {

// Singura metoda care ne intereseaza

...

}

// Trebuie sa apara si celelalte metode

// chiar daca nu au implementare efectiva

public void metoda_2() {}

public void metoda_3() {}

...

public void metoda_n() {}

Page 144: Cristian Frasinaru-Curs Practic de Java.pdf

5 .8 . AD APT O RI 143

});

A c easta ab ord are p oate fi nep lacuta d ac a av e m fre c v ent nev oie d e ob ie c teale unor c lase c e im p le m enteaz a interfata X. S olutia la ac easta p rob le m a e stefolosirea adaptorilor.

D efi nitieU n a d a p to r e ste o c lasa ab stracta care im p le m enteaz a o anum ita interfata

fara a sp e c ifica cod nic i une i m e tod e a interfe te i.

public abstract class XAdapter implements X {

public void metoda_1() {}

public void metoda_2() {}

...

public void metoda_n() {}

}

In situatia c and av e m ne v oie d e un ob ie c t d e tip X v om folosi c lasaab stracta, sup rad efinind d oar m etod a care ne intereseaz a:

functie(new XAdapter() {

public void metoda_1() {

// Singura metoda care ne intereseaza

...

}

});

M ai m ulte e x e m p le d e folosire a ad ap torilor v or fi d ate ın cap itolul ” Interfatag rafic a cu utilizatorul” .

Page 145: Cristian Frasinaru-Curs Practic de Java.pdf

144 CAPIT O L UL 5 . INT E RF E T E

Page 146: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 6

O rg anizarea claselor

6 .1 P ach ete

D efi nitieU n pa ch et e ste o cole c tie d e c lase si interfe te ınrud ite d in p unctul d e

v e d e re al func tionalitatii lor. S unt folosite p entru g asirea si utilizarea m aiusoara a c lase lor, p entru a ev ita confl ic te le d e num e si p entru a controlaac c esul la anum ite c lase . In alte lim b aje d e p rog ram are p ach e te le se m ainum esc lib rarii sau b ib iliote c i.

6 .1.1 P ach etele standard (J2 S D K )

P latform a stand ard d e lucru J av a se b az eaz a p e o serie d e p ach e te cu ajutorulc arora se p ot construi ıntr-o m aniera sim p lificata ap licatiile . E x ista d e c i unset d e c lase d e ja im p le m entate care m od e leaz a structuri d e d ate , alg oritm i saud iv e rse notiuni esentiale ın d e z v oltarea unui p rog ram . Cele m ai im p ortantep ach e te si sup ortul oferit d e lor sunt:

• java.lang - c lase le d e b az a ale lim b ajului J av a

• java.io - intrari/ ie siri, lucrul cu fisie re

• java.util - c lase si interfe te utile

• java.applet - d e z v oltarea d e ap p le turi

145

Page 147: Cristian Frasinaru-Curs Practic de Java.pdf

146 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

• java.aw t - interfata g rafic a cu utilizatorul

• java.aw t.event - m e canism e le d e tratare e e v enim ente lor g enerate d eutilizator

• java.b eans - sc rie rea d e com p onente reutilizab ile

• java.net - p rog ram are d e re tea

• java.sq l - lucrul cu b az e d e d ate

• java.rm i - e x e cutie la d istanta R em o te M essa ge In terfa ce

• java.security - m e canism e d e se curitate : c rip tare , autentificare

• java.m ath - op e ratii m ate m atic e cu num ere m ari

• java.tex t - lucrul cu te x te , d ate si num ere ind e p end ent d e lim b a

• java.lang .refl ect - introsp e c tie

• javax .sw ing - interfata g rafic a cu utilizatorul, m ult ım b og atita fata d eA W T .

• ...

6 .1.2 F olosirea m em b rilor unui pach et

Conform sp e c ificatiilor d e ac c e s ale une i c lase si ale m e b rilor e i, d oar c lase lep ub lic e si m e m b rii d e c larati p ub lic i ai une i c lase sunt ac c e sib ili ın afara p a-ch e tului ın care se g ase sc . D up a cum am v azut ın se c tiunea ” S p e c ificatorid e ac c e s p entru m e m b rii une i c lase ” , ac c e sul im p lic it ın J av a este la niv e l d epa ch et.

P entru a folosi o c lasa p ub lic a d intr-un anum it p ach e t, sau p entru a ap e lao m etod a p ub lic a a une i c lase p ub lic e a unui p ach e t, e x ista tre i solutii:

• sp e c ificarea num e lui com p le t al c lase i

• im p ortul c lase i re sp e c tiv e

• im p ortul ıntre g ului p ach e t ın care se g ase ste c lasa.

Page 148: Cristian Frasinaru-Curs Practic de Java.pdf

6 .1 . PACH E T E 147

S p e c ificarea n u m elu i co m p let al c lase i se fac e p rin p refix area n u m elu i scu rtal c lase i cu num e le p ach e tului d in care fac e p arte : numePachet.NumeClasa.

Button - numele scurt al clasei

java.awt - pachetul din care face parte

java.awt.Button - numele complet al clasei

A c easta m e tod a e ste re com and ata d oar p entru cazul ın care folosireaac e le i c lase se fac e o sing ura d ata sau foarte rar.

D e e x e m p lu, ar fi e x tre m d e ne p lacut sa sc rie m d e fie care d ata c and v re msa d e c laram un ob ie c t g rafic se c v ente d e g enul:

java.awt.Button b1 = new java.awt.Button("OK");

java.awt.Button b2 = new java.awt.Button("Cancel");

java.awt.TextField tf1 = new java.awt.TextField("Neplacut");

java.awt.TextField tf2 = new java.awt.TextField("Tot neplacut");

In ac este situatii, v om im p orta ın ap licatia noastra c lasa resp e c tiv a, sauıntre g p ach e tul d in care fac e p arte . A c e st lucru se realiz eaz a p rin instruc tiuneaim port, care tre b uie sa ap ara la ınc e p utul fisie re lor sursa, ınainte d e d e c larareav reune i c lase sau interfe te .

6 .1.3 Im portul unei clase sau interfete

S e fac e p rin instruc tiunea im port ın care sp e c ific am num e le com p le t al c lase isau interfe te i p e care d orim sa o folosim d intr-un anum it p ac e h e t:

import numePachet.numeClasa;

//Pentru exemplul nostru:

import java.awt.Button;

import java.awt.TextField;

D in ac est m om ent, v om p utea folosi ın c lase le fisie rului ın care am p lasatinstruc tiunea d e im p ort num e le scurt al c lase lor Button si TextField:

Button b1 = new Button("OK");

Button b2 = new Button("Cancel");

TextField tf1 = new TextField("Placut");

TextField tf2 = new TextField("Foarte placut");

Page 149: Cristian Frasinaru-Curs Practic de Java.pdf

148 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

A c easta ab ord are este efic ienta si re com and ata ın cazul ın care nu av e mne v oie d e c at d e c ate v a c lase d in p ach e tul resp e c tiv . D ac a ın e x e m p lul nostruam av ea nev oie si d e c lase le Line, Point, Rectangle, Polygon, ar tre b ui saav e m c ate o instruc tiune d e im p ort p entru fiecare d intre e le :

import java.awt.Button;

import java.awt.TextField;

import java.awt.Rectangle;

import java.awt.Line;

import java.awt.Point;

import java.awt.Polygon;

In ac easta situatie ar fi m ai sim p lu sa folosim im p ortul la c ere re d in ıntre g ulp ach e t si nu al fie c are i c lase ın p arte .

6 .1.4 Im portul la cerere dintr-un pach et

Im p ortul la c ere re d intr-un anum it p ach e t se fac e p rintr-o instruc tiune importın care sp e c ific am num e le p ach e tului ale c arui c lase si interfe te d orim sa lefolosim , urm at d e sim b olul*. S e num e ste im po rt la cerere d eoare c e ınc arcareac lase lor se fac e d inam ic , ın m om entul ap e larii lor.

import numePachet.*;

//Pentru exemplul nostru:

import java.awt.*;

D in ac est m om ent, v om p utea folosi ın c lase le fisie rului ın care am p lasatinstruc tiunea d e im p ort num e le scurt al tuturor c lase lor p ach e tului im p ortat:

Button b = new Button("OK");

Point p = new Point(0, 0);

A tentie* nu are se m nificatia uzuala d e la fisie re d e w ild card (m asc a) si nu p oate fi

folosit d e c at ca atare . O ex p resie d e g enul import java.awt.C*; v a p rod uc eo eroare d e com p ilare .

Page 150: Cristian Frasinaru-Curs Practic de Java.pdf

6 .1 . PACH E T E 149

In cazul ın care sunt im p ortate d oua sau m ai m ulte p ach e te care continc lase (interfe te ) cu ac e lasi num e , atunc i re fe rirea la e le tre b uie facuta d oarfolosind num e le com p le t, ın caz contrar fiind se m nalata o a m bigu ita te d ec atre com p ilator.

import java.awt.*;

// Contine clasa List

import java.util.*;

// Contine interfata List

...

List x; //Declaratie ambigua

java.awt.List a = new java.awt.List(); //corect

java.util.List b = new ArrayList(); //corect

S unt consid e rate im p ortate autom at, p entru oric e fisie r sursa, urm atoare lep ach e te :

• p ach e tul java.lang

import java.lang.*;

// Poate sau nu sa apara

// Mai bine nu...

• p ach e tul curent

• p ach e tul im p lic it (fara num e)

6 .1.5 Im portul static

A c easta fac ilitate , introd usa ınc e p and cu v ersiunea 1.5, p e rm ite re fe rirea con-stante lor static e ale une i c lase fara a m ai sp e c ifica num e le com p le t al ac es-te ia si e ste im p le m entata p rin ad aug area cuv antului ch e ie static d up a c e l d eimport:

import static numePachet.NumeClasa.*;

A stfe l, ın loc sa ne re fe rim la constante le c lase i cu e x p re sii d e tip ulNumeClasa.CONSTANTA, p ute m folosi d oar num e le constante i.

Page 151: Cristian Frasinaru-Curs Practic de Java.pdf

150 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

// Inainte de versiuna 1.5

import java.awt.BorderLayout.*;

...

fereastra.add(new Button(), BorderLayout.CENTER);

// Incepand cu versiunea 1.5

import java.awt.BorderLayout.*;

import static java.awt.BorderLayout.*;

...

fereastra.add(new Button(), CENTER);

A tentieIm p ortul static nu im p orta d e c at constante le static e ale une i c lase , nu si

c lasa ın sine .

6 .1.6 Crearea unui pach et

T oate c lase le si interfe te le J av a ap artin la d iv e rse p ach e te , g rup ate d up afunc tionalitatea lor. D up a cum am v azut c lase le d e b az a se g ase sc ın p a-ch e tul java.lang, c lase le p entru intrari/ ie siri sunt ın java.io, c lase le p entruinterfata g rafic a ın java.awt, e tc .

Crearea unui p ach e t se realiz eaz a p rin scrie re la ınc e p utul fisie re lor sursac e contin c lase le si interfe te le p e care d orim sa le g rup am ıntr-un p ach e t ainstruc tiunii: pack ag e num eP ach et;

S a consid e ram un ex e m p lu: p re sup unem c a av e m d oua fisie re sursa Graf.javasi Arbore.java.

//Fisierul Graf.java

package grafuri;

class Graf {...}

class GrafPerfect extends Graf {...}

//Fisierul Arbore.java

package grafuri;

class Arbore {...}

Page 152: Cristian Frasinaru-Curs Practic de Java.pdf

6 .1 . PACH E T E 151

class ArboreBinar extends Arbore {...}

Clase le Graf, GrafPerfect, Arbore, ArboreBinar v or fac e p arte d inac e lasi p ach e t grafuri.

Instruc tiunea package ac tioneaz a asup ra ıntre g ului fisie r sursa la ınc e p utulc aruia ap are . Cu alte cuv inte nu p ute m sp e c ifica fap tul c a anum ite c lased intr-un fisie r sursa ap artin unui p ach e t, iar alte le altui p ach e t.

D ac a nu este sp e c ificat un anum it p ach e t, c lase le unui fisie r sursa v or fac ep arte d in p ach e tul im p lic it (care nu are nic i un num e). In g eneral, p ach e tulim p lic it e ste form at d in toate c lase le si inte fe te le d ire c torului curent d e lucru.E ste re com and at ınsa ca toate c lase le si inte fe te le sa fie p lasate ın p ach e te ,p ach e tul im p lic it fiind folosit d oar p entru ap licatii m ic i sau p rototip uri.

6 .1.7 D enum irea unui pach et

E x ista p osib ilitatea ca d oi p rog ram atori care lucreaz a la un p roie c t com unsa foloseasc a ac e lasi num e p entru unele d in c lase le lor. D e ase m enea, sep oate ca una d in c lase le une i ap licatii sa aib a ac e lasi num e cu o c lasa am e d iului J av a. A c e st lucru este p osib il atat tim p c at c lase le cu ac e lasi num ese g asesc ın p ach e te d ife rite , e le fiind d ife rentiate p rin p refix area lor cu num e lep ach e te lor.

Ce se ıntam p la ınsa c and d oi p rog ram atori care lucreaz a la un p roie c tcom un folosesc c lase cu ac e lasi num e , c e se g asesc ın p ach e te cu ac e lasi num e?

P entru a ev ita ac est lucru, com p aniile folosesc inv ersul d om eniului lorInternet ın d enum irea p ach e te lor im p le m entate ın cad rul com p anie i, cumar fi ro.companie.numePachet. In cad rul ac e le iasi com p anii, confl ic te le d enum e v or fi re zolv ate p rin d iv e rse conv entii d e uz intern, cum ar fi folosireanum e lui d e cont al p rog ram atorilor ın d enum irea p ach e te lor create d e ac e stia.D e e x e m p lu, p rog ram atorul cu num e le Ion al com p anie i XS oft, av and contulion@ x soft.ro, ısi v a p refix a p ach e te le cu ro.xsoft.ion, p entru a p erm iteid entificarea ın m od unic a c lase lor sale , ind ife rent d e conte x tul ın care ac esteav or fi inte g rate .

Page 153: Cristian Frasinaru-Curs Practic de Java.pdf

152 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

6 .2 O rg anizarea fi sierelor

6 .2 .1 O rg anizarea fi sierelor sursa

Oric e ap licatie ne b anala tre b uie sa fie construita folosind o org anizare ie r-arh ic a a com p onente lor sale . E ste re com and at ca strate g ia d e org anizare afisie re lor sursa sa re sp e c te urm atoare le conv entii:

• Cod ul sursa al c lase lor si interfe te lor sa se g aseasc a ın fisie re ale c arornum e sa fie ch iar num e le lor scurt si care sa aib a e x tensia .java.

A tentie

E ste ob lig atoriu ca o c lasa/ interfata p ub lic a sa se g aseasc a ıntr-unfisie r av and num e le c lase i(interfe te i) si e x tenisa .java, sau com p ilatorulv a furniza o eroare . D in ac est m otiv , ıntr-un fisie r sursa nu p ot e x istad oua c lase sau interfe te p ub lic e . P entru c lase le care nu sunt p ub lic eac est lucru nu este ob lig atoriu, c i d oar re com and at. Intr-un fisie r sursap ot e x ista oric ate c lase sau interfe te care nu sunt p ub lic e .

• Fisie re le sursa tre b uie sa se g aseasc a ın d ire c toare care sa re fl e c te nu-m e le p ach e te lor ın care se g ase sc c lase le si interfe te le d in ac e le fisie re .Cu alte cuv inte , un d ire c tor v a contine surse p entru c lase si interfe ted in ac e lasi p ach e t iar num e le d ire c torului v a fi ch iar num e le p ach e tu-lui. D ac a num e le p ach e te lor sunt form ate d in m ai m ulte unitati le x icalese p arate p rin p unct, atunc i ac estea tre b uie d e ase m enea sa coresp und aunor d ire c toare c e v or d esc rie calea sp re fisie re le sursa ale c aror c lasesi interfe te fac p arte d in p ach e te le re sp e c tiv e .

V om c larifica m od alitatea d e org anizare a fisie re lor sursa ale une i ap licatiip rintr-un ex e m p lu concret. S a p re sup unem c a d orim c rearea unor com p o-nente care sa re p re z inte d iv e rse notiuni m ate m atic e d in d om enii d ife rite ,cum ar fi g eom etrie , alg e b ra, analiz a, e tc . P entru a sim p lifica lucrurile , sap re sup unem c a d orim sa c re am c lase care sa d e sc rie urm atoare le notiuni:po ligo n , cerc, po lied ru , sfera , gru p , fu n c tie .O p rim a v arianta ar fi sa construim c ate o c lasa p entru fiecare si sa le p lasam

Page 154: Cristian Frasinaru-Curs Practic de Java.pdf

6 .2 . O RG ANIZ ARE A F ISIE RE L O R 153

ın ac e lasi d ire c tor ım p reuna cu un p rog ram care sa le foloseasca, ınsa, av andın v e d e re p osib ila e x tind ere a ap licatie i cu noi re p re z entari d e notiuni m ate m -atic e , ac easta ab ord are ar fi inefic ienta.

O ab ord are e le g anta ar fi ace ea ın care c lase le care d e sc riu notiuni d inac e lasi d om eniu sa se g aseasca ın p ach e te se p arate si d ire c toare se p arate .Ie rarh ia fisie re lor sursa ar fi:

/matematica

/surse

/geometrie

/plan

Poligon.java

Cerc.java

/spatiu

Poliedru.java

Sfera.java

/algebra

Grup.java

/analiza

Functie.java

Matematica.java

Clase le d e sc rise ın fisie re le d e m ai sus tre b uie d e c larate ın p ach e te d enu-m ite coresp unzator cu num e le d ire c toare lor ın care se g asesc :

// Poligon.java

package geometrie.plan;

public class Poligon { . . . }

// Cerc.java

package geometrie.plan;

public class Cerc { . . . }

// Poliedru.java

package geometrie.spatiu;

public class Poliedru { . . . }

Page 155: Cristian Frasinaru-Curs Practic de Java.pdf

154 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

// Sfera.java

package geometrie.spatiu;

public class Sfera { . . . }

// Grup.java

package algebra;

public class Grup { . . . }

// Functie.java

package analiza;

public class Functie { . . . }

Matematica.java e ste c lasa p rinc ip ala a ap licatie i.D up a cum se ob serv a, num e le lung al une i c lase tre b uie sa d e sc rie calea sp reac ea c lasa ın cad rul fisie re lor sursa, re lativ la d ire c torul ın care se g ase steap licatia.

6 .2 .2 O rg anizarea unitatilor de com pilare (.class)

In urm a com p ilarii fisie re lor sursa v or fi g enerate unitati d e com p ilare p entrufiecare c lasa si interfata d in fisie re le sursa. D up a cum stim ac estea au ex tensia.class si num e le scurt al c lase i sau interfe te i re sp e c tiv e .

S p re d eose b ire d e org anizarea surse lor, un fisie r .class treb uie sa seg aseasca ıntr-o ie rarh ie d e d ire c toare care sa re fl e c te num e le p ach e tului d incare fac e p arte c lasa resp e c tiv a.

Im p lic it, ın urm a com p ilarii fisie re le sursa si unitatile d e com p ilare seg ase sc ın ac e lasi d ire c tor, ınsa e le p ot fi ap oi org anizate se p arat. E ste re co-m and atınsa ca ac easta se p arare sa fie facuta autom at la com p ilare .

R e v enind la e x e m p lul d e m ai sus, v om av ea urm atoarea org anizare :

/matematica

/clase

/geometrie

/plan

Poligon.class

Cerc.class

/spatiu

Page 156: Cristian Frasinaru-Curs Practic de Java.pdf

6 .2 . O RG ANIZ ARE A F ISIE RE L O R 155

Poliedru.class

Sfera.class

/algebra

Grup.class

/analiza

Functie.class

Matematica.class

Crearea ac este i structuri ie rarh ic e e ste facuta autom at d e c atre com p ilator.In d ire c torul ap licatie i (matematica) cre am sub d ire c torul clase si d am co-m and a:

javac -sourcepath surse surse/Matematica.java -d clase

sau

javac -classpath surse surse/Matematica.java -d clase

Op tiunea -d sp e c ific a d ire c torul rad ac ina al ie rarh ie i d e c lase . In lip salui, fie care unitate d e com p ilare v a fi p lasata ın ac e lasi d ire c tor cu fisie rul sausursa.D eoare c e com p ilam c lasa p rinc ip ala a p licatie i, v or fi com p ilate ın cascad atoate c lase le re fe rite d e ac easta, d ar num ai ac estea. In cazul ın care d orim sacom p ilam e x p lic it toate fisie re le jav a d intr-un anum it d ire c tor, d e e x e m p lusurse/geometrie/plan, p ute m folosi e x p re sia:

javac surse/geometrie/plan/*.java -d clase

6 .2 .3 N ecesitatea org aniz arii fi sierelor

Org anizarea fisie re lor sursa e ste ne c esara d eoare c e ın m om entul c and com p i-latorul ıntalneste un num e d e c lasa e l tre b uie sa p oata id entifica ac ea c lasa,c e ea c e ınseam na c a tre b uie sa g aseasc a fise rul sursa care o contine .

S im ilar, unitatile d e com p ilare sunt org anizate astfe l p entru a d a p osib il-itatea interp re torului sa g aseasc a si sa ıncarc e ın m e m orie o anum ita c lasa ıntim p ul e x e cutie i p rog ram ului.

Insa ac easta org anizare nu este sufic ienta d eoare c e sp e c ific a num ai p arteafinala d in calea c atre fisie re le .jav a si .c lass, d e e x e m p lu/matematica/clase/geometrie/plan/Poligon.class. P entru aceasta, atatla com p ilare c at si la interp re tare tre b uie sp e c ificata lista d e d ire c toare rad ac ina

Page 157: Cristian Frasinaru-Curs Practic de Java.pdf

156 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

ın care se g ase sc fisie re le ap licatie i. A c easta lista se num e ste ca le d e ca u ta re(cla sspa th ).

D efi nitieO ca le d e c a u ta re e ste o lista d e d ire c toare sau arh iv e ın care v or fi c autate

fisie re le ne c e sare une i ap licatii. Fie care d ire c tor d in calea d e cautare ested ire c torul im e d iat sup erior structurii d e d ire c toare coresp unz atoare num e lorp ach e te lor ın care se g ase sc c lase le d in d ire c torul resp e c tiv , astfe l ınc at com p i-latorul si interp re torul sa p oata construi calea com p le ta sp re c lase le ap licatie i.Im p lic it, calea d e c autare este form ata d oar d in d ire c torul curent.

S a consid e ram c lasa p rinc ip ala a ap licatie i Matematica.java:

import geometrie.plan.*;

import algebra.Grup;

import analiza.Functie;

public class Matematica {

public static void main(String args[]) {

Poligon a = new Poligon();

geometrie.spatiu.Sfera = new geometrie.spatiu.Sfera();

//...

}

}

Id entificarea une i c lase re fe rite ın p rog ram se fac e ın fe lul urm ator:

• L a d ire c toare le afl ate ın calea d e c autare se ad aug a sub d ire c toare lesp e c ificate ın im p ort sau ın num e le lung al c lase i

• In d ire c toare le form ate este c autat un fisie r cu num e le c lase i. In cazulın care nu este g asit nic i unul sau sunt g asite m ai m ulte v a fi se m nalatao eroare .

6 .2 .4 S etarea caii de cautare (CL A S S P A T H )

S e tarea c aii d e c autare se p oate fac e ın d oua m od alitati:

• S e tarea v ariab ile i d e m e d iu CL A S S P A T H - folosind ac easta v ariantatoate ap licatiile J av a d e p e m asina resp e c tiv a v or c auta c lase le ne c e sareın d ire c toare le sp e c ificate ın v ariab ila CLASSPATH.

Page 158: Cristian Frasinaru-Curs Practic de Java.pdf

6 .3 . ARH IV E J AR 157

UNIX:

SET CLASSPATH = cale1:cale2:...

DOS shell (Windows 95/NT/...):

SET CLASSPATH = cale1;cale2;...

• Folosirea op tiunii -classpath la com p ilarea si interp re tarea p rog ram e lor- d ire c toare le sp e c ificate astfe l v or fi v alab ile d oar p entru com and acurenta:

javac - classpath <cale de cautare> <surse java>

java - classpath <cale de cautare> <clasa principala>

L ansarea ın e x e cutie a ap licatie i noastre , d in d ire c torul matematica, sev a fac e astfe l:

java -classpath clase Matematica

In concluz ie , o org anizare efic ienta a fisie re lor ap licatie i ar arata astfe l:

/matematica

/surse

/clase

compile.bat

(javac -sourcepath surse surse/Matematica.java -d clase)

run.bat

(java -classpath clase Matematica)

6 .3 A rh ive JA R

Fisie re le JA R (J av a A rch iv e ) sunt arh iv e ın form at Z IP folosite p entruım p ach e tarea ap licatiilor J av a. E le p ot fi folosite si p entru com p rim ariob isnuite , d ife renta fata d e o arh iv a Z IP ob isnuita fiind d oar e x istenta unuid ire c tor d enum it META-INF, c e contine d iv e rse inform atii aux iliare le g ate d eap licatia sau clase le arh iv ate .

U n fisie r J A R p oate fi creat folosind utilitarul jar afl at ın d istrib utiaJ 2S D K , sau m etod e ale c lase lor sup ort d in p ach e tul java.util.jar.

D intre b enefic iile ofe rite d e arh iv e le J A R am intim :

• p ortab ilitate - e ste un form at d e arh iv are ind e p end ent d e p latform a;

Page 159: Cristian Frasinaru-Curs Practic de Java.pdf

158 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

• com p resare - d im ensiunea une i ap licatii ın form a sa finala este re d usa;

• m inim izarea tim p ului d e ıncarcare a unui ap p le t: d ac a ap p le tul (fisie rec lass, resurse , e tc ) e ste com p resat ıntr-o arh iv a J A R , e l p oate fi ınc arcatıntr-o sing ura tranzac tie H T T P , fara a fi d e c i ne v oie d e a d esch id e c ateo conex iune noua p entru fiecare fisie r;

• se curitate - arh iv e le J A R p ot fi ” se m nate ” e le c tronic

• m e canism ul p entru lucrul cu fisie re J A R e ste p arte inte g rata a p lat-form e i J av a.

6 .3 .1 F olosirea utilitarului jar

A rh iv atorul ja r se g ase ste ın sub d ire c torul bin al d ire c torului ın care e steinstalat k itul J 2S D K . M ai jos sunt p re z entate p e scurt op eratiile uzuale :

• Crearea une i arh iv ejar cf arhiva.jar fisier(e)-intrare

• V izualizare continutuluijar tf nume-arhiva

• E x trag erea continutuluijar xf arhiva.jar

• E x trag erea d oar a unor fisie rejar xf arhiva.jar fisier(e)-arhivate

• E x e cutarea une i ap licatiijava -jar arhiva.jar

• D e sch id e rea unui ap p le t arh iv at<applet code=A.class archive="arhiva.jar" ...>

E x e m p le :

• A rh iv area a d oua fisie re c lass:jar cf classes.jar A.class B.class

• arh iv area tuturor fisie re lor d in d ire c torul curent:jar cvf allfiles.jar *

Page 160: Cristian Frasinaru-Curs Practic de Java.pdf

6 .3 . ARH IV E J AR 159

6 .3 .2 E x ecutarea aplicatiilor arh ivate

P entru a rula o ap licatie ım p ach e tata ıntr-o arh iv a J A R tre b uie sa fac e mcunoscuta interp re torului num e le c lase i p rinc ip ale a ap licatie i. S a consid e ramurm atorul e x e m p lu, ın care d orim sa arh iv am c lase le ap licatie i d e sc rise m aisus, ın care c lasa p rinc ip ala era Matematica.java. D in d ire c torul clase v omlansa com and a:

jar cvf mate.jar geometrie analiza algebra Matematica.class

In urm a ac este i com enz i v om ob tine arh iv a mate.jar. D ac a v om ınc e rcasa lansam ın e x e cutie ac easta arh iv a p rin com and a java -jar mate.jar

v om ob tine urm atoarea eroare : ” Faile d to load M ain-Class m anife st fromm ate .jar” . A c easta ınseam na c a ın fiserul Manifest.mf c e se g ase ste ın d i-re c torul META-INF tre b uie sa ınre g istram c lasa p rinc ip ala a ap licatie i. A c e stlucru ıl v om fac e ın d oi p asi:

• se c re eaz a un fisie r cu un num e oare care , d e e x e m p lu manifest.txt,ın care v om scrie :Main-Class: Matematica

• ad aug am ac easta inform atie la fisie rul m anife st al arh iv e i m ate .jar:jar uvfm mate.jar manifest.txt

A m b e le op e ratii p uteau fi ex e cutate ıntr-un sing ur p as:

jar cvfm mate.jar manifest.txt

geometrie analiza algebra Matematica.class

P e siste m e le W in32, p latform a J av a 2 v a asoc ia e x tensiile .jar cu inter-p re torul J av a, c e ea c e ınseam na c a fac and d ub lu-c lick p e o arh iv a J A R v a filansata ın e x e cutie ap licatia ım p ach e tata ın ac ea arh iv a (d ac a e x ista o c lasap rinc ip ala).

Page 161: Cristian Frasinaru-Curs Practic de Java.pdf

160 CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

Page 162: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 7

Colectii

7 .1 Introducere

O co lec tie e ste un ob ie c t care g rup eaz a m ai m ulte e le m ente ıntr-o sing uraunitate . P rin interm e d iul cole c tiilor v om av ea ac c e s la d ife rite tip uri d ed ate cum ar fi v e c tori, liste ınlantuite , stiv e , m ultim i m ate m atic e , tab e le d ed isp e rsie , e tc . Cole c tiile sunt folosite atat p entru m e m orarea si m anip ularead ate lor, c at si p entru transm ite rea unor inform atii d e la o m etod a la alta.

T ip ul d e d ate al e le m ente lor d intr-o cole c tie e ste Object, c e ea c e ınseam nac a m ultim ile re p re z entate sunt eterog ene , p utand inc lud e ob ie c te d e oric e tip .

Inc e p and cu v ersiunea 1.2, ın J av a cole c tiile sunt tratate ıntr-o m anieraunitara, fiind org anizate ıntr-o arh ite c tura foarte efic ienta si fl e x ib ila c e cup rind e :

• Interfete: tip uri ab stracte d e d ate c e d e sc riu cole c tiile si p e rm it uti-lizarea lor ind e p end ent d e d e taliile im p le m entarilor.

• Im plem entari: im p le m entari concrete ale interfe te lor c e d e sc riu cole c tii.A c e ste c lase re p re z inta tip u ri d e d a te reu tiliza bile .

• A lg oritm i: m e tod e care e fe c tueaz a d iv e rse op eratii utile cum ar fic autarea sau sortarea, d efinite p entru ob ie c te c e im p le m enteaz a interfe te lec e d e sc riu cole c tii. A c e sti alg oritm i se num esc si po lim o rfi ci d eoare c ep ot fi folositi p e im p le m entari d ife rite ale une i cole c tii, re p re z entande le m entul d e fu n c tio n a lita te reu tiliza bila .

U tilizarea cole c tiilor ofera av antaje e v id ente ın p roc esul d e d e z v oltare aune i ap licatii. Cele m ai im p ortante sunt:

161

Page 163: Cristian Frasinaru-Curs Practic de Java.pdf

162 CAPIT O L UL 7 . CO L E CT II

• R educerea efortului de prog ram are: p rin p unerea la d isp oz itiap rog ram atorului a unui set d e tip uri d e d ate si alg oritm i c e m od e leaz astructuri si op e ratii d e s folosite ın ap licatii.

• Cresterea vitezei si calitatii prog ram ului: im p le m entarile e fe c tiv eale cole c tiilor sunt d e ınalta p e rform anta si folosesc alg oritm i cu tim pd e lucru op tim .

A stfe l, la scrie rea une i ap licatii p ute m sa ne conc entram e forturile asup rap rob le m e i ın sine si nu asup ra m od ului d e re p re z entare si m anip ulare ainform atiilor.

7 .2 Interfete ce descriu colectii

Interfe te le re p re z inta nucleul m e canism ului d e lucru cu cole c tii, scop ul lorfiind d e a p erm ite utilizarea structurilor d e d ate ind e p end ent d e m od ul lord e im p le m entare .

Collection m od e leaz a o cole c tie la niv e lul c e l m ai g eneral, d e sc riind ung rup d e ob ie c te num ite si elem en tele sale . U ne le im p le m entari ale ac este iinterfe te p e rm it e x istenta e le m ente lor d up licate , alte im p le m entari nu. U n-e le au ele m ente le ord onate , alte le nu. P latform a J av a nu ofera nic i o im -p le m entare d ire c ta a ac este i interfe te , c i e x ista d oar im p le m entari ale unorsub interfe te m ai concrete , cum ar fi Set sau List.

public interface Collection {

// Metode cu caracter general

int size();

boolean isEmpty();

void clear();

Iterator iterator();

// Operatii la nivel de element

boolean contains(Object element);

boolean add(Object element);

boolean remove(Object element);

Page 164: Cristian Frasinaru-Curs Practic de Java.pdf

7 .2 . INT E RF E T E CE D E SCRIU CO L E CT II 163

// Operatii la nivel de multime

boolean containsAll(Collection c);

boolean addAll(Collection c);

boolean removeAll(Collection c);

boolean retainAll(Collection c);

// Metode de conversie in vector

Object[] toArray();

Object[] toArray(Object a[]);

}

S et m od e leaz a notiunea d e m u ltim e ın sens m ate m atic . O m ultim e nup oate av ea e le m ente d up licate , m ai b ine z is nu p oate contine d oua ob ie c te o1si o2 cu p rop rie tatea o1.eq u als(o2). M ostene ste m e tod e le d in Collection,fara a av ea alte m e tod e sp e c ific e .D oua d intre c lase le stand ard care ofera im p le m entari concrete ale ac este iinterfe te sunt H ash S et si T reeS et.

S ortedS et e ste ase m anatoare cu interfata Set, d ife renta p rinc ip ala constandın fap tul c a e le m ente le d intr-o astfe l d e cole c tie sunt ord onate asc end ent.P une la d isp oz itie op e ratii care b enefic iaz a d e av antajul ord onarii e le m ente lor.Ord onarea e le m ente lor se fac e conform ord inii lor naturale , sau conform cuord inea d ata d e un com p arator sp e c ificat la crearea cole c tie i si e ste m entinutaautom at la oric e op eratie e fe c tuata asup ra m ultim ii. S ing ura cond ittie e steca, p entru oric e d oua ob ie c te o1, o2 ale cole c tie i, ap e lul o1.com p ar eT o(o2)(sau com p ar ator.com p ar e(o1, o2), d ac a e ste folosit un com p arator) tre b uiesa fie v alid si sa nu p rov oac e e x c e p tii.

Fiind sub c lasa a interfe te i Set, m ostene ste m e tod e le ac este ia, oferindm e tod e sup lim entare c e tin cont d e fap tul c a m ultim ea este sortata:

public interface SortedSet extends Set {

// Subliste

SortedSet subSet(Object fromElement, Object toElement);

SortedSet headSet(Object toElement);

Page 165: Cristian Frasinaru-Curs Practic de Java.pdf

164 CAPIT O L UL 7 . CO L E CT II

SortedSet tailSet(Object fromElement);

// Capete

Object first();

Object last();

Comparator comparator();

}

Clasa care im p le m enteaz a ac easta interfata e ste T reeS et.

L ist d e sc rie liste (secven te ) d e e le m ente ind e x ate . L iste le p ot contined up licate si p e rm it un control p re c is asup ra p oz itie i unui e le m ent p rin in-term e d iul ind e x ului ac e lui e le m ent. In p lus, fatad e m e tod e le d efinite d einterfata Collection, av e m m e tod e p entru acc e s p oz itional, c autare si it-e rare av ansata. D efinitia interfe te i e ste :

public interface List extends Collection {

// Acces pozitional

Object get(int index);

Object set(int index, Object element);

void add(int index, Object element);

Object remove(int index);

abstract boolean addAll(int index, Collection c);

// Cautare

int indexOf(Object o);

int lastIndexOf(Object o);

// Iterare

ListIterator listIterator();

ListIterator listIterator(int index);

// Extragere sublista

List subList(int from, int to);

}

Page 166: Cristian Frasinaru-Curs Practic de Java.pdf

7 .2 . INT E RF E T E CE D E SCRIU CO L E CT II 165

Clase stand ard care im p le m enteaz a ac easta interfata sunt: ArrayList,LinkedList, Vector.

M ap d e sc rie structuri d e d ate c e asoc iaz a fie carui e le m ent o ch e ie unic a,d up a care p oate fi re g asit. Ob ie c te le d e ac est tip nu p ot contine ch e i d up li-cate si fie care ch e ie e ste asoc iata la un sing ur e le m ent. Ie rarh ia interfe te lord e riv ate d in Map e ste ind e p end enta d e ie rarh ia d e riv ata d in Collection.D efinittai interfe te i e ste p re z entata m ai jos:

public interface Map {

// Metode cu caracter general

int size();

boolean isEmpty();

void clear();

// Operatii la nivel de element

Object put(Object key, Object value);

Object get(Object key);

Object remove(Object key);

boolean containsKey(Object key);

boolean containsValue(Object value);

// Operatii la nivel de multime

void putAll(Map t);

// Vizualizari ale colectiei

public Set keySet();

public Collection values();

public Set entrySet();

// Interfata pentru manipularea unei inregistrari

public interface Entry {

Object getKey();

Object getValue();

Object setValue(Object value);

}

}

Page 167: Cristian Frasinaru-Curs Practic de Java.pdf

166 CAPIT O L UL 7 . CO L E CT II

Clase care im p le m enteaz a interfata Map sunt H ash M ap, T reeM ap siH ash tab le.

S ortedM ap e ste ase m anatoare cu interfata Map, la care se ad aug a fap -tul c a m ultim ea ch e ilor d intr-o astfe l d e cole c tie e ste m entinuta ord onataasc end ent conform ord inii naturale , sau conform cu ord inea d ata d e un com -p arator sp e c ificat la crearea cole c tie i. E ste sub c lasa a interfe te i Map, ofe rindm e tod e sup lim entare p entru: e x trag ere d e sub tab e le , afl area p rim e i/ ultim e ich e i, afl area com p aratorului folosit p entru ord onare .D efinitia interfe te i e ste d ata m ai jos:

public interface SortedMap extends Map {

// Extragerea de subtabele

SortedMap subMap(Object fromKey, Object toKey);

SortedMap headMap(Object toKey);

SortedMap tailMap(Object fromKey);

// Capete

Object first();

Object last();

// Comparatorul folosit pentru ordonare

Comparator comparator();

}

Clasa care im p le m enteaz a ac easta interfata e ste T reeM ap.

7 .3 Im plem entari ale colectiilor

Inainte d e v e rsiunea 1.2, e x ista un set d e c lase p entru lucrul cu cole c tii, ınsaac estea nu erau org anizate p e ie rarh ia d e interfe te p re z entata ın se c tiuneaanterioara. A c e ste c lase sunt ın continuare d isp onib ile si m ulte d intre e leau fost ad ap tate ın asa fe l ınc at sa se inte g re z e ın noua ab ord are . P e lang aac estea au fost create noi c lase coresp unz atoare interfe te lor d efinite , ch iard ac a func tionalitatea lor era ap roap e id entic a cu c ea a une i c lase anterioare .

Page 168: Cristian Frasinaru-Curs Practic de Java.pdf

7 .3 . IM PL E M E NT ARI AL E CO L E CT IIL O R 167

Clase le d e b az a care im p le m enteaz a interfe te c e d e sc riu cole c tii au num e led e form a < I m p lem entar e >< I nter f ata >, und e ’im p le m entare ’ se re fe ra lastructura interna folosita p entru re p re z entarea m ultim ii, si sunt p re z entateın tab e lul d e m ai jos, ım p reuna cu interfe te le coresp unz atoare (c lase le d inv e ch iul m od e l sunt tre cute p e rand ul d e jos):

Interfata ClasaSet HashSet

SortedSet TreeSet

List ArrayList, LinkedList

Vector

Map HashMap

Hashtable

SortedMap TreeMap

A sad ar se ob serv a e x istenta unor c lase care ofera ac e easi func tionalite ,cum ar fi ArrayList si Vector, HashMap si Hashtable.

P e lang a org anizarea ie rarh ic a a interfe te lor im p le m entate , c lase le c e d e -sc riu cole c tii sunt d e ase m enea conce p ute ıntr-o m aniera ie rarh ic a, ca ın fig urad e m ai jos:

AbstractCollection - AbstractSet, AbstractList - HashSet,

TreeSet... Vector-Stack

AbstractMap - HashMap, TreeMap, HashTable

In vechea ierarhie:

Dictionary - Hashtable - Properties

E v id ent, im p le m entarea interfe te lor este e x p lic it realizata la niv e lul sup er-c lase lor ab stracte , ac estea oferind d e altfe l si im p le m entari concrete p entrum ulte d in m e tod e le d efinite d e interfe te .

In g eneral, c lase le care d e sc riu cole c tii au unele trasaturi com une , cum arfi:

• p e rm it e le m entul null,

• sunt serializab ile ,

• au d efinita m e tod a clone,

Page 169: Cristian Frasinaru-Curs Practic de Java.pdf

168 CAPIT O L UL 7 . CO L E CT II

• au d efinita m e tod a toString, care re turneaz a o re p re z entare ca sir d ecaractere a cole c tie i re sp e c tiv e ,

• p e rm it c rearea d e ite ratori p entru p arcurg e re ,

• au atat constructor fara arg um ente c at si un constructor care ac c e p taca arg um ent o alta cole c tie

• e x c e p tand c lase le d in arh ite c tura v e ch e , nu sunt sincronizate (v e z i ” Fired e e x e cutie ).

7 .4 F olosirea efi cienta a colectiilor

D up a cum am v azut, fie care interfata c e d e sc rie o cole c tie are m ai m ulteim p le m entari. D e e x e m p lu, interfata List e ste im p le m entata d e c lase leArrayList si LinkedList, p rim a fiind ın g eneral m ult m ai folosita. D e c ee x ista atunc i si c lasa LinkedList ? R asp unsul consta ın fap tul c a folosindre p re z entari d ife rite ale m ultim ii g e stionate p ute m ob tine p e rform ante m aib une ın func tie d e situatie , p rin realizarea unor com p rom isuri ıntre sp atiulne c e sar p entru m e m orarea d ate lor, rap id itatea re g asirii ac estora si tim p ulne c e sar actualiz arii cole c tie i ın cazul unor m od ific ari.

S a consid e ram un ex e m p lu c e c re eaza o lista folosind ArrayList, re sp e c tivLinkedList si e x e cuta d iv e rse op eratii p e ea, c ronom etrand tim p ul ne c esarrealiz arii ac estora:

L isting 7.1: Com p arare A rray L ist - L ink e d L ist

import java.util .*;

public class TestEficienta {

final static int N = 100000;

public static void testAdd(List lst) {

long t1 = System.currentTimeMillis ();

for(int i=0; i < N; i++)

lst.add(new Integer(i));

long t2 = System.currentTimeMillis ();

System.out.println("Add: " + (t2 - t1));

}

Page 170: Cristian Frasinaru-Curs Practic de Java.pdf

7 .4 . F O L O SIRE A E F ICIE NT A A CO L E CT IIL O R 169

public static void testGet(List lst) {

long t1 = System.currentTimeMillis ();

for(int i=0; i < N; i++)

lst.get(i);

long t2 = System.currentTimeMillis ();

System.out.println("Get: " + (t2 - t1));

}

public static void testRemove(List lst) {

long t1 = System.currentTimeMillis ();

for(int i=0; i < N; i++)

lst.remove (0);

long t2 = System.currentTimeMillis ();

System.out.println("Remove: " + (t2 - t1));

}

public static void main(String args []) {

System.out.println("ArrayList");

List lst1 = new ArrayList ();

testAdd(lst1);

testGet(lst1);

testRemove(lst1);

System.out.println("LinkedList");

List lst2 = new LinkedList ();

testAdd(lst2);

testGet(lst2);

testRemove(lst2);

}

}

T im p ii ap rox im ativ i d e rulare p e un calculator cu p erform ante m e d ii,e x p rim ati ın se cund e , sunt d ati ın tab e lul d e m ai jos:

A rray L ist L ink edL istadd 0.12 0.14

g et 0.01 87.45

rem ove 12.05 0.01

A sad ar, ad aug area e le m ente lor este rap id a p entru am b e le tip uri d e liste .ArrayList ofera ac c e s ın tim p constant la e le m ente le sale si d in ac est m otivfolosirea lui ” g e t” e ste rap id a, ın tim p c e p entru LinkedList e ste e x tre md e lenta, d eoare c e ıntr-o lista ınlantuita ac c e sul la un ele m ent se fac e p rin

Page 171: Cristian Frasinaru-Curs Practic de Java.pdf

170 CAPIT O L UL 7 . CO L E CT II

p arcurg erea se c v entiala a liste i p ana la e le m entul resp e c tiv .L a op eratiunea d e e lim inare , folosirea lui ArrayList e ste lenta d eoare c e e l-e m ente le ram ase sufera un p roc es d e re ind e x are (sh ift la stang a), ın tim pc e p entru LinkedList e ste rap id a si se fac e p rin sim p la sch im b are a une ile g aturi. D e c i, ArrayList se com p orta b ine p entru cazuri ın care av e mne v oie d e re g asirea unor e le m ente la p oz itii d ife rite ın lista, iar LinkedListfunc tioneaza efic ient atunc i c and fac e m m ulte op eratii d e m od ificare (ste rg e ri,inserari).

Concluz ia nu este c a una d in ac este c lase este m ai ” b una” d e c at c ealalta,c i c a e x ista d ife rente sub stantiale ın re p re z entarea si com p ortam entul d ife rite lorim p le m entari si c a ale g e rea une i anum ite c lase p entru re p re z entarea une im ultim i d e e le m ente tre b uie sa se fac a ın func tie d e natura p rob le m e i c etre b uie re zolv ata.

7 .5 A lg oritm i polim orfi ci

A lg oritm ii p olim orfic i d e sc risi ın ac easta se c tiune sunt m etod e d efinite ınc lasa Collections care p e rm it e fe c tuarea unor op eratii utile cum ar fi c autarea,sortarea, e tc . Caracterisitic ile p rinc ip ale ale ac estor alg oritm i sunt:

• sunt m etod e d e c lasa (static e );

• au un sing ur arg um ent d e tip cole c tie ;

• ap e lul lor g eneral v a fi d e form a:Collections.algoritm(colectie, [argumente]);

• m ajoritatea op ereaz a p e liste d ar si p e cole c tii arb itrare .

M e tod e le m ai d e s folosite d in c lasa Collections sunt:

• sort - sorteaz a asc end ent o lista re fe ritor la ord inea sa naturala sau laord inea d ata d e un com p arator;

• sh uffl e - am e ste c a e le m ente le une i liste - op usul lui sort;

• b inary S earch - e fe c tueaz a c autarea efic ienta (b inara) a unui e le m entıntr-o lista ord onata;

Page 172: Cristian Frasinaru-Curs Practic de Java.pdf

7 .6 . T IPURI G E NE RICE 171

• reverse - inv erseaz a ord inea e le m ente lor d intr-o lista;

• fi ll - p op uleaza o lista cu un anum it e le m ent re p e tat d e un num ar d eori;

• copy - cop ie e le m ente le une i liste ın alta;

• m in - re turneaz a m inim ul d intr-o cole c tie ;

• m ax - re turneaz a m ax im ul d intr-o cole c tie ;

• sw ap - intersch im b a e le m ente le d e la d oua p oz itii sp e c ificate ale une iliste ;

• enum eration - re turneaza o enum erare a e le m ente lor d intr-o cole c tie ;

• unm odifi ab leT ip C o lectie - re turneaz a o instanta care nu p oate fi m od -ificata a cole c tie i re sp e c tiv e ;

• sy nch ronizedT ip C o lectie - re turneaz a o instanta sincronizata a une icole c tii (v e z i ” Fire d e e x e cutie ” ).

7 .6 T ipuri g enerice

T ip urile g eneric e , introd use ın v e rsiunea 1.5 a lim b ajului J av a, sim p lific alucrul cu cole c tii, p e rm itand tip izarea e le m ente lor ac estora. D efinirea unuitip g eneric se realiz eaz a p rin sp e c ificarea ıntre p arante z e ung h iulare a unui tipd e d ate J av a, e fe c tul fiind im p unerea tip ului resp e c tiv p entru toate e le m ente lecole c tie i: <T ipD ate>. S a consid e ram un ex e m p lu d e utilizare a cole c tiilorınainte si d up a introd uc erea tip urilor g eneric e :

// Inainte de 1.5

ArrayList list = new ArrayList();

list.add(new Integer(123));

int val = ((Integer)list.get(0)).intValue();

In e x e m p lul d e m ai sus, lista d efinita p oate contine ob ie c te d e oric e tip , d e siam d ori ca e le m ente le sa fie d oar num ere ıntre g i. M ai m ult, tre b uie sa fac e mcast e x p lic it d e la tip ul Object la Integer atunc i c and p re luam v aloareaunui e le m ent.

Folosind tip uri g eneric e , p ute m resc rie se c v enta astfe l:

Page 173: Cristian Frasinaru-Curs Practic de Java.pdf

172 CAPIT O L UL 7 . CO L E CT II

// Dupa 1.5, folosind tipuri generice

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(new Integer(123));

int val = list.get(0).intValue();

D ac a utiliz am si m e canism ul d e a u to bo xin g , ob tine m o v arianta m ult sim -p lificata a se c v ente i initiale :

// Dupa 1.5, folosind si autoboxing

ArrayList<Integer> list = new ArrayList<Integer>();

list.add(123);

int val = list.get(0);

In cazul folosirii tip urilor g eneric e , ınc e rcarea d e a utiliza ın cad rul une icole c tii a unui e le m ent necoresp unz ator ca tip v a p rod uc e o eroare la com p i-lare , sp re d eose b ire d e v arianta anterioara c e p e rm itea d oara aruncarea unore x c e p tie d e tip ul ClassCastException ın cazul folosirii incore c te a tip urilor.

7 .7 Iteratori si enum erari

E num erarile si ite ratorii d e sc riu m od alitati p entru p arcurg erea se c v entiala aune i cole c tii, ind ife rent d ac a ac easta este ind e x ata sau nu. E i sunt d escrisid e ob ie c te c e im p le m enteaz a interfe te le E num eration, re sp e c tiv Iteratorsau L istIterator. T oate c lase le care im p le m enteaz a cole c tii au m etod e c ere turneaz a o enum erare sau un iterator p entru p arcurg erea e le m ente lor lor.D eoare c e func tionalitatea interfe te i Enumeration se re g ase ste ın Iterator,ac easta d in urm a e ste p re fe rata ın noile im p le m entari ale cole c tiilor.

M e tod e le uzuale ale ac estor interfe te sunt p re z entate m ai jos, ım p reunacu m od alitatea lor d e folosire , se m nificatiile lor fiind e v id ente :

• E num eration: hasMoreElements, nextElement

// Parcurgerea elementelor unui vector v

Enumeration e = v.elements;

while (e.hasMoreElements()) {

System.out.println(e.nextElement());

}

// sau, varianta mai concisa

for (Enumeration e = v.elements();

Page 174: Cristian Frasinaru-Curs Practic de Java.pdf

7 .7 . IT E RAT O RI SI E NUM E RARI 173

e.hasMoreElements();) {

System.out.println(e.nextElement());

}

• Iterator: hasNext, next, remove

// Parcurgerea elementelor unui vector

// si eliminarea elementelor nule

for (Iterator it = v.iterator(); it.hasNext();) {

Object obj = it.next();

if (obj == null)

it.remove();

}

• L istIterator: hasNext, hasPrevious, next, previous,remove, add, set

// Parcurgerea elementelor unui vector

// si inlocuirea elementelor nule cu 0

for (ListIterator it = v.listIterator();

it.hasNext();) {

Object obj = it.next();

if (obj == null)

it.set(new Integer(0));

}

Ite ratorii sim p li p e rm it e lim inarea e le m entului curent d in cole c tia p e careo p arcurg , c e i d e tip ListIterator p e rm it si inserarea unui e le m ent la p oz itiacurenta, re sp e c tiv m od ificarea e le m entului curent, p re cum si ite rarea ın am -b e le sensuri. Ite ratorii sunt p re fe rati enum erarilor d atorita p osib ilitatii lord e a ac tiona asup ra cole c tie i p e care o p arcurg p rin m etod e d e tip remove,

add, set d ar si p rin fap tul c a d enum irile m e tod e lor sunt m ai conc ise .

A tentieD eoare c e cole c tiile sunt construite p e ste tip ul d e d ate Object, m e tod e le

d e tip next sau prev ale ite ratorilor v or returna tip ul Object, fiind resp on-sab ilitatea noastra d e a fac e conv ersie (cast) la alte tip uri d e d ate , d ac a e stecazul.

Page 175: Cristian Frasinaru-Curs Practic de Java.pdf

174 CAPIT O L UL 7 . CO L E CT II

In e x e m p lul d e m ai jos p unem ıntr-un v e ctor num ere le d e la 1 la 10, leam este c am , d up a care le p arcurg e m e le m ent cu e le m ent folosind un iterator,ınlocuind num ere le p are cu 0.

L isting 7.2: Folosirea unui ite rator

import java.util .*;

class TestIterator {

public static void main(String args []) {

ArrayList a = new ArrayList ();

// Adaugam numerele de la 1 la 10

for(int i=1; i <=10; i++)

a.add(new Integer(i));

// Amestecam elementele colectiei

Collections.shuffle(a);

System.out.println("Vectorul amestecat: " + a);

// Parcurgem vectorul

for(ListIterator it=a.listIterator (); it.hasNext (); ) {

Integer x = (Integer) it.next();

// Daca elementul curent este par , il facem 0

if (x.intValue () % 2 == 0)

it.set(new Integer (0));

}

System.out.print("Rezultat: " + a);

}

}

Inc e p and cu v ersiunea 1.5 a lim b ajului J av a, e x ista o v arianta sim p lificatad e utilizare a ite ratorilor. A stfe l, o se c v enta d e g enul:

ArrayList<Integer> list = new ArrayList<Integer>();

for (Iterator i = list.iterator(); i.hasNext();) {

Integer val=(Integer)i.next();

// Proceseaza val

...

Page 176: Cristian Frasinaru-Curs Practic de Java.pdf

7 .7 . IT E RAT O RI SI E NUM E RARI 175

}

p oate fi resc risa astfe l:

ArrayList<Integer> list = new ArrayList<Integer>();

for (Integer val : list) {

// Proceseaza val

...

}

Page 177: Cristian Frasinaru-Curs Practic de Java.pdf

176 CAPIT O L UL 7 . CO L E CT II

Page 178: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 8

S erializarea ob iectelor

8 .1 F olosirea serializ arii

D efi nitieS e rializarea este o m etod a c e p e rm ite transform area unui ob ie c t ıntr-o

se c v enta d e octe ti sau caractere d in care sa p oata fi re facut ulterior ob ie c tulorig inal.

Cu alte cuv inte , se rializarea p erm ite salv area ıntr-o m aniera unitara atuturor inform atiilor unui ob ie c t p e un m e d iu d e stocare e x te rn p rog ram ului.P roc esul inv ers, d e c itire a unui ob ie c t serializat p entru a-i re fac e stareaorig inala, se num e ste d eseria liza re . Intr-un cad ru m ai larg , p rin serializarese ınte le g e p roc esul d e sc rie re / c itire a ob ie c te lor.

T ip urile p rim itiv e p ot fi d e ase m enea serializate .U tilitatea serializarii consta ın urm atoare le asp e c te :

• A sig ura un m e canism sim p lu d e u tiliza t p entru salv area si re staurareaa d ate lor.

• P e rm ite persisten ta o biectelo r, c e ea c e ınseam na c a d urata d e v iata aunui ob ie c t nu este d e te rm inata d e e x e cutia unui p rog ram ın care ac estaeste d efinit - ob ie c tul p oate e x ista si ıntre ap e lurile p rog ram e lor care ılfolosesc . A c e st lucru se realiz eaz a p rin serializarea ob ie c tului si sc rie realui p e d isc ınainte d e te rm inarea unui p rog ram , ap oi, la re lansareap rog ram ului, ob ie c tul v a fi c itit d e p e d isc si starea lui re facuta. A c e st

177

Page 179: Cristian Frasinaru-Curs Practic de Java.pdf

178 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

tip d e p e rsistenta a ob ie c te lor se num e ste persisten ta u so a ra , ıntruc atea tre b uie e fe c tuata e x p lic it d e c atre p rog ram ator si nu este realizataautom at d e c atre siste m .

• C o m pen sa rea d iferen te lo r ın tre sistem e d e o pera re - transm ite rea unorinform atii ıntre p latform e d e lucru d ife rite se realiz eaz a unitar, ind e -p end ent d e form atul d e re p re z entare a d ate lor, ord inea octe tilor saualte d e talii sp e c ific e siste m e lor re p e c tiv e .

• T ra n sm iterea d a telo r ın re tea - A p licatiile c e ruleaz a ın re tea p ot com u-nica ıntre e le folosind fl ux uri p e care sunt trim ise , re sp e c tiv re c e p tionateob ie c te se rializate .

• R M I (R em o te M eth od In voca tio n ) - e ste o m od alitate p rin care m e tod e leunor ob ie c te d e p e o alta m asina p ot fi ap e late ca si cum ac estea ar e x -ista local p e m asina p e care ruleaz a ap licatia. A tunc i c and este trim isun m esaj c atre un ob ie c t ” re m ote ” (d e p e alta m asina), se rializareaeste utilizata p entru transp ortul arg um ente lor p rin re tea si p entru re -turnarea v alorilor.

• J a va B ea n s - sunt com p onente reutilizab ile , d e sine statatoare c e p otfi utilizate ın m e d ii v izuale d e d e z v oltare a ap licatiilor. Oric e com p o-nenta B ean are o stare d efinita d e v alorile im p lic ite ale p rop rie tatilorsale , stare care este sp e c ificata ın etap a d e d e sig n a ap licatie i. M e d iilev izuale folosesc m e canism ul serializ arii p entru asig urarea p ersistente icom p onente lor B ean.

U n asp e c t im p ortant al serializ arii e ste c a nu salv eaz a d oar im ag inea unuiob ie c t c i si toate re fe rinte le la alte ob ie c te p e care ac esta le contine . A c e staeste un p roc es re cusiv d e salv are a d ate lor, ıntruc at c e le lalte ob ie c te le re fe rited e ob ie c tul care se serializ eaz a p ot re fe ri la rand ul lor alte ob ie c te , si asa m aid e p arte . A sad ar re fe rinte le care construiesc starea unui ob ie c t form eaz a oıntreag a re tea, c e ea c e ınseam na c a un alg oritm g eneral d e salv are a stariiunui ob ie c t nu este toc m ai fac il.

In cazul ın care starea unui ob ie c t e ste form ata d oar d in v alori ale unorv ariab ile d e tip p rim itiv , atunc i salv area inform atiilor ıncap sulate ın ac e lob ie c t se p oate fac e si p rin salv area p e rand a d ate lor, folosind c lasaDataOutputStream, p entru ca ap oi sa fie restaurate p rin m etod e ale c lase iDataInputStream, d ar, asa cum am v azut, o ase m enea ab ord are nu este

Page 180: Cristian Frasinaru-Curs Practic de Java.pdf

8 .1 . F O L O SIRE A SE RIAL IZ ARII 179

ın g eneral sufic ienta, d eoare c e p ot ap area p rob le m e cum ar fi: v ariab ile lem e m b re ale ob ie c tului p ot fi instante ale altor ob ie c te , unele c am p uri p otfac e re fe rinta la ac e lasi ob ie c t, e tc .

S e rializarea ın form at b inar a tip urilor p rim itiv e si a ob ie c te lor se real-iz eaz a p rin interm e d iul fl ux urilor d efinite d e c lase sp e c ializate ın ac est scopcu ar fi:ObjectOutputStream p entru scrie re si ObjectInputStream p entru restau-rare .

In continuare , p rin term enul seria liza re ne v om re fe ri d oar la serializareaın form at b inar.

8 .1.1 S erializarea tipurilor prim itive

S e rializarea tip urilor p rim itiv e p oate fi realizata fie p rin interm e d iul fl ux u-rilor DataOutputStream si DataInputStream, fie cu ObjectOutputStream

si ObjectInputStream. A c e stea im p le m enteaz a interfe te le DataInput, re -sp e c tiv DataOutput c e d e c lara m e tod e d e tip ul readT ip P rim itiv , re sp e c tivwriteT ip P rim itiv p entru scrie rea/ c itirea d ate lor p rim itiv e si a sirurilor d ecaractere .

M ai jos este p re z entat un ex e m p lu d e serializare folosind c lasa DataOutputStream:

FileOutputStream fos = new FileOutputStream("test.dat");

DataOutputStream out = new DataOutputStream(fos);

out.writeInt(12345);

out.writeDouble(12.345);

out.writeBoolean(true);

out.writeUTF("Sir de caractere");

out.flush();

fos.close();

Citirea inform atiilor scrise ın e x e m p lul d e m ai sus se v a fac e astfe l:

FileInputStream fis = new FileInputStream("test.dat");

DataInputStream in = new DataInputStream(fis);

int i = in.readInt();

double d = in.readDouble();

boolean b = in.readBoolean();

Page 181: Cristian Frasinaru-Curs Practic de Java.pdf

180 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

String s = in.readUTF();

fis.close();

8 .1.2 S erializarea ob iectelor

S e rializarea ob ie c te lor se realiz eaz a p rin interm e d iul fl ux urilor d efinite d ec lase le O b jectO utputS tream (p entru salv are) si O b jectInputS tream(p entru restaurare). A c e stea sunt fl ux uri d e p roc esare , c e ea c e ınseam nac a v or fi folosite ım p reuna cu alte fl ux uri p entru scrie rea/ c itirea e fe c tiv a ad ate lor p e m e d iul e x te rn p e care v a fi salv at, sau d e p e care v a fi restauratun ob ie c t serializat.

M e canism ul im p lic it d e se rializare a unui ob ie c t v a salv a num e le c lase iob ie c tului, sig natura c lase i si v alorile tuturor c am p urile se rializab ile ale ob ie c -tului. R e fe rinte le la alte ob ie c te se rializab ile d in cad rul ob ie c tului curent v ord uc e autom at la serializarea ac estora iar re fe rinte le m ultip le c atre un ace lasiob ie c t sunt cod ificate utiliz and un alg oritm care sa p oata re fac e ” re teaua d eob ie c te ” la ac e easi stare ca atunc i c and ob ie c tul orig inal a fost salv at.

Clase le ObjectInputStream si ObjectOutputStream im p le m enteaz a interfe te leObjectInput, re sp e c tiv ObjectOutput care e x tind DataInput, re sp e c tiv DataOutput,c e ea c e ınseam na c a, p e lang a m e tod e le d e d icate serializ arii ob ie c te lor, v ore x ista si m e tod e p entru scrie rea/ c itirea d ate lor p rim itiv e si a sirurilor d ecaractere .

M e tod e le p entru serializarea ob ie c te lor sunt:

• w riteO b ject, p entru scrie re si

• readO b ject, p entru restaurare .

8 .1.3 Clasa O b jectO utputS tream

S c rie rea ob ie c te lor p e un fl ux d e ie sire e ste un p roc es e x tre m d e sim p lu,se c v enta uzuala fiind c ea d e m ai jos:

ObjectOutputStream out = new ObjectOutputStream(fluxPrimitiv);

out.writeObject(referintaObiect);

out.flush();

fluxPrimitiv.close();

Page 182: Cristian Frasinaru-Curs Practic de Java.pdf

8 .1 . F O L O SIRE A SE RIAL IZ ARII 181

E x e m p lul d e m ai jos construie ste un ob ie c t d e tip Date si ıl salv eaz a ınfisie rul test.ser, ım p reuna cu un ob ie c t d e tip String. E v id ent, fisie rulre zultat v a contine inform atiile re p re z entate ın form at b inar.

FileOutputStream fos = new FileOutputStream("test.ser");

ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject("Ora curenta:");

out.writeObject(new Date());

out.flush();

fos.close();

D eoare c e im p le m enteaz a interfata DataOutput, p e lang a m etod a d e sc rie rea ob ie c te lor, c lasa p une la d isp oz itie si m e tod e d e tip ul writeT ip P rim itivp entru serializarea tip urilor d e d ate p rim itiv e si a sirurilor d e caractere , ast-fe l ınc at ap e luri ca c e le d e m ai jos sunt p erm ise :

out.writeInt(12345);

out.writeDouble(12.345);

out.writeBoolean(true);

out.writeUTF("Sir de caractere");

M e tod a writeObject arunc a e x c e p tii d e tip ul IOException si d e riv ated in ac easta, m ai p re c is NotSerializableException d ac a ob ie c tul p rim it caarg um ent nu este serializab il, sau InvalidClassException d ac a sunt p rob -le m e cu o c lasa ne c e sara ın p roc esul d e se rializare . V om v e d ea ın continuarec a un ob ie c t e ste serializab il d ac a e ste instanta a une i c lase c e im p le m enteaz ainterfata Serializable.

8 .1.4 Clasa O b jectInputS tream

Od ata c e au fost scrise ob ie c te si tip uri p rim itiv e d e d ate p e un fl ux , c itireaac estora si re construirea ob ie c te lor salv ate se v a fac e p rintr-un fl ux d e intrared e tip ObjectInputStream. A c e sta este d e ase m enea un fl ux d e p roc esaresi v a tre b ui asoc iat cu un fl ux p entru c itirea e fe c tiv a a d ate lor, cum ar fiFileInputStream p entru d ate salv ate ıntr-un fisie r. S e c v enta uzuala p entrud ese rializare este c ea d e m ai jos:

ObjectInputStream in = new ObjectInputStream(fluxPrimitiv);

Object obj = in.readObject();

//sau

Page 183: Cristian Frasinaru-Curs Practic de Java.pdf

182 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

TipReferinta ref = (TipReferinta)in.readObject();

fluxPrimitiv.close();

Citirea inform atiilor scrise ın e x e m p lul d e m ai sus se v a fac e astfe l:

FileInputStream fis = new FileInputStream("test.ser");

ObjectInputStream in = new ObjectInputStream(fis);

String mesaj = (String)in.readObject();

Date data = (Date)in.readObject();

fis.close();

T re b uie ob serv at c a m e tod a readObject are tip ul returnat Object, c e eac e ınseam na c a tre b uie realizata e x p lic it conv ersia la tip ul coresp unzatorob ie c tului c itit:

Date date = in.readObject(); // gresit

Date date = (Date)in.readObject(); // corect

A tentie

Ca si la c e le lalte fl ux uri d e d ate care im p le m e teaz a interfata DataInput

c itirea d intr-un fl ux d e ob ie c te tre b uie sa se fac a e x act ın ord inea ın careaac estea au fost scrise , altfe l v or ap area e v id ent e x c e p tii ın p roc esul d e d e se -rializare .

Clasa ObjectInputStream im p le m enteaz a interfata DataInput d e c i, p elang a m e tod a d e c itire a ob ie c te lor, c lasa p une la d isp oz itie si m e tod e d etip ul readT ip P rim itiv p entru c itirea tip urilor d e d ate p rim itiv e si a sirurilord e caractere .

int i = in.readInt();

double d = in.readDouble();

boolean b = in.readBoolean();

String s = in.readUTF();

Page 184: Cristian Frasinaru-Curs Practic de Java.pdf

8 .2 . O B IE CT E SE RIAL IZ AB IL E 183

8 .2 O b iecte serializab ile

U n ob ie c t e ste serializab il d ac a si num ai d ac a c lasa d in care fac e p arte im -p le m enteaz a interfata S erializab le. A sad ar, d ac a d orim ca instante le une ic lase sa p oata fi serializate , c lasa resp e c tiv a tre b uie sa im p le m ente z e , d ire c tsau ind ire c t, interfata Serializable.

8 .2 .1 Im plem entarea interfetei S erializab le

Interfata Serializable nu contine nic i o d e c laratie d e m e tod a sau constanta,sing urul e i scop fiind d e a id entifica c lase le ale c aror ob ie c te sunt serializab ile .D efinitia sa com p le ta e ste :

package java.io;

public interface Serializable {

// Nimic !

}

D e c lararea c lase lor ale c aror instante tre b uie sa fie serializate este asad are x tre m d e sim p la, fiind facuta p rin sim p la im p le m entare a interfe te i Serializable:

public class ClasaSerializabila implements Serializable {

// Corpul clasei

}

Oric e sub c lasa a une i c lase serializab ile e ste la rand ul e i se rializab ila,ıntruc at im p le m enteaz a ind ire c t interfata Serializable.

In situatia ın care d orim sa d e c laram o c lasa se rializab ila d ar sup erc lasasa nu este se rializab ila, atunc i tre b uie sa av e m ın v e d e re urm atoare le lucruri:

• V ariab ile le ac c e sib ile ale sup erc lase i nu v or fi serializate , fiind resp ons-ab ilitatea c lase i curente d e a asig ura un m e canism p rop riu p entru sal-v area/ restaurarea lor. A c e st lucru v a fi d iscutat ın se c tiunea re fe ritoarela p ersonalizarea serializ arii.

• S up erc lasa tre b uie sa aib a ob lig atoriu un constructor ac c esib il fara ar-g um ente , ac esta fiind utilizat p entru initializarea v ariab ile lor m osteniteın p roc esul d e restaurare al unui ob ie c t. V ariab ile le p rop rii v or fiinitializate cu v alorile d e p e fl ux ul d e intrare . In lip sa unui constructorac c esib il fara arg um ente p entru sup erc lasa, v a fi g enerata o e x c e p tie lae x e cutie .

Page 185: Cristian Frasinaru-Curs Practic de Java.pdf

184 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

In p roc esul serializ arii, d ac a e ste ıntalnit un ob ie c t care nu im p le m enteaz ainterfata Serializable atunc i v a fi g enerata o e x c e p tie d e tip ul NotSerializableExceptionc e v a id entifica resp e c tiv a c lasa neserializab ila.

8 .2 .2 Controlul serializ arii

E x ista cazuri c and d orim ca unele v ariab ile m e m b re ale unui ob ie c t sa nu fiesalv ate autom at ın p roc esul d e se rializare . A c e stea sunt cazuri com une atunc ic and resp e c tiv e le c am p uri re p re z inta inform atii confid entiale , cum ar fi p a-role , sau v ariab ile te m p orare p e care nu are rost sa le salv am . Ch iar d e c laratep riv ate ın cad rul c lase i ac este c am p uri p artic ip a la serializare . P entru ca unc am p sa nu fie salv at ın p roc esul d e se rializare e l tre b uie d e c larat cu m od i-ficatorul transient si tre b uie sa fie ne -static . D e e x e m p lu, d e c lararea une iv ariab ile m e m b re te m p orare ar tre b ui facuta astfe l:

transient private double temp;

// Ignorata la serializare

M od ificatorul static anuleaz a e fe c tul m od ificatorului transient. Cualte cuv inte , v ariab ile le d e c lasa p artic ip a ob lig atoriu la serializare .

static transient int N;

// Participa la serializare

In e x e m p le le urm atoare c am p urile m arcate ’D A ’ p artic ip a la serializare ,c e le m arcate ’N U ’, nu p artic ip a iar c e le m arcate cu ’E x c e p tie ’ v or p rov ocae x c e p tii d e tip ul NotSerializableException.

L isting 8.1: M od ificatorii static si transient

import java.io.*;

public class Test1 implements Serializable {

int x=1; //DA

transient int y=2; //NU

transient static int z=3; //DA

static int t=4; //DA

public String toString () {

return x + ", " + y + ", " + z + ", " + t;

}

}

Page 186: Cristian Frasinaru-Curs Practic de Java.pdf

8 .2 . O B IE CT E SE RIAL IZ AB IL E 185

D ac a un ob ie c t c e tre b uie se rializat are re fe rinte la ob ie c te neserializab ile ,atunc i v a fi g enerata o e x c e p tie d e tip ul NotSerializableException.

L isting 8.2: M e m b rii neserializab ili

import java.io.*;

class A {

int x=1;

}

class B implements Serializable {

int y=2;

}

public class Test2 implements Serializable{

A a = new A(); // Exceptie

B b = new B(); //DA

public String toString () {

return a.x + ", " + b.y;

}

}

A tunc i c and o c lasa se rializab ila d e riv a d intr-o alta c lasa, salv area c am p urilorc lase i p arinte se v a fac e d oar d ac a si ac easta este se rializab ila. In caz contrar,sub c lasa tre b uie sa salv e z e e x p lic it si c am p urile m ostenite .

L isting 8.3: S e rializarea c am p urilor m ostenite

import java.io.*;

class C {

int x=0;

// Obligatoriu constructor fara argumente

}

class D extends C implements Serializable {

int y=0;

}

public class Test3 extends D {

public Test3() {

x = 1; //NU

y = 2; //DA

Page 187: Cristian Frasinaru-Curs Practic de Java.pdf

186 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

}

public String toString () {

return x + ", " + y;

}

}

M ai jos este d e sc risa o ap licatie care e fe c tueaz a salv area si re staurareaunor ob ie c te d in c e le tre i c lase p re z entate m ai sus.

L isting 8.4: T e starea serializ arii

import java.io.*;

public class Exemplu {

public static void test(Object obj) throws IOException {

// Salvam

FileOutputStream fos = new FileOutputStream("fisier.ser")

;

ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject(obj);

out.flush();

fos.close();

System.out.println("A fost salvat obiectul: " + obj);

// Restauram

FileInputStream fis = new FileInputStream("fisier.ser");

ObjectInputStream in = new ObjectInputStream(fis);

try {

obj = in.readObject ();

} catch(ClassNotFoundException e) {

e.printStackTrace ();

}

fis.close();

System.out.println("A fost restaurat obiectul: " + obj);

}

public static void main(String args []) throws IOException {

test(new Test1());

try {

test(new Test2());

} catch(NotSerializableException e) {

Page 188: Cristian Frasinaru-Curs Practic de Java.pdf

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R 187

System.out.println("Obiect neserializabil: " + e);

}

test(new Test3());

}

}

R e zultatul ac estui p rog ram v a fi :

A fost salvat obiectul: 1, 2, 3, 4

A fost restaurat obiectul: 1, 0, 3, 4

Obiect neserializabil: java.io.NotSerializableException: A

A fost salvat obiectul: 1, 2

A fost restaurat obiectul: 0, 2

8 .3 P ersonalizarea serializ arii ob iectelor

D e zav antajul m e canism ului im p lic it d e se rializare este c a alg oritm ul p e carese b eaz eaz a, fiind creat p entru cazul g eneral, se p oate com p orta inefic ient ınanum ite situatii: p oate fi m ult m ai lent d e c at e ste cazul sau re p re z entareab inara g enerata p entru un ob ie c t p oate fi m ult m ai v olum inoasa d e c at artre b ui. In ac este situatii, p ute m sa ınlocuim alg oritm ul im p lic it cu unulp rop riu, p articularizat p entru o clasa anum e . D e ase m enea, e ste p osib ilsa e x tind e m com p ortam entul im p lic it, ad aug and si alte inform atii ne c e sarep entru serializarea unor ob ie c te .In m ajoritatea cazurilor m e canism ul stand ard este sufic ient ınsa, d up a cumam sp us, o c lasa p oate av ea nev oie d e m ai m ult control asup ra serializ arii.

P e rsonalizarea serializarii se realiz eaz a p rin d efinirea (ıntr-o c lasa se rial-izab ila!) a m etod e lor writeObject si readObject av and ex act sig natura d em ai jos:

private void writeObject(java.io.ObjectOutputStream stream)

throws IOException

private void readObject(java.io.ObjectInputStream stream)

throws IOException, ClassNotFoundException

M e tod a writeObject controleaz a c e d ate sunt salv ate iar readObject

controleaz a m od ul ın care sunt restaurate ob ie c te le , c itind inform atiile salv atesi, e v entual, m od ifc and starea ob ie c te lor c itite astfe l ınc at e le sa coresp und a

Page 189: Cristian Frasinaru-Curs Practic de Java.pdf

188 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

anum itor c e rinte . In cazul ın care nu d orim sa ınlocuim com p le t m e canis-m ul stand ard , p ute m sa folosim m e tod e le defaultW riteO b ject, re sp e c tivdefaultR eadO b ject care d e sc riu p roc e d urile im p lic ite d e se rializare .

Form a g enerala d e im p le m entare a m etod e lor writeObject si readObjecte ste :

private void writeObject(ObjectOutputStream stream)

throws IOException {

// Procesarea campurilor clasei (criptare, etc.)

...

// Scrierea obiectului curent

stream.defaultWriteObject();

// Adaugarea altor informatii suplimentare

...

}

private void readObject(ObjectInputStream stream)

throws IOException,ClassNotFoundException {

// Restaurarea obiectului curent

stream.defaultReadObject();

// Actualizarea starii obiectului (decriptare, etc.)

// si extragerea informatiilor suplimentare

...

}

M e tod e le writeObject si readObject sunt resp onsab ile cu serializareac lase i ın care sunt d efinite , se rializarea sup erc lase i sale fiind facuta autom at(si im p lic it). D ac a ınsa o c lasa tre b uie sa-si coord onez e se rializarea p ro-p rie cu serializarea sup erc lase i sale , atunc i tre b uie sa im p le m ente z e interfataExternalizable.

8 .3 .1 Controlul versiunilor claselor

S a p re sup unem c a d orim sa realiz am o ap licatie care sa tina e v id enta ang ajatilorune i com p anii. E v id ent, v om av ean nev oie d e o c lasa care sa re p re z inte

Page 190: Cristian Frasinaru-Curs Practic de Java.pdf

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R 189

notiunea d e a n gja t. O v arianta sim p lificata a ac este ia ar p utea arata astfe l:

L isting 8.5: P rim a v arianta a c lase i A ng ajat

import java.io.*;

class Angajat implements Serializable {

public String nume;

public int salariu;

private String parola;

public Angajat(String nume , int salariu , String parola) {

this.nume = nume;

this.salariu = salariu;

this.parola = parola;

}

public String toString () {

return nume + " (" + salariu + ")";

}

}

M ai jos este p re z entata o m ic a ap licatie care p e rm ite introd uc erea d eang ajati si salv area lor ıntr-un fisie r. L a fie care p ornire a ap licatie i, v or fic itite d ate le d in fisie r astfe l ınc at p rog ram ul v a actualiza ın p erm anenta listaang ajatilor cu noi p e rsoane .

L isting 8.6: A p licatia d e g e stionare a ang ajatilor

import java.io.*;

import java.util .*;

public class GestiuneAngajati {

//Lista angajatilor

ArrayList ang = new ArrayList ();

public void citire () throws IOException {

FileInputStream fis = null;

try {

fis = new FileInputStream("angajati.ser");

ObjectInputStream in = new ObjectInputStream(fis);

Page 191: Cristian Frasinaru-Curs Practic de Java.pdf

190 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

ang = (ArrayList) in.readObject ();

} catch(FileNotFoundException e) {

System.out.println("Fisierul nou ...");

} catch(Exception e) {

System.out.println("Eroare la citirea datelor ...");

e.printStackTrace ();

}finally {

if (fis != null)

fis.close();

}

System.out.println("Lista angajatilor :\n" + ang);

}

public void salvare () throws IOException {

FileOutputStream fos =

new FileOutputStream("angajati.ser");

ObjectOutputStream out = new ObjectOutputStream(fos);

out.writeObject(ang);

}

public void adaugare () throws IOException {

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

while (true) {

System.out.print("\nNume:");

String nume = stdin.readLine ();

System.out.print("Salariu:");

int salariu = Integer.parseInt(stdin.readLine ());

System.out.print("Parola:");

String parola = stdin.readLine ();

ang.add(new Angajat(nume , salariu , parola));

System.out.print("Mai adaugati ? (D/N)");

String raspuns = stdin.readLine ().toUpperCase ();

if (raspuns.startsWith("N"))

break;

}

}

public static void main(String args []) throws IOException {

GestiuneAngajati app = new GestiuneAngajati ();

Page 192: Cristian Frasinaru-Curs Practic de Java.pdf

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R 191

// Incarcam angajatii din fisier

app.citire ();

// Adaugam noi angajati

app.adaugare ();

// Salvam angajatii inapoi fisier

app.salvare ();

}

}

P rob le m a care se p une acum este urm atoarea. D up a introd uc erea unuinum ar sufic ient d e m are d e ang ajati ın fisie r, c lasa Angajat e ste m od ifi-cata p rin ad aug area une i noi v ariab ila m e m b re care sa re tina a d resa . L ae x e cutia ap licatie i noastre , p roc e d ura d e c itire a ang ajatilor d in fisie r nuv a m ai func tiona, p rod uc and o e x c e p tie d e tip ul InvalidClassException.A c eastap rob le m a ar fi ap arut ch iar d ac a v ariab ila ad aug ata e ra d e c larata d etip transient. D e c e se ıntam p la ac est lucru ?

E x p licatia consta ın fap tul c a m e canism ul d e se rializare J av a este foarteatent cu sig natura c lase lor serializate . P entru fiecare ob ie c t serializat estecalculat autom at un num ar re p re z entat p e 64 d e b iti, care re p re z inta un fe l d e” am p renta” a c lase i ob ie c tului. A c e st num ar, d enum it serialV ersionU ID ,e ste g enerat p ornind d e la d iv e rse inform atii ale c lase i, cum ar fi v ariab ile lesale m e m b re , (d ar nu num ai) si e ste salv at ın p roc esul d e se rializare ım p reunacu c e le lalte d ate . In p lus, oric e m od ificare se m nificativ a a c lase i, cum arfi ad aug area unui nou c am p , v a d e te rm ina m od ificarea num arului sau d ev e rsiune .

L a restaurarea unui ob ie c t, num arul d e v e rsiune salv at ın form a serializatav a fi re g asit si com p arat cu noua se m natura a c lase i ob ie c tului. In cazul ıncare ac estea nu sunt e g ale , v a fi g enerata o e x c e p tie d e tip ulInvalidClassException si d e se rializarea nu va fi facuta.

A c easta ab ord are e x tre m d e p re cauta e ste foarte utila p entru p re v enireaunor anom alii c e p ot ap area c and d oua v e rsiuni d e c lase sunt incom p ati-b ile , d at p oate fi sup aratoare atunc i c and m od ific arile ad use c lase i nu stric acom p atib ilitatea cu v e ch ea v ersiune . In ac easta situatie tre b uie sa com u-nic am e x p lic it c a c e le d oua c lase sunt com p atib ile . A c e st lucru se realiz eaz ap rin setarea m anuala a v ariab ile i serialVersionUID ın cad rul c lase i d orite ,ad aug and p ur si sim p lu c am p ul:

Page 193: Cristian Frasinaru-Curs Practic de Java.pdf

192 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

static final long serialVersionUID = /* numar_serial_clasa */;

P re z enta v ariab ile i serialVersionUID p rintre m e m b rii une i c lase v a in-form a alg oritm ul d e se rialzare c a nu m ai calcule z e num arul d e se rie al c lase i,c i sa-l foloseasc a p e c e l sp e c ificat d e noi. Cum p ute m afl a ınsa num arul d e se -rie al v e ch ii c lase Angajat care a fost folosita anterior la salv area ang ajatilor?

U tilitarul serialV er p e rm ite g enerarea num arului serialVersionUID p en-tru o c lasa sp e c ificata. A sad ar, tre b uie sa re com p ilam v e ch ea c lasa Angajat

si sa-i afl am num arul d e se rie astfe l: serialVer Angajat. R e zultatul v a fi:

Angajat:

static final long serialVersionUID = 5653493248680665297L;

V om rescrie noua clasa Angajat astfe l ınc at sa fie com p atib ila cu c eav e ch e astfe l:

L isting 8.7: V arianta com p atib ila a c lase i A ng ajat

import java.io.*;

class Angajat implements Serializable {

static final long serialVersionUID = 5653493248680665297L;

public String nume , adresa;

public int salariu;

private String parola;

public Angajat(String nume , int salariu , String parola) {

this.nume = nume;

this.adresa = "Iasi";

this.salariu = salariu;

this.parola = parola;

}

public String toString () {

return nume + " (" + salariu + ")";

}

}

A p licatia noastra v a func tiona acum , ınsa rub rica a d resa nu va fi initializataın nic i un fe l (v a fi null), d eoare c e ea nu ex ista ın form atul orig inal. L a noua

Page 194: Cristian Frasinaru-Curs Practic de Java.pdf

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R 193

salv are a d ate lor, v or fi serializate si inform atiile le g ate d e ad resa (e v id ent,tre b uie ınsa sa le c itim d e la tastatura...)

8 .3 .2 S ecurizarea datelor

D up a cum am v azut m e m b rii p riv ati, cum ar fi pa ro la d in e x e m p lul d e m aisus, p artic ip a la serializare . P rob le m a consta ın fap tul c a, d e si ın form atb inar, inform atiile unui ob ie c t serializat nu sunt crip tate ın nic i un fe l si p otfi re g asite cu usurinta, c e ea c e p oate re p re z enta un inconv enient atunc i c ande x ista c am p uri confid entiale .

R e zolv area ac este i p rob le m e se fac e p rin m od ificarea m e canism ului im -p lic it d e se rializare , im p le m entand m e tod e le readO b ject si w riteO b ject,p re cum si p rin utilizarea une i func tii d e c rip tare a d ate lor. V arianta se cur-izata a c lase i Angajat d in e x e m p lul anterior ar p utea arata astfe l:

L isting 8.8: V arianta se curizata a c lase i A ng ajat

import java.io.*;

class Angajat implements Serializable {

static final long serialVersionUID = 5653493248680665297L;

public String nume , adresa;

public int salariu;

private String parola;

public Angajat(String nume , int salariu , String parola) {

this.nume = nume;

this.adresa = "Iasi";

this.salariu = salariu;

this.parola = parola;

}

public String toString () {

return nume + " (" + salariu + ")";

}

static String criptare(String input , int offset) {

StringBuffer sb = new StringBuffer ();

for (int n=0; n<input.length (); n++)

sb.append ((char)(offset+input.charAt(n)));

return sb.toString ();

Page 195: Cristian Frasinaru-Curs Practic de Java.pdf

194 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

}

private void writeObject(ObjectOutputStream stream)

throws IOException {

parola = criptare(parola , 3);

stream.defaultWriteObject ();

parola = criptare(parola , -3);

}

private void readObject(ObjectInputStream stream)

throws IOException , ClassNotFoundException {

stream.defaultReadObject ();

parola = criptare(parola , -3);

}

}

8 .3 .3 Im plem entarea interfetei E x ternalizab le

P entru un control com p le t, e x p lic it, al p roc esului d e se rializare , o c lasa tre -b uie sa im p le m ente z e interfata E x ternalizab le. P entru instante ale ac estorc lase d oar num e le c lase i e ste salv at autom at p e fl ux ul d e ob ie c te , c lasa fiindresp onsab ila cu scrie rea si c itirea m e m b rilor sai si tre b uie sa se coord onez ecu sup erc lase le e i.

D efinitia interfe te i Externalizable e ste :

package java.io;

public interface Externalizable extends Serializable {

public void writeExternal(ObjectOutput out)

throws IOException;

public void readExternal(ObjectInput in)

throws IOException, ClassNotFoundException;

}

A sad ar, ac este c lase tre b uie sa im p le m ente z e ob lig atoriu m etod e le w rite-E x ternal si readE x ternal ın care se v a fac e serializarea com p le ta a ob ie c te lorsi coord onarea cu sup erc lasa e i.

U zual, interfata Externalizable e ste folosita ın situatii ın care se d ore steım b unatatirea p e rform ante lor alg oritm ului stand ard , m ai e x act cre ste rea v ite z e ip roc esului d e se rializare .

Page 196: Cristian Frasinaru-Curs Practic de Java.pdf

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R 195

M ai jos este p re z entata o c lasa sim p la si m od alitatea d e resc rie re a safolosind interfata Externalizable:

L isting 8.9: S e rializare im p lic ita

import java.io.*;

class Persoana implements Serializable {

int cod;

String nume;

public Persoana(String nume , int cod) {

this.nume = nume;

this.cod = cod;

}

}

L isting 8.10: S e rializare p rop rie

import java.io.*;

class Persoana implements Externalizable {

int cod;

String nume;

public Persoana(String nume , int cod) {

this.nume = nume;

this.cod = cod;

}

public void writeExternal(ObjectOutput s)

throws IOException {

s.writeUTF(nume);

s.writeInt(cod);

}

public void readExternal(ObjectInput s)

throws ClassNotFoundException , IOException {

nume = s.readUTF ();

cod = s.readInt ();

}

}

Page 197: Cristian Frasinaru-Curs Practic de Java.pdf

196 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

8 .4 Clonarea ob iectelor

S e stie c a nu p ute m cop ia v aloarea unui ob ie c t p rin instruc tiunea d e atrib uire .O se c v enta d e form a:

TipReferinta o1 = new TipReferinta();

TipReferinta o2 = o1;

nu fac e d e c at sa d e c lare o noua v ariab ila o2 ca re fe rinta la ob ie c tul re fe rit d eo1 si nu cre eaz a sub nic i o form a un nou ob ie c t.

O p osib ilitate d e a fac e o cop ie a unui ob ie c t e ste folosirea m etod e i cloned efinita ın c lasa Object. A c easta cre eaz a un nou ob ie c t si initializ eaz a toatev ariab ile le sale m e m b re cu v alorile ob ie c tului c lonat.

TipReferinta o1 = new TipReferinta();

TipReferinta o2 = (TipReferinta) o1.clone();

D efic ienta ac este i m e tod e e ste c a nu realiz eaz a d up licarea ıntre g ii re te led e ob ie c te coresp unz atoare ob ie c tului c lonat. In cazul ın care e x ista c am p urire fe rinta la alte ob ie c te , ob ie c te le re fe rite nu v or m ai fi c lonate la rand ul lor.

O m etod a clone care sa realiz e z e o cop ie e fe c tiv a a unui ob ie c t, ım p reunacu cop ie rea tuturor ob ie c te lor re fe rite d e c am p urile ac e lui ob ie c t p oate fiim p le m entata p rin m e canism ul serializ arii astfe l:

public Object clone() {

try {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

ObjectOutputStream out = new ObjectOutputStream(baos);

out.writeObject(this);

out.close();

byte[] buffer = baos.toByteArray();

ByteArrayInputStream bais = new ByteArrayInputStream(buffer);

ObjectInputStream in = new ObjectInputStream(bais);

Object ret = in.readObject();

in.close();

return ret;

} catch (Exception e) {

Page 198: Cristian Frasinaru-Curs Practic de Java.pdf

8 .4 . CL O NARE A O B IE CT E L O R 197

System.out.println(e);

return null;

}

}

Page 199: Cristian Frasinaru-Curs Practic de Java.pdf

198 CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

Page 200: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 9

Interfata g rafi ca cu utilizatorul

9 .1 Introducere

Interfata g rafic a cu utilizatorul (G U I), e ste un term en cu ınte le s larg carese re fe ra la toate tip urile d e com unicare vizu a la ıntre un p rog ram si utiliza-torii sai. A c easta este o p articularizare a interfe te i cu utilizatorul (U I), p rincare v om ınte le g e conce p tul g eneric d e interac tiune d intre p rog ram si utiliza-tori. L im b ajul J av a p une la d isp oz itie num eroase c lase p entru im p le m entaread iv e rse lor func tionalitati U I, ınsa ne v om ocup a ın continuare d e c e le carep e rm it realizarea inte fe te i g rafice cu utilizatorul (G U I).

D e la ap aritia lim b ajului J av a, b ib liote c ile d e c lase care ofera se rv ic iig rafice au suferit p rob ab il c e le m ai m ari sch im b ari ın tre c e rea d e la o v er-siune la alta. A c e st lucru se d atoreaz a, p e d e o p arte d ificultatii le g ate d eim p le m entarea notiunii d e p ortab ilitate , p e d e alta p arte ne v oii d e a inte g ram e canism e le G U I cu te h nolog ii ap arute si d e z v oltate ulterior, cum ar fi J a vaB ea n s. In m om entul actual, e x ista d oua m od alitati d e a crea o ap licatie cuinterfata g rafic a si anum e :

• A W T (A b stract W ind ow ing T oolk it) - e ste A P I-ul initial p us la d isp oz itieınc e p and cu p rim e le v e rsiuni d e J av a;

• S w ing - p arte d intr-un p roie c t m ai am p lu num it JF C (J av a Found a-tion Classes) creat ın urm a colab orarii d intre S un, N e tscap e si IB M ,S w ing se b az eaz a p e m od e lul A W T , e x tinz and func tionalitatea ac estuiasi ad aug and sau ınlocuind com p onente p entru d e z v oltarea ap licatiilorG U I.

199

Page 201: Cristian Frasinaru-Curs Practic de Java.pdf

200 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

A sad ar, e ste d e p re fe rat ca ap licatiile J av a sa fie create folosind te h nolog iaS w ing , ac easta p unand la d isp oz itie o p aleta m ult m ai larg a d e fac ilitati,ınsa nu v om renunta com p le t la A W T d eoare c e aic i e x ista c lase esentiale ,reutilizate ın S w ing .

In ac est cap itol v om p re z enta c lase le d e b az a si m e canism ul d e tratare ae v enim ente lor d in A W T , d eoare c e v a fi sim p lificat p roc esul d e ınte le g e re ad e z v oltarii une i ap licatii G U I, d up a care v om fac e tre c e rea la S w ing .

In p rinc ip iu, c rearea une i ap licatii g rafic e p resup une urm atoare le lucruri:

• D esig n

– Crearea une i sup rafe te d e afisare (cum ar fi o fereastra) p e care v orfi ase zate ob ie c te le g rafice (com p onente) care serv e sc la com uni-carea cu utilizatorul (b utoane , controale p entru e d itarea te x te lor,liste , e tc );

– Crearea si ase zarea com p onente lor p e sup rafata d e afisare la p oz itiilecoresp unz atoare ;

• F unctionalitate

– D efinirea unor ac tiuni care tre b uie sa se e x e cute ın m om entul c andutilizatorul interac tioneaz a cu ob ie c te le g rafice ale ap licatie i;

– ” A scultarea” e v enim ente lor g enerate d e ob ie c te ın m om entulinterac tiunii cu utilizatorul si e x e cutarea ac tiunilor coresp unz atoare ,asa cum au fost e le d efinite .

9 .2 M odelul A W T

P ach e tul care ofera com p onente A W T e ste java.aw t.Ob ie c te le g rafice sunt d eriv ate d in Com ponent, cu e x c e p tia m eniurilor cared e sc ind d in c lasa M enuCom ponent. A sad ar, p rin notiunea d e com p onentav om ınte le g e ın continuare oric e ob ie c t care p oate av ea o re p re z entare g rafic asi care p oate interactiona cu utilizatorul. E x e m p le d e com p onente sunt fere -stre le , b utoanele , liste le , b are d e d efilare , e tc . T oate com p onente le A W T suntd efinte d e c lase p rop rii c e se g asesc ın p ach e tul java.awt, c lasa Component

fiind sup erc lasa ab stracta a tuturor ac estor c lase .Crearea ob ie c te lor g rafice nu realiz eaz a autom at si afisarea lor p e e c ran.

M ai ıntai e le tre b uie ase zate p e o su p ra fa ta d e a fi sa re , care p oate fi o fereastra

Page 202: Cristian Frasinaru-Curs Practic de Java.pdf

9 .2 . M O D E L UL AW T 201

sau un ap p le t, si v or d e v eni v iz ib ile ın m om entul ın care sup rafata p e care suntafisate v a fi v iz ib ila. O astfe l d e sup rafata p e care sunt p lasate com p onentese m ai num e ste co n ta in er si re p re z inta o instanta a une i c lase d e riv ate d inContainer. Clasa Container e ste o sub c lasa ap arte a lui Component, fiindla rand ul e i sup erc lasa tuturor sup rafete lor d e afisare J av a.

A sa cum am v azut, interfata g rafic a se rv e ste interac tiunii cu utilizatorul.D e c e le m ai m ulte ori p rog ram ul tre b uie sa fac a o anum ita p re lucrare ınm om entul ın care utilizatorul a e fe c tuat o ac tiune si, p rin urm are , com p o-nente le tre b uie sa g enere z e e v enim ente ın func tie d e ac tiunea p e care ausuferit-o (ac tiune transm isa d e la tastatura, m ouse , e tc .). Inc e p and cu v er-siunea 1.1 a lim b ajului J av a, e v enim ente le sunt instante ale c lase lor d e riv ated in A W T E vent.A sad ar, un even im en t e ste p rod us d e o ac tiune a utilizatorului asup ra unuiob ie c t g rafic , d e c i e v enim ente le nu tre b uie g enerate d e p rog ram ator. Insch im b , ıntr-un p rog ram tre b uie sp e c ificat cod ul care se e x e cuta la ap aritiaunui e v enim ent. T ratarea e v enim ente lor se realiz eaz a p rin interm e d iul unorc lase d e tip listen er (ascultator, consum ator d e e v enim ente), c lase care suntd efinite ın p ach e tul java.aw t.event. In J av a, oric e com p onenta p oate ” con-sum a” e v enim ente le g enerate d e o alta com p onenta (v e z i ” T ratarea e v eni-m ente lor” ).

S a consid e ram un m ic e x e m p lu, ın care c re am o fe reastra c e contine d ouab utoane .

L isting 9.1: O fereastra cu d oua b utoane

import java.awt .*;

public class ExempluAWT1 {

public static void main(String args []) {

// Crearea ferestrei - un obiect de tip Frame

Frame f = new Frame("O fereastra");

// Setarea modului de dipunere a componentelor

f.setLayout(new FlowLayout ());

// Crearea celor doua butoane

Button b1 = new Button("OK");

Button b2 = new Button("Cancel");

// Adaugarea butoanelor

f.add(b1);

Page 203: Cristian Frasinaru-Curs Practic de Java.pdf

202 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

f.add(b2);

f.pack();

// Afisarea fereastrei

f.show();

}

}

D up a cum v e ti ob serv a la e x e cutia ac estui p rog ram , atat b utoanele ad aug ated e noi c at si b utonul d e ınch id e re a ferestre i sunt func tionale , ad ic a p ot fiap asate , d ar nu realiz eaz a nim ic . A c e st lucru se ıntam p la d eoare c e nu amsp e c ificat nic aie ri cod ul care tre b uie sa se e x e cute la ap asarea ac estor b u-toane .D e ase m enea, m ai tre b uie re m arcat c a nu am sp e c ificat nic aie ri d im ensiu-nile fe re stre i sau ale b utoanelor si nic i p oz itiile ın ac estea sa fie p lasate . Cutoate ac estea e le sunt p lasate unul lang a c e lalalt, fara sa se sup rap una iarsup rafata fe reastre i e ste sufic ient d e m are c at sa cup rind a am b e le ob ie c te .A c e ste ” fenom ene ” sunt p rov ocate d e un ob ie c t sp e c ial d e tip FlowLayout

p e care l-am sp e c ificat si care se ocup a cu g estionarea ferestre i si cu p lasareacom p onente lor ıntr-o anum ita ord ine p e sup rafata e i. A sad ar, m od ul d earanjare nu este o caracteristic a a sup rafe te i d e afisare c i, fie care containerare asoc iat un ob ie c t care se ocup a cu d im ensionarea si d isp unerea com p o-nente lor p e sup rafata d e afisare si care se num este gestio n a r d e po zitio n a re(la y o u t m a n a ger) (v e z i ” G e stionarea p oz itionarii” ).

9 .2 .1 Com ponentele A W T

D up a cum am sp us d e ja, toate com p onente le A W T sunt d efinte d e c lasep rop rii c e se g asesc ın p ach e tul java.awt, c lasa Com ponent fiind sup erc lasaab stracta a tuturor ac estor c lase .

• B utton - b utoane cu etich e ta form ata d intr-un te x t p e o sing ura linie ;

• Canvas - sup rafata p entru d esenare ;

• Ch eck b ox - com p onenta c e p oate av ea d oua stari; m ai m ulte ob ie c ted e ac e st tip p ot fi g rup ate folosind c lasa Ch eck B ox G roup;

• Ch oice - liste ın care d oar e le m entul se le c tat este v iz ib il si care sed e sch id la ap asarea lor;

Page 204: Cristian Frasinaru-Curs Practic de Java.pdf

9 .2 . M O D E L UL AW T 203

• Container - sup erc lasa tuturor sup rafe te lor d e afisare (v e z i ” S up rafe ted e afisare ” );

• L ab el - e tich e te sim p le c e p ot contine o sing ura linie d e te x t ne e d itab il;

• L ist - liste cu se le c tie sim p la sau m ultip la;

• S crollb ar - b are d e d efilare orizontale sau v erticale ;

• T ex tCom ponent - sup erc lasa com p onente lor p entru e d itarea te x tu-lui: T ex tF ield (p e o sing ura linie ) si T ex tA rea (p e m ai m ulte linii).

M ai m ulte inform atii le g ate d e ac este c lase v or fi p re z entate ın se c tiunea” Folosirea com p onente lor A W T ” .

D in cauza unor d ife rente e sentiale ın im p le m entarea m eniurilor p e d ife ritep latform e d e op e rare , ac estea nu au p utut fi inte g rate ca ob ie c te d e tipComponent, sup erc lasa care d e sc rie m eniuri fiind M enuCom ponent (v e z i” M eniuri” ).

Com p onente le A W T au p este 100 d e m e tod e com une , m ostenite d in c lasaComponent. A c e stea serv e sc uzual p entru afl area sau setarea atrib ute lorob ie c te lor, cum ar fi: d im ensiune , p oz itie , culoare , font, e tc . si au form atulg eneral g etP ro p rieta te , re sp e c tiv setP ro p rieta te . Cele m ai folosite , g rup atep e tip ul p rop rie tatii g e stionate sunt:

• P oz itiegetLocation, getX, getY, getLocationOnScreen

setLocation, setX, setY

• D im ensiunigetSize, getHeight, getWidth

setSize, setHeight, setWidth

• D im ensiuni si poz itiegetBounds

setBounds

• Culoare (te x t si fund al)getForeground, getBackground

setForeground, setBackground

Page 205: Cristian Frasinaru-Curs Practic de Java.pdf

204 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

• F ontgetFont

setFont

• V iz ib ilitatesetVisible

isVisible

• InteractivitatesetEnabled

isEnabled

9 .2 .2 S uprafete de afi sare (Clasa Container)

Crearea ob ie c te lor g rafice nu realiz eaz a autom at si afisarea lor p e e c ran. M aiıntai e le tre b uie ase zate p e o sup rafata, care p oate fi o fereastra sau sup rafataunui ap p le t, si v or d e v eni v iz ib ile ın m om entul ın care sup rafata resp e c tiv av a fi v iz ib ila. O astfe l d e sup rafata p e care sunt p lasate com p onente le senum e ste su p ra fa ta d e a fi sa re sau co n ta in er si re p re z inta o instanta a une i c lased e riv ata d in Container. O p arte d in c lase le a c aror p arinte este Container

e ste p re z entata m ai jos:

• W indow - e ste sup erc lasa tututor ferestre lor. D in ac easta c lasa suntd eriv ate :

– F ram e - fe re stre stand ard ;

– D ialog - fe re stre d e d ialog m od ale sau nem od ale ;

• P anel - o sup rafata fara re p re z entare g rafic a folosita p entru g rup areaaltor com p onente . D in ac easta c lasa d e riv a A pplet, folosita p entrucrearea ap p le turilor.

• S crollP ane - container folosit p entru im p le m entarea autom ata a d e rulariip e orizontala sau v erticala a une i com p onente .

A sad ar, un container este folosit p entru a ad aug a com p onente p e sup rafatalui. Com p onente le ad aug ate sunt m e m orate ıntr-o lista iar p oz itiile lor d inac easta lista v or d efini ord inea d e trav ersare ” front-to-b ack ” a ac estora ıncad rul containerului. D ac a nu este sp e c ificat nic i un ind e x la ad aug area une icom p onente , atunc i ea v a fi ad aug ata p e ultim a p oz itie a liste i.

Page 206: Cristian Frasinaru-Curs Practic de Java.pdf

9 .2 . M O D E L UL AW T 205

Clasa Container contine m e tod e le com une tututor sup rafe te lor d e afisare .D intre c e le m ai folosite , am intim :

• add - p e rm ite ad aug area une i com p onente p e sup rafata d e afisare .O com p onenta nu p oate ap artine d e c at unui sing ur container, c e ea c eınseam na c a p entru a m uta un ob ie c t d intr-un container ın altul tre b uiesa-l e lim inam m ai ıntai d e p e containerul initial.

• rem ove - e lim ina o com p onenta d e p e container;

• setL ay out - stab ile ste g e stionarul d e p oz itionare al containerului (v e z i” G e stionarea p oz itionarii” );

• g etInsets - d e te rm ina d istanta re z e rv ata p entru m arg inile sup rafe te id e afisare ;

• validate - forteaz a containerul sa rease z e toate com p onente le sale .A c easta m e tod a tre b uie ap e lata e x p lic it atunc i c and ad aug am sau e lim inamcom p onente p e sup rafata d e afisare d up a c e ac easta a d e v enit v iz ib ila.

E x e m p lu:

Frame f = new Frame("O fereastra");

// Adaugam un buton direct pe fereastra

Button b = new Button("Hello");

f.add(b);

// Adaugam doua componente pe un panel

Label et = new Label("Nume:");

TextField text = new TextField();

Panel panel = new Panel();

panel.add(et);

panel.add(text);

// Adaugam panel-ul pe fereastra

// si, indirect, cele doua componente

f.add(panel);

Page 207: Cristian Frasinaru-Curs Practic de Java.pdf

206 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

9 .3 G estionarea poz itionarii

S a consid e ram m ai ıntai un ex e m p lu d e p rog ram J av a care afiseaz a 5 b utoanep e o fereastra:

L isting 9.2: P oz itionarea a 5 b utoane

import java.awt .*;

public class TestLayout {

public static void main(String args []) {

Frame f = new Frame("Grid Layout");

f.setLayout(new GridLayout (3, 2)); //*

Button b1 = new Button("Button 1");

Button b2 = new Button("2");

Button b3 = new Button("Button 3");

Button b4 = new Button("Long -Named Button 4");

Button b5 = new Button("Button 5");

f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5);

f.pack();

f.show();

}

}

Fereastra afisata d e ac est p rog ram v a arata astfe l:

S a m od ific am acum linia m arcata cu ’* ’ ca m ai jos, lasand nesch im b atrestul p rog ram ului:

Frame f = new Frame("Flow Layout");

f.setLayout(new FlowLayout());

Fereastra afisata d up a ac easta m od ificare v a av ea o cu totul altfe l d ed isp unere a com p onente lor sale :

Page 208: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 207

M otiv ul p entru care c e le d oua fe restre arata atat d e d ife rit e ste c a folosescg e stionari d e p oz itionare d ife riti: GridLayout, re sp e c tiv FlowLayout.

D efi nitie

U n gestio n a r d e po zitio n a re (la y o u t m a n a ger) e ste un ob ie c t care con-troleaz a d im ensiunea si aranjarea (p oz itia) com p onente lor unui container.

A sad ar, m od ul d e aranjare a com p onente lor p e o sup rafata d e afisarenu este o caracteristic a a containerului. Fie care ob ie c t d e tip Container

(Applet, Frame, Panel, e tc .) are asoc iat un ob ie c t care se ocup a cu d is-p unerea com p onente lor p e sup rafata sa si anum e g e stionarul sau d e p oz itionare .T oate c lase le care instantiaza ob ie c te p entru g estionarea p oz itionarii im p le -m enteaz a interfata L ay outM anag er.

L a instantie rea unui container se c re eaz a im p lic it un g estionar d e p oz itionareasoc iat ac estuia. D e e x e m p lu, p entru o fereastra g e stionarul im p lic t e ste d etip BorderLayout, ın tim p c e p entru un p anel este d e tip FlowLayout.

9 .3 .1 F olosirea g estionarilor de poz itionare

A sa cum am v azut, oric e container are un g estionar im p lic it d e p oz itionare -un ob ie c t care im p le m eneaz a interfata LayoutManager, ac e sta fiind u-i atasatautom at la crearea sa. In cazul ın care ac esta nu coresp und e ne c esitatilornoastre , e l p oate fi sch im b at cu usurinta. Ce i m ai utilizati g e stionari d inp ach e tul java.awt sunt:

• F low L ay out

• B orderL ay out

• G ridL ay out

• CardL ay out

• G ridB ag L ay out

Page 209: Cristian Frasinaru-Curs Practic de Java.pdf

208 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

P e lang a ac e stia, m ai e x ista si c e i d in m od e lul S w ing care v or fi p re z entatiın cap itolul d e d icat d e z v oltarii d e ap licatii G U I folosind S w ing .

A tasarea e x p lic ita a unui g e stionar d e p oz itionare la un container se fac ecu m etod a setL ay out a clase i Container. M e tod a p oate p rim i ca p aram etruoric e instanta a une i c lase care im p le m enteaz a interfata LayoutManager.S e c v enta d e atasare a unui g estionar p entru un container, p articularizatap entru FlowLayout, e ste :

FlowLayout gestionar = new FlowLayout();

container.setLayout(gestionar);

// sau, mai uzual:

container.setLayout(new FlowLayout());

P rog ram e le nu ap e leaz a ın g eneral m e tod e ale g e stionarilor d e p oz itionare ,d ar ın cazul c and av e m ne v oie d e ob ie c tul g estionar ıl p ute m ob tine cu m etod ag etL ay out d in c lasa Container.

U na d in fac ilitatile c e le m ai utile oferite d e g e stionarii d e p oz itionareeste rearanjarea com p onente le unui container atunc i c and ac esta este re d -im e sionat. P oz itiile si d im ensiunile com p onente lor nu sunt fix e , e le fiindajustate autom at d e c atre g e stionar la fie care re d im ensionare astfe l ınc at saocup e c at m ai ” e stetic ” sup rafata d e afisare . Cum sunt d eterm inate ınsad im ensiunile im p lic ite ale com p onente lor ?Fie care c lasa d e riv ata d in Component p oate im p le m enta m etod e le g etP re-ferredS ize, g etM inim um S ize si g etM ax im um S ize care sa re turnez e d i-m ensiunea im p lic ita a com p onente i re sp e c tiv e si lim ite le ın afara c arora com -p onenta nu m ai p oate fi d esenata. G e stionarii d e p oz itionare v or ap e la ac estem e tod e p entru a calcula d im ensiunea la care v or afisa o com p onenta.

S unt ınsa situatii c and d orim sa p lasam com p onente le la anum ite p oz itiifix e iar ac estea sa ram ana acolo ch iar d ac a re d im ensionam containerul. Folosindun g estionar ac easta po zitio n a re a bso lu ta a com p onente lor nu este p osib ila sid e c i tre b uie cum v a sa renuntam la g estionarea autom ata a containerul. A c e stlucru se realiz eaz a p rin trim ite ra arg um entului null m e tod e i setLayout:

// pozitionare absoluta a componentelor in container

container.setLayout(null);

Folosind p oz itionarea ab soluta, nu v a m ai fi ınsa sufic ient sa ad aug am cum etod a add com p onente le ın container, c i v a tre b ui sa sp e c ific am p oz itia si

Page 210: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 209

d im ensiunea lor - ac est lucru era facut autom at d e g e stionarul d e p oz itionare .

container.setLayout(null);

Button b = new Button("Buton");

b.setSize(10, 10);

b.setLocation (0, 0);

container.add(b);

In g eneral, se re com and a folosirea g estionarilor d e p oz itionare ın toatesituatiile c and ac est lucru este p osib il, d eoare c e p e rm it p rog ram ului sa aib aac e easi ” ınfatisare ” ind ife rent d e p latform a si re zolutia p e care este rulat.P oz itionarea ab soluta p oate rid ica d iv e rse p rob le m e ın ac est sens.

S a analizam ın continuare p e fie care d in g estionarii am intiti anterior.

9 .3 .2 G estionarul F low L ay out

A c e st g e stionar aseaz a com p onente le p e sup rafata d e afisare ın fl ux liniar, m aip re c is, com p onente le sunt ad aug ate una d up a alta p e linii, ın lim ita sp atiuluid isp onib il. In m om entul c and o com p onenta nu m ai ıncap e p e linia curenta setre c e la urm atoarea linie , d e sus ın jos. A d aug area com p onente lor se fac e d ela stang a la d reap ta p e linie , iar alinie rea ob ie c te lor ın cad rul une i linii p oatefi d e tre i fe luri: la stang a, la d reap ta si p e c entru. Im p lic it, com p onente lesunt c entrate p e fie care linie iar d istanta im p lic ita ıntre com p onente este d e5 p ix e li p e v e rticala si 5 p e orizontala.

E ste g e stionarul im p lic it al containere lor d e riv ate d in c lasa Panel d e c i sial ap p le t-urilor.

L isting 9.3: G e stionarul FlowLayout

import java.awt .*;

public class TestFlowLayout {

public static void main(String args []) {

Frame f = new Frame("Flow Layout");

f.setLayout(new FlowLayout ());

Button b1 = new Button("Button 1");

Button b2 = new Button("2");

Button b3 = new Button("Button 3");

Page 211: Cristian Frasinaru-Curs Practic de Java.pdf

210 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Button b4 = new Button("Long -Named Button 4");

Button b5 = new Button("Button 5");

f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5);

f.pack();

f.show();

}

}

Com p onente le fe re stre i v or fi afisate astfe l:

R e d im ensionand fe reastra astfe l ınc at c e le c inc i b utoane sa nu m ai ıncap ap e o linie , ultim e le d intre e le v or fi tre cute p e linia urm atoare :

9 .3 .3 G estionarul B orderL ay out

G e stionarul BorderLayout ım p arte sup rafata d e afisare ın c inc i re g iuni, core -sp unz atoare c e lor p atru p uncte card inale si c entrului. O com p onenta p oate fip lasata ın oricare d in ac este re g iuni, d im eniunea com p onente i fiind calculataastfe l ınc at sa ocup e ıntre g sp atiul d e afisare ofe rit d e re g iunea resp e c tiv a.P entru a ad aug a m ai m ulte ob ie c te g rafice ıntr-una d in c e le c inc i zone , e letre b uie g rup ate ın p realab il ıntr-un p anel, care v a fi am p lasat ap oi ın re g iunead orita (v e z i ” G rup area com p onente lor - c lasa P anel” ).

A sad ar, la ad aug area une i com p onente p e o sup rafata g e stionata d e BorderLayout,m e tod a add v a m ai p rim i p e lang a re fe rinta com p onente i si zona ın careac easta v a fi am p lasata, care v a fi sp e c ificata p rin una d in constante le c lase i:NORTH, SOUTH, EAST, WEST, CENTER.

BorderLayout e ste g e stionarul im p lic it p entru toate containere le care d e -sc ind d in c lasa Window, d e c i al tuturor tip urilor d e fe re stre .

Page 212: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 211

L isting 9.4: G e stionarul BorderLayout

import java.awt .*;

public class TestBorderLayout {

public static void main(String args []) {

Frame f = new Frame("Border Layout");

// Apelul de mai jos poate sa lipseasca

f.setLayout(new BorderLayout ());

f.add(new Button("Nord"), BorderLayout.NORTH);

f.add(new Button("Sud"), BorderLayout.SOUTH);

f.add(new Button("Est"), BorderLayout.EAST);

f.add(new Button("Vest"), BorderLayout.WEST);

f.add(new Button("Centru"), BorderLayout.CENTER);

f.pack();

f.show();

}

}

Cele c inc i b utoane ale fe restre i v or fi afisate astfe l:

L a re d im ensionarea ferestre i se p ot ob serv a urm atoare le lucruri: nord ul sisud ul se re d im ensioneaz a d oar p e orizontala, e stul si v e stul d oar p e v e rticala,ın tim p c e c entrul se re d im ensioneaz a atat p e orizontala c at si p e v e rticala.R e d im ensionarea com p onente lor d in fie care zona se fac e astfe l ınc at e le ocup atoata zona containerului d in care fac p arte .

9 .3 .4 G estionarul G ridL ay out

G e stionarul GridLayout org aniz eaz a containerul ca un tab e l cu rand uri sicoloane , com p onente le fiind p lasate ın c e lule le tab e lului d e la stang a lad reap ta, ınc e p and cu p rim ul rand . Celule le tab e lului au d im ensiuni e g aleiar o com p onenta p oate ocup a d oar o sing ura c e lula. N um arul d e linii sicoloane v or fi sp e c ificate ın constructorul g estionarului, d ar p ot fi m od ificate

Page 213: Cristian Frasinaru-Curs Practic de Java.pdf

212 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

si ulte rior p rin m e tod e le setRows, re sp e c tiv setCols. D ac a num arul d e liniisau coloane este 0 (d ar nu am b e le ın ac e lasi tim p ), atunc i com p onente le v orfi p lasate ıntr-o sing ura coloana sau linie . D e ase m enea, d istanta ıntre com -p onente p e orizontala si d istanta ıntre rand urile tab e lului p ot fi sp e c ificateın constructor sau stab ilite ulterior.

L isting 9.5: G e stionarul GridLayout

import java.awt .*;

public class TestGridLayout {

public static void main(String args []) {

Frame f = new Frame("Grid Layout");

f.setLayout(new GridLayout (3, 2));

f.add(new Button("1"));

f.add(new Button("2"));

f.add(new Button("3"));

f.add(new Button("4"));

f.add(new Button("5"));

f.add(new Button("6"));

f.pack();

f.show();

}

}

Cele sase b utoane ale fe restre i v or fi p lasate p e tre i rand uri si d ouacoloane , astfe l:

R e d im ensionarea ferestre i v a d e te rm ina re d im ensionarea tuturor c e lule lorsi d e c i a tuturor com p onente lor, atat p e orizontala c at si p e v e rticala.

9 .3 .5 G estionarul CardL ay out

G e stionarul CardLayout trateaz a com p onente le ad aug ate p e sup rafata saıntr-o m anie ra sim ilara cu c ea a d isp unerii c artilor d e joc ıntr-un p ach e t.

Page 214: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 213

S up rafata d e afisare p oate fi ase m anata cu p ach e tul d e c arti iar fie care com -p onenta e ste o carte d in p ach e t. L a un m om ent d at, num ai o sing ura com -p onenta e ste v iz ib ila (” c ea d e d easup ra” ).

Clasa d isp une d e m e tod e p rin care sa p oata fi afisata o anum ita com -p onenta d in p ach e t, sau sa se p oata p arcurg e se c v ential p ach e tul, ord ineacom p onente lor fiind interna g e stionarului.

P rinc ip ala utilitate a ac estui g e stionar este utilizarea m ai efic ienta asp atiului d isp onib il ın situatii ın care com p onente le p ot fi g rup ate ın asafe l ınc at utilizatorul sa interac tione z e la un m om ent d at d oar cu un anum itg rup (o carte d in p ach e t), c e le lalte fiind ascunse .O clasa S w ing care im p le m enteaz a un m e cansim sim ilar este JTabbedPane.

L isting 9.6: G e stionarul CardLayout

import java.awt .*;

import java.awt.event .*;

public class TestCardLayout extends Frame implements

ActionListener {

Panel tab;

public TestCardLayout () {

super("Test CardLayout");

Button card1 = new Button("Card 1");

Button card2 = new Button("Card 2");

Panel butoane = new Panel();

butoane.add(card1);

butoane.add(card2);

tab = new Panel();

tab.setLayout(new CardLayout ());

TextField tf = new TextField("Text Field");

Button btn = new Button("Button");

tab.add("Card 1", tf);

tab.add("Card 2", btn);

add(butoane , BorderLayout.NORTH);

add(tab , BorderLayout.CENTER);

pack();

show();

Page 215: Cristian Frasinaru-Curs Practic de Java.pdf

214 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

card1.addActionListener(this);

card2.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

CardLayout gestionar = (CardLayout) tab.getLayout ();

gestionar.show(tab , e.getActionCommand ());

}

public static void main(String args []) {

TestCardLayout f = new TestCardLayout ();

f.show();

}

}

P rim a ” carte ” e ste v iz ib ila A d oua ” carte ” e ste v iz ib ila

9 .3 .6 G estionarul G ridB ag L ay out

E ste c e l m ai com p le x si fl e x ib il g e stionar d e p oz itionare d in J av a. L a fe l ca ıncazul g estionarului GridLayout, sup rafata d e afisare este consid e rata ca fiindun tab e l ınsa, sp re d eose b ire d e ac e sta, num arul d e linii si d e coloane suntd eterm inate autom at, ın func tie d e com p onente le am p lasate p e sup rafata d eafisare . D e ase m enea, ın func tie d e com p onente le g e stionate , d im ensiunilec e lule lor p ot fi d ife rite cu sing ure le re stric tii ca p e ac e easi linie sa aib a ac e easiınaltim e , iar p e coloana aib a ac e easi latim e . S p re d eose b ire d e GridLayout,o com p onenta p oate ocup a m ai m ulte c e lule ad iac ente , ch iar d e d im ensiunid ife rite , zona ocup ata fiind re fe rita p rin ” re g iunea d e afisare ” a com p onente ire sp e c tiv e .

P entru a sp e c ifica m od ul d e afisare a une i com p onente , ac este ia ıi e steasoc iat un ob ie c t d e tip G ridB ag Constraints, ın care se sp e c ific a d ife ritep rop rie tati ale com p onente i re fe ritoare la re g iunea sa d e afisare si la m od ulın care v a fi p lasata ın ac easta re g iune . L e g atura d intre o com p onenta si unob ie c t GridBagConstraints se realiz eaz a p rin m etod a setConstraints:

GridBagLayout gridBag = new GridBagLayout();

Page 216: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 215

container.setLayout(gridBag);

GridBagConstraints c = new GridBagConstraints();

//Specificam restrictiile referitoare la afisarea componentei

. . .

gridBag.setConstraints(componenta, c);

container.add(componenta);

A sad ar, ınainte d e a ad aug a o com p onenta p e sup rafata unui containercare are un g estionar d e tip GridBagLayout, v a tre b ui sa sp e c ific am anum itip aram etri (constrang eri) re fe ritori la cum v a fi p lasata com p onenta resp e c -tiv a. A c e ste constrang e ri v or fi sp e c ificate p rin interm e d iul unui ob ie c t d e tipGridBagConstraints, care p oate fi re folosit p entru m ai m ulte com p onentecare au ace leasi constrang eri d e afisare :

gridBag.setConstraints(componenta1, c);

gridBag.setConstraints(componenta2, c);

. . .

Cele m ai utilizate tip uri d e constrang eri p ot fi sp e c ificate p rin interm e d iulurm atoare lor v ariab ile d in c lasa GridBagConstraints:

• gridx, gridy - c e lula c e re p re z inta coltul stang a sus al com p onente i;

• gridwidth, gridheight - num arul d e c e lule p e linie si coloana p e carev a fi afisata com p onenta;

• fill - folosita p entru a sp e c ifica d ac a o com p onenta v a ocup a ıntre gsp atiul p e care ıl are d e stinat; v alorile p osib ile sunt HORIZONTAL, VERTICAL,BOTH, NONE;

• insets - d istante le d intre com p onenta si m arg inile sup rafe te i sale d eafisare ;

• anchor - folosita atunc i c and com p onenta este m ai m ic a d e c at sup rafatasa d e afisare p entru a forta o anum ita d isp unere a sa: nord , sud , e st,v e st, e tc .

• weigthx, weighty - folosite p entru d istrib utia sp atiului lib e r; uzualau v aloarea 1;

Page 217: Cristian Frasinaru-Curs Practic de Java.pdf

216 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Ca ex e m p lu, sa realiz am o fe reastra ca ın fig ura d e m ai jos. P entru asim p lifica cod ul, a fost creata o m e tod a re sp onsab ila cu setarea v alorilorgridx, gridy, gridwidth, gridheight si ad aug area une i com p onente curestric tiile stab ilite p e fe reastra.

L isting 9.7: G e stionarul GridBagLayout

import java.awt .*;

public class TestGridBagLayout {

static Frame f;

static GridBagLayout gridBag;

static GridBagConstraints gbc;

static void adauga(Component comp ,

int x, int y, int w, int h) {

gbc.gridx = x;

gbc.gridy = y;

gbc.gridwidth = w;

gbc.gridheight = h;

gridBag.setConstraints(comp , gbc);

f.add(comp);

}

public static void main(String args []) {

f = new Frame("Test GridBagLayout");

gridBag = new GridBagLayout ();

gbc = new GridBagConstraints ();

gbc.weightx = 1.0;

gbc.weighty = 1.0;

Page 218: Cristian Frasinaru-Curs Practic de Java.pdf

9 .3 . G E ST IO NARE A PO Z IT IO NARII 217

gbc.insets = new Insets(5, 5, 5, 5);

f.setLayout(gridBag);

Label mesaj = new Label("Evidenta persoane", Label.CENTER

);

mesaj.setFont(new Font("Arial", Font.BOLD , 24));

mesaj.setBackground(Color.yellow);

gbc.fill = GridBagConstraints.BOTH;

adauga(mesaj , 0, 0, 4, 2);

Label etNume = new Label("Nume:");

gbc.fill = GridBagConstraints.NONE;

gbc.anchor = GridBagConstraints.EAST;

adauga(etNume , 0, 2, 1, 1);

Label etSalariu = new Label("Salariu:");

adauga(etSalariu , 0, 3, 1, 1);

TextField nume = new TextField("", 30);

gbc.fill = GridBagConstraints.HORIZONTAL;

gbc.anchor = GridBagConstraints.CENTER;

adauga(nume , 1, 2, 2, 1);

TextField salariu = new TextField("", 30);

adauga(salariu , 1, 3, 2, 1);

Button adaugare = new Button("Adaugare");

gbc.fill = GridBagConstraints.NONE;

adauga(adaugare , 3, 2, 1, 2);

Button salvare = new Button("Salvare");

gbc.fill = GridBagConstraints.HORIZONTAL;

adauga(salvare , 1, 4, 1, 1);

Button iesire = new Button("Iesire");

adauga(iesire , 2, 4, 1, 1);

f.pack();

f.show();

}

}

Page 219: Cristian Frasinaru-Curs Practic de Java.pdf

218 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

9 .3 .7 G ruparea com ponentelor (Clasa P anel)

P lasarea com p onente lor d ire c t p e sup rafata d e afisare p oate d e v eni incom od aın cazul ın care av e m m ulte ob ie c te g rafice . D in ac est m otiv , se re com and ag rup area com p onente lor ınrud ite ca func tii astfe l ınc at sa p ute m fi sig uri c a,ind ife rent d e g e stionarul d e p oz itionare al sup rafe te i d e afisare , e le se v or g asiım p reuna. G rup area com p onente lor se fac e ın panel-uri.

U n pa n el e ste c e l m ai sim p lu m od e l d e container. E l nu are o re p re z entarev iz ib ila, rolul sau fiind d e a oferi o sup rafata d e afisare p entru com p onenteg rafice , inc lusiv p entru alte p anel-uri. Clasa care instantiaza ac este ob ie c tee ste P anel, e x tensie a sup erc lase i Container. P entru a aranja coresp unz atorcom p onente le g rup ate ıntr-un p anel, ac estuia i se p oate sp e c ifica un g estionard e p oz itionare anum e , folosind m e tod a setLayout. G e stionarul im p lic it p en-tru containere le d e tip Panel e ste FlowLayout.

A sad ar, o aranjare efic ienta a com p onente lor une i fe re stre ınseam na:

• g rup area com p onente lor ” ınfratite ” (care nu tre b uie sa fie d e sp artited e g e stionarul d e p oz itionare al fe restre i) ın p anel-uri;

• aranjarea com p onente lor unui p anel, p rin sp e c ificarea unui g e stionard e p oz itionare coresp unz ator;

• aranjarea p ane l-urilor p e sup rafata fe restre i, p rin sp e c ificarea g estionaru-lui d e p oz itionare al fe re stre i.

L isting 9.8: G rup area com p onente lor

import java.awt .*;

public class TestPanel {

public static void main(String args []) {

Frame f = new Frame("Test Panel");

Panel intro = new Panel();

intro.setLayout(new GridLayout (1, 3));

intro.add(new Label("Text:"));

intro.add(new TextField("", 20));

intro.add(new Button("Adaugare"));

Panel lista = new Panel();

lista.setLayout(new FlowLayout ());

lista.add(new List (10));

lista.add(new Button("Stergere"));

Page 220: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 219

Panel control = new Panel();

control.add(new Button("Salvare"));

control.add(new Button("Iesire"));

f.add(intro , BorderLayout.NORTH);

f.add(lista , BorderLayout.CENTER);

f.add(control , BorderLayout.SOUTH);

f.pack();

f.show();

}

}

9 .4 T ratarea evenim entelor

U n even im en t e ste p rod us d e o ac tiune a utilizatorului asup ra une i com p o-nente g rafic e si re p re z inta m e canism ul p rin care utilizatorul com unic a e fe c tivcu p rog ram ul. E x e m p le d e e v enim ente sunt: ap asarea unui b uton, m od i-ficarea te x tului ıntr-un control d e e d itare , ınch id e rea sau re d im ensionareaune i fe restre , e tc . Com p onente le care g enereaz a anum ite e v enim ente se m ainum esc si su rse d e even im en te .

Interc e p tarea e v enim ente lor g enerate d e com p onente le unui p rog ram serealiz eaz a p rin interm e d iul unor c lase d e tip listener (ascultator, consum atord e e v enim ente). In J av a, oric e ob ie c t p oate ” consum a” e v enim ente le g enerated e o anum ita com p onenta g rafic a.

A sad ar, p entru a scrie cod care sa se e x e cute ın m om entul ın care utiliza-torul interactioneaz a cu o com p onenta g rafic a tre b uie sa fac e m urm atoare lelucruri:

• sa sc rie m o c lasa d e tip listener care sa ” asculte ” e v enim ente le p rod used e ac ea com p onenta si ın cad rul ac este i c lase sa im p le m entam m e tod esp e c ific e p entru tratarea lor;

Page 221: Cristian Frasinaru-Curs Practic de Java.pdf

220 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

• sa com unic am com p onente i sursa c a re sp e c tiv a c lasa ıi ” asculta” e v eni-m ente le p e care le g enereaz a, cu alte cuv inte sa ınre g istram ac ea c lasad re p t ” consum ator” al e v enim ente lor p rod use d e com p onenta resp e c -tiv a.

E v enim ente le sunt, ca oric e altc e v a ın J av a, ob ie c te . Clase le care d e sc riuac este ob ie c te se ım p art ın m ai m ulte tip uri ın func tie d e com p onenta carele g enereaz a, m ai p re c is ın func tie d e ac tiunea utilizatorului asup ra ac este ia.P entru fiecare tip d e e v enim ent e x ista o c lasa care instantiaz a ob ie c te d eac e l tip . D e e x e m p lu, e v enim entul g enerat d e ac tionarea unui b uton ested e sc ris d e c lasa ActionEvent, c e l g enerat d e m od ificarea unui te x t d e c lasaTextEvent, e tc . T oate ac este c lase sunt d eriv ate d in sup erc lasa A W T E vent,lista lor com p le ta fiind p re z entata ulterior.

O clasa consum atoare d e e v enim ente (listener) p oate fi oric e c lasa caresp e c ifica ın d e c laratia sa c a d ore ste sa asculte e v enim ente d e un anum ittip . A c e st lucru se realiz eaz a p rin im p le m entarea une i interfe te sp e c ific efie c arui tip d e e v enim ent. A stfe l, p entru ascultarea e v enim ente lor d e tipActionEvent c lasa resp e c tiv a tre b uie sa im p le m ente z e interfata ActionListener,p entru TextEvent interfata care tre b uie im p le m entata este TextListener,e tc . T oate ac este interfe te sunt d eriv ate d in E ventL istener.

Fie care interfata d efine ste una sau m ai m ulte m e tod e care v or fi ap e lateautom at la ap aritia unui e v enim ent:

class AscultaButoane implements ActionListener {

public void actionPerformed(ActionEvent e) {

// Metoda interfetei ActionListener

...

}

}

class AscultaTexte implements TextListener {

public void textValueChanged(TextEvent e) {

// Metoda interfetei TextListener

...

}

}

Intruc at o c lasa p oate im p le m enta oric ate interfe te , ea v a p utea sa ascultee v enim ente d e m ai m ulte tip uri:

Page 222: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 221

class Ascultator implements ActionListener, TextListener {

public void actionPerformed(ActionEvent e) { ... }

public void textValueChanged(TextEvent e) { ... }

}

V om v e d ea ın continuare m e tod e le fie c are i interfe te p entru a sti c e tre b uiesa im p le m ente z e o c lasa consum atoare d e e v enim ente .

A sa cum am sp us m ai d e v re m e , p entru ca e v enim ente le une i com p onentesa fie interc e p tate d e c atre o instanta a une i c lase ascultator, ac easta c lasatre b uie ınre g istrata ın lista ascultatorilor com p onente i re sp e c tiv e . A m sp uslista, d eoare c e e v enim ente le une i com p onente p ot fi ascultate d e oric ate c lase ,cu cond itia ca ac estea sa fie ınre g istrate la com p onenta resp e c tiv a. Inre g is-trarea une i c lase ın lista ascultatorilor une i com p onente se fac e cu m etod ed in c lasa Component d e tip ul addT ip E ven im en tL istener, iar e lim inarea e id in ac easta lista cu rem oveT ip E ven im en tL istener.

S um ariz and , tratarea e v enim ente lor ın J av a se d e sfasoara astfe l:

• Com p onente le g enereaz a e v enim ente c and c e v a ” interesant” se ıntam p la;

• S urse le e v enim ente lor p e rm it oric are i c lase sa ” asculte ” e v enim ente lesale p rin m etod e d e tip addXXXListener, und e XXX e ste un tip d ee v enim ent;

• O clasa care asculta e v enim ente tre b uie sa im p le m ente z e interfe te sp e c i-fic e fie c arui tip d e e v enim ent - ac estea d escriu m etod e c e v or fi ap e lateautom at la ap aritia e v enim ente lor.

9 .4 .1 E x em plu de tratare a evenim entelor

Inainte d e a d etalia asp e c te le p re z entate m ai sus, sa consid e ram un e x e m p lud e tratare a e v enim ente lor. V om crea o fereastra care sa contina d oua b u-toane cu num e le ” OK ” , re p e c tiv ” Cance l” . L a ap asarea fiec arui b uton v omscrie p e b ara d e titlu a ferestre i m e sajul ” A ti ap asat b utonul ...” .

L isting 9.9: A scultarea e v enim ente lor a d oua b utoane

import java.awt .*;

import java.awt.event .*;

Page 223: Cristian Frasinaru-Curs Practic de Java.pdf

222 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

setLayout(new FlowLayout ());

setSize (200, 100);

Button b1 = new Button("OK");

Button b2 = new Button("Cancel");

add(b1);

add(b2);

Ascultator listener = new Ascultator(this);

b1.addActionListener(listener);

b2.addActionListener(listener);

// Ambele butoane sunt ascultate de obiectul listener ,

// instanta a clasei Ascultator , definita mai jos

}

}

class Ascultator implements ActionListener {

private Fereastra f;

public Ascultator(Fereastra f) {

this.f = f;

}

// Metoda interfetei ActionListener

public void actionPerformed(ActionEvent e) {

f.setTitle("Ati apasat " + e.getActionCommand ());

}

}

public class TestEvent1 {

public static void main(String args []) {

Fereastra f = new Fereastra("Test Event");

f.show();

}

}

N u este ob lig atoriu sa d efinim c lase sp e c iale p entru ascultarea e v eni-m ente lor. In e x e m p lul d e m ai sus am d efinit c lasa Ascultator p entru ainterc e p ta e v enim ente le p rod use d e c e le d oua b utoane si d in ac est m otiv atre b uit sa trim ite m ca p aram etru constructorului c lase i o re fe rinta la fereas-tra noastra. M ai sim p lu ar fi fost sa folosim ch iar c lasa Fereastra p entrua trata e v enim ente le p rod use d e com p onente le sale . V om m od ifica p utin si

Page 224: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 223

ap licatia p entru a p une ın e v id enta o alta m od alitate d e a d ete rm ina com -p onenta g eneratoare a unui e v enim ent - m e tod a g etS ource.

L isting 9.10: T ratarea e v enim ente lor ın ferestra

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ActionListener {

Button ok = new Button("OK");

Button exit = new Button("Exit");

int n=0;

public Fereastra(String titlu) {

super(titlu);

setLayout(new FlowLayout ());

setSize (200, 100);

add(ok);

add(exit);

ok.addActionListener(this);

exit.addActionListener(this);

// Ambele butoane sunt ascultate in clasa Fereastra

// deci ascultatorul este instanta curenta: this

}

// Metoda interfetei ActionListener

public void actionPerformed(ActionEvent e) {

if (e.getSource () == exit)

System.exit (0); // Terminam aplicatia

if (e.getSource () == ok) {

n ++;

this.setTitle("Ati apasat OK de " + n + " ori");

}

}

}

public class TestEvent2 {

public static void main(String args []) {

Fereastra f = new Fereastra("Test Event");

f.show();

}

}

Page 225: Cristian Frasinaru-Curs Practic de Java.pdf

224 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

A sad ar, oric e c lasa p oate asculta e v enim ente d e oric e tip cu cond itia saim p le m ente z e interfe te le sp e c ific e ac e lor tip uri d e e v enim ente .

9 .4 .2 T ipuri de evenim ente

E v enim ente le se ım p art ın d oua cate g orii: d e n ivel jo s si sem a n tice .

E venim entele de nivel jos re p re z inta o interac tiune d e niv e l jos cum arfi o ap asare d e tasta, m iscarea m ouse -ului, sau o op eratie asup ra une i fe restre .In tab e lul d e m ai jos sunt enum erate c lase le c e d e sc riu ac este e v enim ente siop e ratiunile e fe c tuate (asup ra une i com p onente) care le g enereaz a:

ComponentEvent A scund ere , d e p lasare ,re d im ensionare , afisare

ContainerEvent A d aug are p e container, e lim inareFocusEvent Ob tinere , p ie rd e re foucsKeyEvent A p asare , e lib e rare taste , tastareMouseEvent Op eratiuni cu m ouse -ul: c lick , d rag , e tc .WindowEvent Op eratiuni asup ra ferestre lor:

m inim izare , m ax im izare ,e tc .

O anum ita ac tiune a utilizatorului p oate g enera m ai m ulte e v enim ente .D e e x e m p lu, tastarea lite re i ’A ’ v a g enera tre i e v enim ente : unul p entruap asare , unul p entru e lib e rare si unul p entru tastare . In func tie d e ne c e -sitatile ap licatie p ute m sc rie cod p entru tratarea fiec arui e v enim ent ın p arte .

E venim entele sem antice re p re z inta interac tiunea cu o com p onentaG U I: ap asarea unui b uton, se le c tarea unui articol d intr-o lista, e tc . Clase lecare d e sc riu ac este tip uri d e e v enim ente sunt:

ActionEvent A c tionareAdjustmentEvent A justarea une i v aloriItemEvent S ch im b area stariiTextEvent S ch im b area te x tului

Page 226: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 225

U rm atorul tab e l p re z inta com p onente le A W T si tip urile d e e v enim enteg enerate , p re z entate sub form a interfe te lor coresp unz atoare . E v id ent, e v eni-m ente le g enerate d e o sup erc lasa, cum ar fi Component, se v or re g asi si p entrutoate sub c lase le sale .

Component ComponentListener

FocusListener

KeyListener

MouseListener

MouseMotionListener

Container ContainerListener

Window WindowListener

Button

List ActionListener

MenuItem

TextField

Choice

Checkbox ItemListener

List

CheckboxMenuItem

Scrollbar AdjustmentListener

TextField TextListener

TextArea

Ob serv ati c a d e si e x ista o sing ura c lasa MouseEvent, e x ista d oua interfe teasoc iate MouseListener si MouseMotionListener. A c e st lucru a fost facutd eoare c e e v enim ente le le g ate d e d e p lasarea m ouse -ului sunt g enerate foartefre c v ent si re c e p tionarea lor p oate av ea un im p act ne g ativ asup ra v ite z e i d ee x e cutie , ın situatia c and tratarea ac estora nu ne intereseaz a si d orim satratam d oar e v enim ente d e tip c lick , d e e x e m p lu.

Oric e c lasa care trateaz a e v enim ente tre b uie sa im p le m ente z e ob lig atorium etod e le interfe te lor coresp unz atoare . T ab e lul d e m ai jos p re z inta, p entrufiecare interfata, m e tod e le p use la d isp oz itie si care tre b uie im p le m entate d ec atre c lasa ascultator.

Page 227: Cristian Frasinaru-Curs Practic de Java.pdf

226 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Interfata M etodeActionListener actionPerformed(ActionEvent e)

AdjustmentListener adjustmentValueChanged(AdjustmentEvent e)

componentHidden(ComponentEvent e)

ComponentListener componentMoved(ComponentEvent e)

componentResized(ComponentEvent e)

componentShown(ComponentEvent e)

ContainerListener componentAdded(ContainerEvent e)

componentRemoved(ContainerEvent e)

FocusListener focusGained(FocusEvent e)

focusLost(FocusEvent e)

ItemListener itemStateChanged(ItemEvent e)

keyPressed(KeyEvent e)

KeyListener keyReleased(KeyEvent e)

keyTyped(KeyEvent e)

mouseClicked(MouseEvent e)

mouseEntered(MouseEvent e)

MouseListener mouseExited(MouseEvent e)

mousePressed(MouseEvent e)

mouseReleased(MouseEvent e)

MouseMotionListener mouseDragged(MouseEvent e)

mouseMoved(MouseEvent e)

TextListener textValueChanged(TextEvent e)

windowActivated(WindowEvent e)

windowClosed(WindowEvent e)

windowClosing(WindowEvent e)

WindowListener windowDeactivated(WindowEvent e)

windowDeiconified(WindowEvent e)

windowIconified(WindowEvent e)

windowOpened(WindowEvent e)

In cazul ın care un ob ie c t listener trateaz a e v enim ente d e ac e lasi tip p rov o-cate d e com p onente d ife rite , e ste ne c esar sa p ute m afl a, ın cad rul une ia d inm etod e le d e m ai sus, care este sursa e v enim entului p e care ıl tratam p en-tru a p utea reac tiona ın conse c inta. T oate tip urile d e e v enim ente m ostenescm e tod a g etS ource care re turneaz a ob ie c tul resp onsab il cu g enerarea e v eni-m entului. In cazul ın care d orim sa d ife rentie m d oar tip ul com p onente i sursa,

Page 228: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 227

p ute m folosi op eratorul instanceof.

public void actionPerformed(ActionEvent e) {

Object sursa = e.getSource();

if (sursa instanceof Button) {

// A fost apasat un buton

Button btn = (Button) sursa;

if (btn == ok) {

// A fost apasat butonul ’ok’

}

...

}

if (sursa instanceof TextField) {

// S-a apasat Enter dupa editarea textului

TextField tf = (TextField) sursa;

if (tf == nume) {

// A fost editata componenta ’nume’

}

...

}

}

P e lang a getSource, ob ie c te le c e d e sc riu e v enim ente p ot p une la d isp oz itiesi alte m e tod e sp e c ific e care p e rm it afl area d e inform atii le g ate d e e v enim en-tul g enerat. D e e x e m p lu, ActionEvent contine m e tod a getActionCommand

care , im p lic it, re turneaz a e tich e ta b utonului care a fost ap asat. A stfe l d ep articularitati v or fi p re z entate m ai d e taliat ın se c tiunile d e d icate fie c are icom p onente ın p arte .

9 .4 .3 F olosirea adaptorilor si a claselor anonim e

A m v azut c a o c lasa care trateaz a e v enim ente d e un anum it tip tre b uie sa im -p le m ente z e interfata coresp unz atoare ac e lui tip . A c easta ınseam na c a tre b uiesa im p le m ente z e ob lig atoriu toate m e tod e le d efinite d e ac ea interfata, ch iard ac a nu sp e c ific a nic i un cod p entru unele d intre e le . S unt ınsa situatii c andac est lucru p oate d e v eni sup arator, m ai ales atunc i c and nu ne intereseaz ad e c at o sing ura m etod a a interfe te i.

U n e x e m p lu sug estiv e ste urm atorul: o fereastra care nu are sp e c ificat codp entru tratarea e v enim ente lor sale nu p oate fi ınch isa cu b utonul stand ard

Page 229: Cristian Frasinaru-Curs Practic de Java.pdf

228 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

m arcat cu ’x ’ d in coltul d reap ta sus si nic i cu com b inatia d e taste A lt+ F4.P entru a realiza ac est lucru tre b uie interc e p tat e v enim entul d e ınch id e re aferestre i ın m e tod a windoClosing si ap e lata m e tod a dispose d e ınch id e rea fe re stre i, sau System.exit p entru term inarea p rog ram ului, ın cazul c andeste v orb a d e fe reastra p rinc ip ala a ap licatie i. A c easta ınseam na c a tre b uiesa im p le m entam interfata WindowListener care are nu m ai p utin d e saptem e tod e .

L isting 9.11: Im p le m entarea interfe te i WindowListener

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements WindowListener {

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(this);

}

// Metodele interfetei WindowListener

public void windowOpened(WindowEvent e) {}

public void windowClosing(WindowEvent e) {

// Terminare program

System.exit (0);

}

public void windowClosed(WindowEvent e) {}

public void windowIconified(WindowEvent e) {}

public void windowDeiconified(WindowEvent e) {}

public void windowActivated(WindowEvent e) {}

public void windowDeactivated(WindowEvent e) {}

}

public class TestWindowListener {

public static void main(String args []) {

Fereastra f = new Fereastra("Test WindowListener");

f.show();

}

}

Ob serv ati c a tre b uie sa im p le m entam toate m e tod e le interfe te i, ch iar d ac anu scrie m nic i un cod p entru unele d intre e le . S ing ura m etod a care ne intere -seaz a e ste windowClosing, ın care sp e c ific am c e tre b uie facut atunc i c andutilizatorul d oreste sa ınch id a fe reastra. P entru a ev ita scrie rea inutila a

Page 230: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 229

acestor m e tod e , e x ista o serie d e c lase care im p le m enteaz a interfe te le d e tip” listener” fara a sp e c ifica nic i un cod p entru m etod e le lor. A c e ste c lase senum esc adaptori.

U n a d a p to r e ste o c lasa ab stracta care im p le m enteaz a o anum ita interfatafara a sp e c ifica cod nic i une i m e tod e a interfe te i.

S cop ul une i astfe l d e c lase este ca la crearea unui ” ascultator” d e e v eni-m ente , ın loc sa im p le m enta o anum ita interfata si im p lic it toate m e tod e lesale , sa e x tind e m ad ap torul coresp unz ator interfe te i re sp e c tiv e (d ac a are !)si sa sup rad efinim d oar m etod e le care ne intereseaz a (c e le ın care v re m sasc rie m o anum ita se c v enta d e cod ).

D e e x e m p lu, ad ap torul interfe te i WindowListener e ste WindowAdapter

iar folosirea ac estuia este d ata ın e x e m p lul d e m ai jos:

L isting 9.12: E x tind e rea c lase i WindowAdapter

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new Ascultator ());

}

}

class Ascultator extends WindowAdapter {

// Suprdefinim metodele care ne intereseaza

public void windowClosing(WindowEvent e) {

System.exit (0);

}

}

public class TestWindowAdapter {

public static void main(String args []) {

Fereastra f = new Fereastra("Test WindowAdapter");

f.show();

}

}

A v antajul c lar al ac este i m od alitati d e tratare a e v enim ente lor este re -d uc erea cod ului p rog ram ului, ac esta d e v enind m ult m ai liz ib il. Insa e x ista sid oua d e zav antaje m ajore . D up a cum ati ob serv at fatad e e x e m p lul anterior,

Page 231: Cristian Frasinaru-Curs Practic de Java.pdf

230 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

c lasa Fereastra nu p oate e x tind e WindowAdapter d eoare c e ea e x tind e d e jac lasa Frame si d in ac est m otiv am construit o noua c lasa num ita Ascultator.V om v e d ea ınsa c a ac est d e zav antaj p oate fi e lim inat p rin folosirea une i c laseanonim e .U n alt d e zav antaj este c a oric e g re seala d e sintax a ın d e c lararea une i m e tod ea interfe te i nu v a p rod uc e o eroare d e com p ilare d ar nic i nu v a sup rad efinim e tod a interfe te i c i, p ur si sim p lu, v a crea o m etod a a c lase i re sp e c tiv e .

class Ascultator extends WindowAdapter {

// In loc de windowClosing scriem WindowClosing

// Nu supradefinim vreo metoda a clasei WindowAdapter

// Nu da nici o eroare

// Nu face nimic !

public void WindowClosing(WindowEvent e) {

System.exit(0);

}

}

In tab e lul d e m ai jos sunt d ati toti ad ap torii interfe te lor d e tip ” listener”- se ob e rv a c a o interfata XXXListener are un ad ap tor d e tip ul XXXAdapter.Interfe te le care nu au un ad ap tor sunt c e le care d efinesc o sing ura m e tod a sip rin urm are c rearea une i c lase ad ap tor nu ısi are rostul.

Interfata A daptorActionListener nu areAdjustemnrListener nu areComponentListener ComponentAdapter

ContainerListener ContainerAdapter

FocusListener FocusAdapter

ItemListener nu areKeyListener KeyAdapter

MouseListener MouseAdapter

MouseMotionListener MouseMotionAdapter

TextListener nu areWindowListener WindowAdapter

S tim c a o c lasa interna e ste o c lasa d e c larata ın cad rul alte i c lase , iarc lase le anonim e sunt c lase interne folosite p entru instantie rea unui sing urob ie c t d e un anum it tip . U n e x e m p lu tip ic d e folosire a lor este instantie rea

Page 232: Cristian Frasinaru-Curs Practic de Java.pdf

9 .4 . T RAT ARE A E V E NIM E NT E L O R 231

ad ap torilor d ire c t ın corp ul une i c lase care contine com p onente ale c arore v enim ente tre b uie tratate .

L isting 9.13: Folosirea ad ap torilor si a c lase lor anonim e

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

setSize (400, 400);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

// Terminam aplicatia

System.exit (0);

}

});

final Label label = new Label("", Label.CENTER);

label.setBackground(Color.yellow);

add(label , BorderLayout.NORTH);

this.addMouseListener(new MouseAdapter () {

public void mouseClicked(MouseEvent e) {

// Desenam un cerc la fiecare click de mouse

label.setText("Click ... ");

Graphics g = Fereastra.this.getGraphics ();

g.setColor(Color.blue);

int raza = (int)(Math.random () * 50);

g.fillOval(e.getX(), e.getY(), raza , raza);

}

});

this.addMouseMotionListener(new MouseMotionAdapter () {

public void mouseMoved(MouseEvent e) {

// Desenam un punct la coordonatele mouse -ului

Graphics g = Fereastra.this.getGraphics ();

g.drawOval(e.getX(), e.getY(), 1, 1);

}

});

Page 233: Cristian Frasinaru-Curs Practic de Java.pdf

232 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

this.addKeyListener(new KeyAdapter () {

public void keyTyped(KeyEvent e) {

// Afisam caracterul tastat

label.setText("Ati tastat: " + e.getKeyChar () + "");

}

});

}

}

public class TestAdapters {

public static void main(String args []) {

Fereastra f = new Fereastra("Test adaptori");

f.show();

}

}

9 .5 F olosirea ferestrelor

D up a cum am v azut sup rafe te le d e afisare ale com p onente lor sunt e x tensiiale c lase i Container. O cate g orie ap arte a ac estor containere o re p re z intafe re stre le . A c e stea sunt d escrise d e c lase d e riv ate d in W indow , c e le m aiutilizate fiind F ram e si D ialog .

O ap licatie J av a cu inte fata g rafic a v a fi form ata d in una sau m ai m ultefe restre , una d intre e le fiind num ita ferea stra p rin cipa la .

9 .5 .1 Clasa W indow

Clasa Window e ste rar utilizata ın m od d ire c t d eoare c e p e rm ite d oar creareaunor fere stre care nu au ch enar si nic i b ara d e m eniuri. E ste utila atunc ic and d orim sa afisam fe restre care nu interac tioneaz a cu utilizatorul c i d oarofera anum ite inform atii.

M e tod e le m ai im p ortante ale c lase i Window, care sunt d e altfe l m ostenited e toate sub c lase le sale , sunt d ate d e m ai jos:

• show - fac e v iz ib ila fe reastra. Im p lic it, o fe reastra nou creata nu estev iz ib ila;

• hide - fac e fe reastra inv iz ib ila fara a o d istrug e ınsa; p entru a re d e v eniv iz ib ila se p oate ap e la m e tod a show;

Page 234: Cristian Frasinaru-Curs Practic de Java.pdf

9 .5 . F O L O SIRE A F E RE ST RE L O R 233

• isShowing - te steaz a d ac a fe reastra este v iz ib ila sau nu;

• dispose - ınch id e ) fe reastra si si e lib e reaz a toate resurse le ac este ia;

• pack - re d im ensioneaz a autom at fe reastra la o sup rafata op tim a caresa cup rind a toate com p onente le sale ; tre b uie ap e lata ın g eneral d up aad aug area tuturor com p onente lor p e sup rafata fe restre i.

• getFocusOwner - re turneaz a com p onenta ferestre i care are focus-ul(d ac a fe reastra este activ a).

9 .5 .2 Clasa F ram e

E ste d e riv ata a c lase i Window si e ste folosita p entru crearea d e fe restre ind e -p end ente si func tionale , e v entual continand o b ara d e m eniuri. Oric e ap licatiecu interfata g rafic a conttine c e l p utin o fereastra, c ea m ai im p ortanta fiindnum ita si ferea stra p rin cipa la .

Constructorii uzuali ai c lase i Fram e p e rm it c rearea une i fe restre cu saufara titlu, initial inv iz ib ila. P entru ca o fereastra sa d e v ina v iz ib ila se v aap e la m etod a show d efinita ın sup erc lasa Window.

import java.awt.*;

public class TestFrame {

public static void main(String args[]) {

Frame f = new Frame("Titlul ferestrei");

f.show();

}

}

Crearea fe re stre lor p rin instantie rea d ire c ta a ob ie c te lor d e tip Frame e stem ai p utin folosita. D e ob ic e i, fe re stre le unui p rog ram v or fi d efinite ın c lasese p arate care e x tind c lasa Frame, ca ın e x e m p lul d e m ai jos:

import java.awt.*;

class Fereastra extends Frame{

// Constructorul

public Fereastra(String titlu) {

super(titlu);

...

}

Page 235: Cristian Frasinaru-Curs Practic de Java.pdf

234 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

}

public class TestFrame {

public static void main(String args[]) {

Fereastra f = new Fereastra("Titlul ferestrei");

f.show();

}

}

G e stionarul d e p oz itionare im p lic it al c lase i Frame e ste BorderLayout.D in ac est m otiv , ın m om entul ın care fe reastra este c reata d ar nic i o com p o-nenta g rafic a nu este ad aug ata, sup rafata d e afisare a fe re tre i v a fi d eterm i-nata autom ota d e g e stionarul d e p oz ittionare si v a oferi d oar sp atiul ne c esarafisarii b are i fe re stre i si g rup ului d e b utoane p entru m inim izare , m ax im izaresi ınch id e re . A c e lasi e fe c t ıl v om ob tine d ac a o re d im enionam si ap e lam ap oim e tod a pack care d e te rm ina d im eniunea sup rafe te i d e afisare ın func tie d ecom p onente le ad aug ate .

S e ob serv a d e ase m enea c a b utonul d e ınch id e re a ferestre i nu este func tional.T ratarea e v enim ente lor fe re stre i se fac e p rin im p le m entarea interfe te i WindowListenersau, m ai uzual, p rin folosirea unui ad ap tor d e tip WindowAdapter.

S tructura g enerala a une i fe restre e ste d e sc risa d e c lasa Fereastra d ine x e m p lul d e m ai jos:

L isting 9.14: S tructura g enerala a une i fe restre

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ActionListener {

// Constructorul

public Fereastra(String titlu) {

super(titlu);

// Tratam evenimentul de inchidere a ferestrei

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

dispose (); // inchidem fereastra

// sau terminam aplicatia

System.exit (0);

}

});

Page 236: Cristian Frasinaru-Curs Practic de Java.pdf

9 .5 . F O L O SIRE A F E RE ST RE L O R 235

// Eventual , schimbam gestionarul de pozitionare

setLayout(new FlowLayout ());

// Adaugam componentele pe suprafata ferestrei

Button exit = new Button("Exit");

add(exit);

// Facem inregistrarea claselor listener

exit.addActionListener(this);

// Stabilim dimensiunile

pack(); // implicit

//sau explicit

// setSize (200, 200);

}

// Implementam metodele interfetelor de tip listener

public void actionPerformed(ActionEvent e) {

System.exit (0);

}

}

public class TestFrame {

public static void main(String args []) {

// Cream fereastra

Fereastra f = new Fereastra("O fereastra");

// O facem vizibila

f.show();

}

}

P e lang a m e tod e le m ostenite d in c lasa Window, e x ista o serie d e m e tod esp e c ific e c lase i Fram e . D intre c e le m ai folosite am intim :

• getFrames - m e tod a static a c e re turneaz a lista tuturor ferestre lor d e -sch ise ale une i ap licatii;

• setIconImage - se teaz a iconita fe restre i;

• setMenuBar - se teaz a b ara d e m eniuri a fe re stre i (v e z i ” Folosirea m e -niurilor” );

• setTitle - se teaz a titlul fe restre i;

Page 237: Cristian Frasinaru-Curs Practic de Java.pdf

236 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

• setResizable - stab ile ste d ac a fe reastra p oate fi re d im enionata d e uti-lizator;

9 .5 .3 Clasa D ialog

T oate interfe te le g rafice ofe ra un tip sp e c ial d e fe re stre d e stinate p re luariiunor inform atii sau a unor d ate d e la utilizator. A c e stea se num esc ferestred e d ia log sau ca sete d e d ia log si sunt im p le m entate p rin interm e d iul c lase iD ialog , sub c lasa d ire c ta a c lase i Window.

D ife renta m ajora d intre fe restre le d e d ialog si fe re stre le d e tip Frame

consta ın fap tul c a o fe reastra d e d ialog este d e p end enta d e o alta fe reastra(norm ala sau tot fereastra d e d ialog ), num ita si ferea stra p a rin te . Cu altecuv inte , fe re stre le d e d ialog nu au o ex istenta d e sine statatoare . Cand fe r-eastra p arinte este d istrusa sunt d istruse si fe re stre le sale d e d ialog , c and estem inim izata fe re stre le sale d e d ialog sunt facute inv iz ib ile iar c and este re stau-rata ac e stea sunt ad use la starea ın care se g aseau ın m om entul m inim iz ariife re stre i p arinte .

Ferestre le d e d ialog p ot fi d e d oua tip uri:

• m odale: care b loch eaz a ac c e sul la fereastra p arinte ın m om entul d e -sch id e rii lor, cum ar fi ferestre le d e introd uc ere a unor d ate , d e ale g e rea unui fisie r, d e se le c tare a une i op tiuni, m e saje d e av ertizare , e tc ;

• nem odale: care nu b loch eaz a fl ux ul d e intrare c atre fe reastra p arinte- d e e x e m p lu, d ialog ul d e c autare a unui cuv ant ıntr-un fisie r, e tc .

Im p lic it, o fe reastra d e d ialog este ne m od ala si inv iz ib ila, ınsa e x ista con-structori care sa sp e c ific e si ac e sti p aram etri. Constructorii c lase i Dialogsunt:

Dialog(Frame parinte)

Dialog(Frame parinte, String titlu)

Dialog(Frame parinte, String titlu, boolean modala)

Dialog(Frame parinte, boolean modala)

Dialog(Dialog parinte)

Dialog(Dialog parinte, String titlu)

Dialog(Dialog parinte, String titlu, boolean modala)

Page 238: Cristian Frasinaru-Curs Practic de Java.pdf

9 .5 . F O L O SIRE A F E RE ST RE L O R 237

P aram etrul ” p arinte ” re p re z inta re fe rinta la fe reastra p arinte , ” titlu”re p re z inta titlul fe restre i iar p rin arg um entul ” m od ala” sp e c ific am d ac a fe r-eastra d e d ialog creata v a fi m od ala (true) sau nem od ala (false - v aloareaim p lic ita).

Crearea une i fe restre d e d ialog este re lativ sim p la si se realiz eaz a p rind eriv area c lase i Dialog. Com unicarea d intre fe reastra d e d ialog si fe reastrasa p arinte , p entru ca ac easta d in urm a sa p oata folosi d ate le introd use (sauop tiunea sp e c ificata) ın caseta d e d ialog , se p oate realiza folosind una d inurm atoare le ab ord ari g enerale :

• ob ie c tul care re p re z inta d ialog ul p oate sa trate z e e v enim ente le g enerated e com p onente le d e p e sup rafata sa si sa se te z e v alorile unor v ariab ileac c e sib ile ale fe re stre i p arinte ın m om entul ın care d ialog ul este ınch e iat;

• ob ie c tul care c re eaz a d ialog ul (fe reastra p arinte) sa se ınre g istre z e caascultator al e v enim ente lor d e la b utoanele care d e te rm ina ınch e ie read ialog ului, iar fe reastra d e d ialog sa ofe re m e tod e p ub lic e p rin cared ate le introd use sa fie p re luate d in e x te rior;

S a c re am , d e e x e m p lu, o fereastra d e d ialog m od ala p entru introd uc ereaunui sir d e caractere . Fereastra p rinc ip ala a ap licatie i v a fi p arinte le casete id e d ialog , v a p rim i sirul d e caractere introd us si ısi v a m od ifica titlul ca fiindac esta. D e sch id e rea ferestre i d e d ialog se v a fac e la ap asarea unui b uton alferestre i p rinc ip ale num it ” S ch im b a titlul” . Cele d oua fe restre v or arata caın im ag inile d e m ai jos:

Fereastra p rinc ip ala Fereastra d e d ialog

L isting 9.15: Folosirea une i fe restre d e d ialog

import java.awt .*;

import java.awt.event .*;

// Fereastra principala

class FerPrinc extends Frame implements ActionListener{

Page 239: Cristian Frasinaru-Curs Practic de Java.pdf

238 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

public FerPrinc(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new FlowLayout ());

setSize (300, 80);

Button b = new Button("Schimba titlul");

add(b);

b.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

FerDialog d = new FerDialog(this , "Dati titlul", true);

String titlu = d.raspuns;

if (titlu == null)

return;

setTitle(titlu);

}

}

// Fereastra de dialog

class FerDialog extends Dialog implements ActionListener {

public String raspuns = null;

private TextField text;

private Button ok, cancel;

public FerDialog(Frame parinte , String titlu , boolean

modala) {

super(parinte , titlu , modala);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

raspuns = null;

dispose ();

}

});

text = new TextField("", 30);

add(text , BorderLayout.CENTER);

Panel panel = new Panel();

ok = new Button("OK");

Page 240: Cristian Frasinaru-Curs Practic de Java.pdf

9 .5 . F O L O SIRE A F E RE ST RE L O R 239

cancel = new Button("Cancel");

panel.add(ok);

panel.add(cancel);

add(panel , BorderLayout.SOUTH);

pack();

text.addActionListener(this);

ok.addActionListener(this);

cancel.addActionListener(this);

show();

}

public void actionPerformed(ActionEvent e) {

Object sursa = e.getSource ();

if (sursa == ok || sursa == text)

raspuns = text.getText ();

else

raspuns = null;

dispose ();

}

}

// Clasa principala

public class TestDialog {

public static void main(String args []) {

FerPrinc f = new FerPrinc("Fereastra principala");

f.show();

}

}

9 .5 .4 Clasa F ileD ialog

P ach e tul java.awt p une la d isp oz itie si un tip d e fe reastra d e d ialog folositap entru se le c tarea unui num e d e fisie r ın v e d e rea ınc arc arii sau salv arii unuifisie r: c lasa FileDialog, d e riv ata d in Dialog. Instante le ac este i c lase au uncom p ortam ent com un d ialog urilor d e ac est tip d e p e m ajoritatea p latform e lord e lucru, d ar form a ın care v or fi afisate e ste sp e c ific a p latform e i p e careruleaz a ap licatia.

Constructorii c lase i sunt:

FileDialog(Frame parinte)

Page 241: Cristian Frasinaru-Curs Practic de Java.pdf

240 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

FileDialog(Frame parinte, String titlu)

FileDialog(Frame parinte, String titlu, boolean mod)

P aram etrul ” p arinte ” re p re z inta re fe rinta fe restre i p arinte , ” titlu” re p re z intatitlul fe restre i iar p rin arg um entul ” m od ” sp e c ific am d ac a ınc arc am sausalv am un fisie r; v alorile p e care le p oate lua acest arg um ent sunt:

• FileDialog.LOAD - p entru ınc arcare , re sp e c tiv

• FileDialog.SAVE - p entru salv are .

// Dialog pentru incarcarea unui fisier

new FileDialog(parinte, "Alegere fisier", FileDialog.LOAD);

// Dialog pentru salvarea unui fisier

new FileDialog(parinte, "Salvare fisier", FileDialog.SAVE);

L a crearea unui ob ie c t FileDialog acesta nu este im p lic it v iz ib il. D ac aafisarea sa se fac e cu show, caseta d e d ialog v a fi m od ala. D ac a afisarease fac e cu setVisible(true), atunc i v a fi nem od ala. D up a se le c tarea unuifisie r ea v a fi facuta autom at inv iz ib ila.

P e lang a m e tod e le m ostenite d e la sup erc lasa Dialog c lasa FileDialog

m ai contine m e tod e p entru ob tinerea num e lui fisie rului sau d ire c torului se -le c tat getFile, getDirectory, p entru stab ilirea unui crite riu d e filtraresetFilenameFilter, e tc .

S a consid e ram un e x e m p lu ın care v om ale g e , p rin interm e d iul unui ob ie c tFileDialog, un fisie r cu e x tensia ” jav a” . D ire c torul initial e ste d ire c torulcurent, iar num e le im p lic it e ste TestFileDialog.java. N um e le fisie ruluiales v a fi afisat la consola.

L isting 9.16: Folosirea une i fe restre d e d ialog

import java.awt .*;

import java.awt.event .*;

import java.io.*;

class FerPrinc extends Frame implements ActionListener{

public FerPrinc(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

Page 242: Cristian Frasinaru-Curs Practic de Java.pdf

9 .5 . F O L O SIRE A F E RE ST RE L O R 241

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

Button b = new Button("Alege fisier");

add(b, BorderLayout.CENTER);

pack();

b.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

FileDialog fd = new FileDialog(this , "Alegeti un fisier",

FileDialog.LOAD);

// Stabilim directorul curent

fd.setDirectory(".");

// Stabilim numele implicit

fd.setFile("TestFileDialog.java");

// Specificam filtrul

fd.setFilenameFilter(new FilenameFilter () {

public boolean accept(File dir , String numeFis) {

return (numeFis.endsWith(".java"));

}

});

// Afisam fereastra de dialog (modala)

fd.show();

System.out.println("Fisierul ales este:" + fd.getFile ());

}

}

public class TestFileDialog {

public static void main(String args []) {

FerPrinc f = new FerPrinc("Fereastra principala");

f.show();

}

}

Clasa FileDialog e ste folosita m ai rar d eoare c e ın S w ing e x ista c lasaJFileChooser care ofera m ai m ulte fac ilitati si p rin urm are v a constituip rim a op tiune ıntr-o ap licatie cu inte fata g rafic a.

Page 243: Cristian Frasinaru-Curs Practic de Java.pdf

242 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

9 .6 F olosirea m eniurilor

S p re d eose b ire d e c e le lalte ob ie c te g rafice care d e riv a d in c lasa Component,com p onente le unui m eniu re p re z inta instante ale unor c lase d e riv ate d in su-p e rc lasa ab stracta M enuCom ponent. A c easta e x c e p tie e ste facuta d eoare c eunele p latform e g rafice lim iteaz a cap ab ilitatile unui m eniu.

M eniurile p ot fi g rup ate ın d oua cate g orii:

• M eniuri fi x e (v iz ib ile p e rm anent): sunt g rup ate ıntr-o b ara d e m eniuric e contine c ate un m eniu p entru fiecare intrare a sa. L a rand ul lor,ac este m eniuri contin articole c e p ot fi se le c tate , com utatoare sau altem eniuri (sub m eniuri). O fereastra p oate av ea un sing ur m eniu fix .

• M eniuri de contex t (p op up ): sunt m eniuri inv iz b ile asoc iate une ife re stre si care se activ eaz a uzual p rin ap asarea b utonului d re p t alm ouse -ului. O alta d ife renta fata d e m eniurile fix e consta ın fap tulc a m eniurile d e conte x t nu sunt g rup ate ıntr-o b ara d e m eniuri.

In fig ura d e m ai jos este p usa ın e v id enta alc atuirea unui m eniu fix :

E x e m p lul d e m ai sus contine o b ara d e m eniuri form ata d in d oua m eniurip rinc ip ale F ile si E d it. M eniul E d it contine la rand ul lui alt m eniu (sub m eniu)Op tio n s, articolul U n d o si d oua com utatoare B o ld si Ita lic . P rin ab uz d elim b aj, v om re fe ri uneori b ara d e m eniuri a une i fe restre ca fiind m eniulfe restre i.

In m od e lul A W T ob ie c te le care re p re z inta b are d e m eniuri sunt re p re z en-tate ca instante al c lase i M enuB ar. U n ob ie c t d e tip MenuBar contine ob ie c ted e tip M enu, care sunt d e fap t m eniurile d e rulante p rop riu-z ise . L a rand ullor, ac estea p ot contine ob ie c te d e tip M enuItem , Ch eck B ox M enuItem ,d ar si alte ob ie c te d e tip Menu (sub m eniuri).

Page 244: Cristian Frasinaru-Curs Practic de Java.pdf

9 .6 . F O L O SIRE A M E NIURIL O R 243

P entru a p utea contine un m eniu, o com p onenta tre b uie sa im p le m ente z einterfata M enuContainer. Cel m ai ad esea, m eniurile sunt atasate fe re -stre lor, m ai p re c is ob ie c te lor d e tip Frame, ac e stea im p le m entand interfataMenuContainer. A tasarea une i b are d e m eniuri la o fereastra se fac e p rinm etod a addM enuB ar a clase i Frame.

9 .6 .1 Ierarh ia claselor ce descriu m eniuri

S a v e d e m ın continuare care este ie rarh ia c lase lor folosite ın lucrul cu m eniurisi sa analiz am p e rand ac este c lase :

Clasa M enuCom ponent e ste o c lasa ab stracta d in care sunt e x tinsetoate c e le lalte c lase folosite la crearea d e m eniuri, fiind sim ilara c e le ilaltesup erc lase ab stracte Component. MenuComponent contine m e tod e cu carac -ter g eneral, d intre care am intim getName, setName, getFont, setFont,cu sintax a si se m nificatiile uzuale .

Clasa M enuB ar p e rm ite c rearea b are lor d e m eniuri asoc iate une i fe re strecad ru d e tip Frame, ad ap tand conce p tul d e b ara d e m eniuri la p latform acurenta d e lucru. D up a cum am m ai sp us, p entru a le g a b ara d e m eniuri lao anum ita fe reastra tre b uie ap e lata m e tod a setMenuBar d in c lasa Frame.

// Crearea barei de meniuri

MenuBar mb = new MenuBar();

Page 245: Cristian Frasinaru-Curs Practic de Java.pdf

244 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

// Adaugarea meniurilor derulante la bara de meniuri

...

// Atasarea barei de meniuri la o fereastra

Frame f = new Frame("Fereastra cu meniu");

f.addMenuBar(mb);

Oric e articol al unui m eniu tre b uie sa fie o instanta a c lase i M enu-Item . Ob ie c te le ac este i c lase d e sc riu asad ar op tiunile ind iv id uale ale m e -niurilor d e rulante , cum sunt ” Op en” , ” Close ” , ” E x it” , e tc . O instanta ac lase i MenuItem re p re z inta d e fap t un b uton sau un com utator, cu o anum itae tich e ta care v a ap area ın m eniu, ınsotita e v entual d e un acc e le rator (ob ie c td e tip MenuShortcut) c e re p re z inta com b inatia d e taste cu care articolulp oate fi ap e lat rap id (v e z i ” A c c e le ratori” ).

Clasa M enu p e rm ite c rearea unui m eniu d erulant ıntr-o b ara d e m eniuri.Op tional, un m eniu p oate fi d e c larat ca fiind tea r-o ff , c e ea c e ınseam na c ap oate fi d esch is si d e p lasat cu m ouse -ul (d rag g e d ) ıntr-o alta p oz itie d e c atc ea orig inala (” rup t” d in p oz itia sa). A c e st m e canism e ste d e p end ent d ep latform a si p oate fi ig norat p e unele d intre e le . Fie care m eniu are o etich e ta,care e ste d e fap t num e le sau c e v a fi afisat p e b ara d e m eniuri. A rticole led intr-un m eniu tre b uie sa ap artina c lase i MenuItem, c e ea c e ınseam na c a p otfi instante ale une ia d in c lase le MenuItem, Menu sau CheckboxMenuItem.

Clasa Ch eck b ox M enuItem im p le m enteaz a ıntr-un m eniu articole d etip com utator - care au d oua stari log ic e (v alid at/ ne v alid at), ac tionarea ar-ticolului d e te rm inand tre c e rea sa d intr-o stare ın alta. L a v alid area unuicom utator ın d re p tul etich e te i sale v a fi afisat un sim b ol g rafic care ind ic aac est lucru; la inv alid area sa, sim b olul g rafic resp e c tiv v a d isp area. ClasaCheckboxMenuItem are ac e easi func tionalitate cu c ea a casete lor d e v alid ared e tip Checkbox, am b e le im p le m entand interfata ItemSelectable.

Page 246: Cristian Frasinaru-Curs Practic de Java.pdf

9 .6 . F O L O SIRE A M E NIURIL O R 245

S a v e d e m ın continuare cum ar arata un p rog ram care construie ste unm eniu ca ın fig ura p re z entata anterior:

L isting 9.17: Crearea unui m eniu

import java.awt .*;

import java.awt.event .*;

public class TestMenu {

public static void main(String args []) {

Frame f = new Frame("Test Menu");

MenuBar mb = new MenuBar ();

Menu fisier = new Menu("File");

fisier.add(new MenuItem("Open"));

fisier.add(new MenuItem("Close"));

fisier.addSeparator ();

fisier.add(new MenuItem("Exit"));

Menu optiuni = new Menu("Options");

optiuni.add(new MenuItem("Copy"));

optiuni.add(new MenuItem("Cut"));

optiuni.add(new MenuItem("Paste"));

Menu editare = new Menu("Edit");

editare.add(new MenuItem("Undo"));

editare.add(optiuni);

editare.addSeparator ();

editare.add(new CheckboxMenuItem("Bold"));

editare.add(new CheckboxMenuItem("Italic"));

mb.add(fisier);

mb.add(editare);

f.setMenuBar(mb);

f.setSize (200, 100);

f.show();

}

}

Page 247: Cristian Frasinaru-Curs Practic de Java.pdf

246 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

9 .6 .2 T ratarea evenim entelor g enerate de m eniuri

L a ale g e rea une i op tiuni d intr-un m eniu se g enereaz a fie un ev enim ent d e tipA ctionE vent d ac a articolul resp e c tiv e ste d e tip MenuItem, fie Item E ventp entru com utatoare le CheckboxMenuItem. A sad ar, p entru a activ a op tiunileunui m eniu tre b uie im p le m entate interfate le A ctionL istener sau/ si Item -L istener ın cad rul ob ie c te lor care tre b uie sa sp e c ific e cod ul c e v a fi e x e cutatla ale g e rea une i op tiuni si im p le m entate m e tod e le actionPerformed, re sp e c -tiv itemStatChanged. Fie c arui m eniu ıi p ute m asoc ia un ob ie c t re c e p tord ife rit, c e ea c e usureaz a m unca ın cazul ın care ie rarh ia d e m eniuri e ste com -p le x a. P entru a realiza le g atura ıntre ob ie c tul m eniu si ob ie c tul d e tip listenertre b uie sa ad aug am re c e p torul ın lista d e ascultatori a m eniului resp e c tiv ,ıntoc m ai ca p e oric e com p onenta, folosind m e tod e le addActionListener,re sp e c tiv addItemListener.

A sad ar, tratarea e v enim ente lor g enerate d e ob ie c te d e tip MenuItem e steid entic a cu tratarea b utoanelor, c e ea c e fac e p osib il ca unui b uton d e p esup rafata d e afisare sa ıi coresp und a o op tiune d intr-un m eniu, am b e le cuac e lasi num e , tratarea e v enim entului coresp unz ator ap asarii b utonului, sauale g e rii op tiunii, fac and u-se o sing ura d ata ıntr-o c lasa care este ınre g istrataca re c e p tor atat la b uton c at si la m eniu.

Ob ie c te le d e tip CheckboxMenuItem tip se g ase sc ıntr-o cate g orie com unacu List, Choice, CheckBox, toate im p le m entand interfata ItemSelectablesi d e c i tratarea lor v a fi facuta la fe l. T ip ul d e op eratie se le c tare / d e se le c tareeste cod ificat ın e v enim entul g enerat d e c am p urile static e ItemEvent.SELECTEDsi ItemEvent.DESELECTED.

L isting 9.18: T ratarea e v enim ente lor unui m eniu

import java.awt .*;

import java.awt.event .*;

public class TestMenuEvent extends Frame

implements ActionListener , ItemListener {

public TestMenuEvent(String titlu) {

super(titlu);

MenuBar mb = new MenuBar ();

Menu test = new Menu("Test");

CheckboxMenuItem check = new CheckboxMenuItem("Check me")

;

Page 248: Cristian Frasinaru-Curs Practic de Java.pdf

9 .6 . F O L O SIRE A M E NIURIL O R 247

test.add(check);

test.addSeparator ();

test.add(new MenuItem("Exit"));

mb.add(test);

setMenuBar(mb);

Button btnExit = new Button("Exit");

add(btnExit , BorderLayout.SOUTH);

setSize (300, 200);

show();

test.addActionListener(this);

check.addItemListener(this);

btnExit.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

// Valabila si pentru meniu si pentru buton

String command = e.getActionCommand ();

if (command.equals("Exit"))

System.exit (0);

}

public void itemStateChanged(ItemEvent e) {

if (e.getStateChange () == ItemEvent.SELECTED)

setTitle("Checked!");

else

setTitle("Not checked!");

}

public static void main(String args []) {

TestMenuEvent f = new TestMenuEvent("Tratare evenimente

meniuri");

f.show();

}

}

9 .6 .3 M eniuri de contex t (popup)

A u fost introd use ınc e p and cu A W T 1.1 si sunt im p le m entate p rin interm e d iulc lase i P opupM enu, sub c lasa d ire c ta a c lase i Menu. S unt m eniuri inv iz ib ilecare sunt activ ate uzual p rin ap asarea b utonului d re p t al m ouse -ului, fiind

Page 249: Cristian Frasinaru-Curs Practic de Java.pdf

248 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

afisate la p oz itia la care se g asea m ouse -ul ın m om entul ap asarii b utonuluisau d re p t. M e tod e le d e ad aug are a articole lor unui m eniu d e conte x t suntm ostenite ıntoc m ai d e la m eniurile fix e .

PopupMenu popup = new PopupMenu("Options");

popup.add(new MenuItem("New"));

popup.add(new MenuItem("Edit"));

popup.addSeparator();

popup.add(new MenuItem("Exit"));

A fisarea m eniului d e conte x t se fac e p rin m etod a sh ow :

popup.show(Component origine, int x, int y)

si e ste d e ob ic e i re zultatul ap asarii unui b uton al m ouse -ului, p entru a av eaac c es rap id la m eniu. A rg um entul ” orig ine ” re p re z inta com p onenta fata d eorig inile c are ia se v a calcula p oz itia d e afisare a m eniului p op up . D e ob ic e i,re p re z inta instanta ferestre i ın care se v a afisa m eniul. D eoare c e interac tiuneacu m ouse -ul este d e p end enta d e p latform a d e lucru, e x ista o m e tod a cared e te rm ina d ac a un ev enim ent d e tip MouseEvent p oate fi resp onsab il cud esch id e rea unui m eniu d e conte x t. A c easta este isPopupTrigger si e sted efinita ın c lasa MouseEvent. P oz itionarea si afisarea m eniului este ınsare sp onsab ilitatea p rog ram atorului.

M eniurile d e conte x t nu se ad aug a la un alt m eniu (b ara sau sub -m eniu)c i se ataseaz a la o com p onenta (d e ob ic e i la o fereastra) p rin m e tod a adda aceste ia. In cazul c and av e m m ai m ulte m eniuri p op up p e care v re m sale folosim ıntr-o fereastra, tre b uie sa le d efinim p e toate si, la un m om entd at, v om ad aug a ferestre i m eniul coresp unz ator d up a care ıl v om fac e v iz ib il.D up a ınch id e rea ac estuia, v om ” rup e ” le g atura ıntre fe reastra si m eniu p rininstruc tiunea rem ove:

fereastra.add(popup1);

...

fereastra.remove(popup1);

fereastra.add(popup2);

In e x e m p lul d e m ai jos, v om crea un m eniu d e conte x p e care ıl v om activ ala ap asarea b utonului d re p t al m ouse -ului p e sup rafata fe restre i p rinc ip ale .T ratarea e v enim ente lor g enerate d e un m eniu p op up se realiz eaz a id entic cap entru m eniurile fix e .

Page 250: Cristian Frasinaru-Curs Practic de Java.pdf

9 .6 . F O L O SIRE A M E NIURIL O R 249

L isting 9.19: Folosirea unui m eniu d e conte x t (p op up )

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ActionListener{

// Definim meniul popup al ferestrei

private PopupMenu popup;

// Pozitia meniului va fi relativa la fereastra

private Component origin;

public Fereastra(String titlu) {

super(titlu);

origin = this;

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

this.addMouseListener(new MouseAdapter () {

public void mousePressed(MouseEvent e) {

if (e.isPopupTrigger ())

popup.show(origin , e.getX(), e.getY());

}

public void mouseReleased(MouseEvent e) {

if (e.isPopupTrigger ())

popup.show(origin , e.getX(), e.getY());

}

});

setSize (300, 300);

// Cream meniul popup

popup = new PopupMenu("Options");

popup.add(new MenuItem("New"));

popup.add(new MenuItem("Edit"));

popup.addSeparator ();

popup.add(new MenuItem("Exit"));

add(popup); // atasam meniul popup ferestrei

popup.addActionListener(this);

}

public void actionPerformed(ActionEvent e) {

String command = e.getActionCommand ();

if (command.equals("Exit"))

System.exit (0);

Page 251: Cristian Frasinaru-Curs Practic de Java.pdf

250 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

}

}

public class TestPopupMenu {

public static void main(String args []) {

Fereastra f = new Fereastra("PopupMenu");

f.show();

}

}

9 .6 .4 A cceleratori (Clasa M enuS h ortcut)

P entru articole le unui m enu este p osib ila sp e c ificarea unor com b inatii d etaste num ite a ccelera to ri (sh ortcuts) care sa p e rm ita ac c e sarea d ire c ta, p rininterm e d iul tastaturii, a op tiunilor d intr-un m eniu. A stfe l, oric arui ob ie c td e tip MenuItem ıi p oate fi asoc iat un ob ie c t d e tip ac c e le rator, d efinit p rininterm e d iul c lase i M enuS h ortcut. S ing ure le com b inatii d e taste care p otjuca rolul ac c e le ratorilor sunt: Ctrl + Tasta sau Ctrl + Shift + Tasta.A trib uirea unui ac c e le rator la un articol al unui m eniu p oate fi realizata p rinconstructorul ob ie c te lor d e tip MenuItem ın form a:MenuItem(String eticheta, MenuShortcut accelerator), ca ın e x e m p le led e m ai jos:

// Ctrl+O

new MenuItem("Open", new MenuShortcut(KeyEvent.VK_O));

// Ctrl+P

new MenuItem("Print", new MenuShortcut(’p’));

// Ctrl+Shift+P

new MenuItem("Preview", new MenuShortcut(’p’), true);

9 .7 F olosirea com ponentelor A W T

In continuare v or fi d ate e x e m p le d e folosire ale com p onente lor A W T , ın caresa fie p use ın e v id entta c at m ai m ulte d in p articularitatile ac estora, p re cumsi m od ul d e tratare a e v enim ente lor g enerate .

Page 252: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 251

9 .7 .1 Clasa L ab el

U n ob ie c t d e tip Label (etich e ta) re p re z inta o com p onenta p entru p lasareaunui te x t p e o sup rafata d e afisare . O etich e ta e ste form ata d intr-o sing uralinie d e te x t static c e nu p oate fi m od ificat d e c atre utilizator, d ar p oate fim od ificat d in p rog ram .

L isting 9.20: Folosirea c lase i Label

import java.awt .*;

public class TestLabel {

public static void main(String args []) {

Frame f = new Frame("Label");

Label nord , sud , est , vest , centru;

nord = new Label("Nord", Label.CENTER);

nord.setForeground(Color.blue);

sud = new Label("Sud", Label.CENTER);

sud.setForeground(Color.red);

vest = new Label("Vest", Label.LEFT);

vest.setFont(new Font("Dialog", Font.ITALIC , 14));

est = new Label("Est", Label.RIGHT);

est.setFont(new Font("Dialog", Font.ITALIC , 14));

centru = new Label("Centru", Label.CENTER);

centru.setBackground(Color.yellow);

centru.setFont(new Font("Arial", Font.BOLD , 20));

f.add(nord , BorderLayout.NORTH);

f.add(sud , BorderLayout.SOUTH);

f.add(est , BorderLayout.EAST);

f.add(vest , BorderLayout.WEST);

Page 253: Cristian Frasinaru-Curs Practic de Java.pdf

252 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

f.add(centru , BorderLayout.CENTER);

f.pack();

f.show();

}

}

9 .7 .2 Clasa B utton

U n ob ie c t d e tip Button re p re z inta o com p onenta p entru p lasarea unui b u-ton etich e tat p e o sup rafata d e afisare . T e x tul etich e te i e ste form at d intr-osing ura linie .

L isting 9.21: Folosirea c lase i Button

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ActionListener{

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(null);

setSize (200, 120);

Button b1 = new Button("OK");

b1.setBounds (30, 30, 50, 70);

b1.setFont(new Font("Arial", Font.BOLD , 14));

Page 254: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 253

b1.setBackground(Color.orange);

add(b1);

Button b2 = new Button("Cancel");

b2.setBounds (100, 30, 70, 50);

b2.setForeground(Color.blue);

add(b2);

b1.addActionListener(this);

b2.addActionListener(this);

}

// Metoda interfetei ActionListener

public void actionPerformed(ActionEvent e) {

String command = e.getActionCommand ();

System.out.println(e);

if (command.equals("OK"))

setTitle("Confirmare!");

else

if (command.equals("Cancel"))

setTitle("Anulare!");

}

}

public class TestButton {

public static void main(String args []) {

Fereastra f = new Fereastra("Button");

f.show();

}

}

9 .7 .3 Clasa Ch eck b ox

U n ob ie c t d e tip Checkbox (com utator) re p re z inta o com p onenta care sep oate g asi ın d oua stari: ” se le c tata” sau ” nese le c tata” (on/ off ). A c tiuneautilizatorului asup ra unui com utator ıl tre c e p e ac esta ın starea com p le m en-tara c e le i ın care se g asea. E ste folosit p entru a p re lua o anum ita op tiune d ela utilizator.

Page 255: Cristian Frasinaru-Curs Practic de Java.pdf

254 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

L isting 9.22: Folosirea c lase i Checkbox

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ItemListener {

private Label label1 , label2;

private Checkbox cbx1 , cbx2 , cbx3;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (5, 1));

label1 = new Label("Ingrediente Pizza:", Label.CENTER);

label1.setBackground(Color.orange);

label2 = new Label("");

label2.setBackground(Color.lightGray);

cbx1 = new Checkbox("cascaval");

cbx2 = new Checkbox("sunca");

cbx3 = new Checkbox("ardei");

add(label1);

add(label2);

add(cbx1);

add(cbx2);

add(cbx3);

Page 256: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 255

setSize (200, 200);

cbx1.addItemListener(this);

cbx2.addItemListener(this);

cbx3.addItemListener(this);

}

// Metoda interfetei ItemListener

public void itemStateChanged(ItemEvent e) {

StringBuffer ingrediente = new StringBuffer ();

if (cbx1.getState () == true)

ingrediente.append(" cascaval ");

if (cbx2.getState () == true)

ingrediente.append(" sunca ");

if (cbx3.getState () == true)

ingrediente.append(" ardei ");

label2.setText(ingrediente.toString ());

}

}

public class TestCheckbox {

public static void main(String args []) {

Fereastra f = new Fereastra("Checkbox");

f.show();

}

}

9 .7 .4 Clasa Ch eck b ox G roup

U n ob ie c t d e tip CheckboxGroup d efine ste un g rup d e com utatoare d in cared oar unul p oate fi se le c tat. U zual, ac este com p onente se m ai num esc bu -toa n e ra d io . A c easta c lasa nu este d e riv ata d in Component, ofe rind d oar om od alitate d e g rup are a com p onente lor d e tip Checkbox.

Page 257: Cristian Frasinaru-Curs Practic de Java.pdf

256 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

L isting 9.23: Folosirea c lase i CheckboxGroup

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ItemListener {

private Label label1 , label2;

private Checkbox cbx1 , cbx2 , cbx3;

private CheckboxGroup cbg;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (5, 1));

label1 = new Label("Alegeti postul TV", Label.CENTER);

label1.setBackground(Color.orange);

label2 = new Label("", Label.CENTER);

label2.setBackground(Color.lightGray);

cbg = new CheckboxGroup ();

cbx1 = new Checkbox("HBO", cbg , false);

cbx2 = new Checkbox("Discovery", cbg , false);

cbx3 = new Checkbox("MTV", cbg , false);

add(label1);

add(label2);

add(cbx1);

Page 258: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 257

add(cbx2);

add(cbx3);

setSize (200, 200);

cbx1.addItemListener(this);

cbx2.addItemListener(this);

cbx3.addItemListener(this);

}

// Metoda interfetei ItemListener

public void itemStateChanged(ItemEvent e) {

Checkbox cbx = cbg.getSelectedCheckbox ();

if (cbx != null)

label2.setText(cbx.getLabel ());

}

}

public class TestCheckboxGroup {

public static void main(String args []) {

Fereastra f = new Fereastra("CheckboxGroup");

f.show();

}

}

9 .7 .5 Clasa Ch oice

U n ob ie c t d e tip Choice d efine ste o lista d e op tiuni d in care utilizatorulp oate se le c ta una sing ura. L a un m om ent d at, d in ıntreag a lista d oar o sin-g ura op tiune este v iz ib ila, c ea se le c tata ın m om entul curent. O com p onentaChoice e ste ınsotita d e un b uton etich e tat cu o sag eata v e rticala la ap asareac aruia este afisata ıntreag a sa lista d e e le m ente , p entru ca utilizatorul sap oata se le c ta o anum ita op tiune .

Page 259: Cristian Frasinaru-Curs Practic de Java.pdf

258 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

L isting 9.24: Folosirea c lase i Choice

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ItemListener {

private Label label;

private Choice culori;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (4, 1));

label = new Label("Alegeti culoarea");

label.setBackground(Color.red);

culori = new Choice ();

culori.add("Rosu");

culori.add("Verde");

culori.add("Albastru");

culori.select("Rosu");

add(label);

add(culori);

setSize (200, 100);

culori.addItemListener(this);

}

// Metoda interfetei ItemListener

public void itemStateChanged(ItemEvent e) {

switch (culori.getSelectedIndex ()) {

case 0:

label.setBackground(Color.red);

break;

case 1:

label.setBackground(Color.green);

break;

case 2:

label.setBackground(Color.blue);

Page 260: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 259

}

}

}

public class TestChoice {

public static void main(String args []) {

Fereastra f = new Fereastra("Choice");

f.show();

}

}

9 .7 .6 Clasa L ist

U n ob ie c t d e tip List d efine ste o lista d e op tiuni care p oate fi setata astfe lınc at utilizatorul sa p oata se le c ta o sing ura op tiune sau m ai m ulte . T oatee le m ente le liste i sunt v iz ib ile ın lim ita d im ensiunilor g rafice ale com p onente i.

L isting 9.25: Folosirea c lase i List

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements ItemListener {

private Label label;

private List culori;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

Page 261: Cristian Frasinaru-Curs Practic de Java.pdf

260 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (2, 1));

label = new Label("Alegeti culoarea", Label.CENTER);

label.setBackground(Color.red);

culori = new List (3);

culori.add("Rosu");

culori.add("Verde");

culori.add("Albastru");

culori.select (3);

add(label);

add(culori);

setSize (200, 200);

culori.addItemListener(this);

}

// Metoda interfetei ItemListener

public void itemStateChanged(ItemEvent e) {

switch (culori.getSelectedIndex ()) {

case 0:

label.setBackground(Color.red);

break;

case 1:

label.setBackground(Color.green);

break;

case 2:

label.setBackground(Color.blue);

}

}

}

public class TestList {

public static void main(String args []) {

Fereastra f = new Fereastra("List");

f.show();

}

}

Page 262: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 261

9 .7 .7 Clasa S crollB ar

U n ob ie c t d e tip Scrollbar d efine ste o b ara d e d efilare p e v e rticala sauorizontala. E ste utila p entru p unerea la d isp oz itia utilizatorului a une im od alitati sug estiv e d e a ale g e o anum ita v aloare d intr-un interv al.

L isting 9.26: Folosirea c lase i ScrollBar

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements AdjustmentListener {

private Scrollbar scroll;

private Label valoare;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (2, 1));

valoare = new Label("", Label.CENTER);

valoare.setBackground(Color.lightGray);

scroll = new Scrollbar(Scrollbar.HORIZONTAL , 0, 1, 0,

101);

add(valoare);

add(scroll);

setSize (200, 80);

scroll.addAdjustmentListener(this);

}

// Metoda interfetei AdjustmentListener

Page 263: Cristian Frasinaru-Curs Practic de Java.pdf

262 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

public void adjustmentValueChanged(AdjustmentEvent e) {

valoare.setText(scroll.getValue () + " %");

}

}

public class TestScrollbar {

public static void main(String args []) {

Fereastra f = new Fereastra("Scrollbar");

f.show();

}

}

9 .7 .8 Clasa S crollP ane

U n ob ie c t d e tip ScrollPane p e rm ite atasarea unor b are d e d efilare (ori-zontala ssi/ sau v erticala) oric are i com p onente g rafice . A c e st lucru este utilp entru ace le com p onente care nu au im p le m entata func tionalitatea d e d efi-lare autom ata, cum ar fi liste le (ob ie c te d in c lasa List).

L isting 9.27: Folosirea c lase i ScrollPane

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame {

private ScrollPane sp;

private List list;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

Page 264: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 263

}

});

list = new List (7);

list.add("Luni");

list.add("Marti");

list.add("Miercuri");

list.add("Joi");

list.add("Vineri");

list.add("Sambata");

list.add("Duminica");

list.select (1);

sp = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);

sp.add(list);

add(sp , BorderLayout.CENTER);

setSize (200, 200);

}

}

public class TestScrollPane {

public static void main(String args []) {

Fereastra f = new Fereastra("ScrollPane");

f.show();

}

}

9 .7 .9 Clasa T ex tF ield

U n ob ie c t d e tip TextField d efine ste un control d e e d itare a te x tului p e osing ura linie . E ste util p entru interog area utilizatorului asup ra unor v alori.

Page 265: Cristian Frasinaru-Curs Practic de Java.pdf

264 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

L isting 9.28: Folosirea c lase i TextField

import java.awt .*;

import java.awt.event .*;

class Fereastra extends Frame implements TextListener {

private TextField nume , parola;

private Label acces;

private static final String UID="Duke", PWD="java" ;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setLayout(new GridLayout (3, 1));

setBackground(Color.lightGray);

nume = new TextField("", 30);

parola = new TextField("", 10);

parola.setEchoChar(’*’);

Panel p1 = new Panel();

p1.setLayout(new FlowLayout(FlowLayout.LEFT));

p1.add(new Label("Nume:"));

p1.add(nume);

Panel p2 = new Panel();

p2.setLayout(new FlowLayout(FlowLayout.LEFT));

p2.add(new Label("Parola:"));

p2.add(parola);

acces = new Label("Introduceti numele si parola!", Label.

CENTER);

add(p1);

add(p2);

add(acces);

setSize (350, 100);

nume.addTextListener(this);

parola.addTextListener(this);

}

Page 266: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 265

// Metoda interfetei TextListener

public void textValueChanged(TextEvent e) {

if (nume.getText ().length () == 0 ||

parola.getText ().length () == 0) {

acces.setText("");

return;

}

if (nume.getText ().equals(UID) &&

parola.getText ().equals(PWD))

acces.setText("Acces permis!");

else

acces.setText("Acces interzis!");

}

}

public class TestTextField {

public static void main(String args []) {

Fereastra f = new Fereastra("TextField");

f.show();

}

}

9 .7 .10 Clasa T ex tA rea

U n ob ie c t d e tip TextArea d efine ste un control d e e d itare a te x tului p e m aim ulte linii. E ste util p entru e d itarea d e te x te , introd uc erea unor com entarii,e tc .

L isting 9.29: Folosirea c lase i TextArea

import java.awt .*;

Page 267: Cristian Frasinaru-Curs Practic de Java.pdf

266 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

import java.awt.event .*;

import java.io.*;

class Fereastra extends Frame implements TextListener ,

ActionListener {

private TextArea text;

private TextField nume;

private Button salvare;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

setBackground(Color.lightGray);

text = new TextArea("", 30, 10, TextArea.

SCROLLBARS_VERTICAL_ONLY);

nume = new TextField("", 12);

salvare = new Button("Salveaza text");

salvare.setEnabled(false);

Panel fisier = new Panel();

fisier.add(new Label("Fisier:"));

fisier.add(nume);

add(fisier , BorderLayout.NORTH);

add(text , BorderLayout.CENTER);

add(salvare , BorderLayout.SOUTH);

setSize (300, 200);

text.addTextListener(this);

salvare.addActionListener(this);

}

// Metoda interfetei TextListener

public void textValueChanged(TextEvent e) {

if (text.getText ().length () == 0 ||

nume.getText ().length () == 0)

salvare.setEnabled(false);

else

salvare.setEnabled(true);

Page 268: Cristian Frasinaru-Curs Practic de Java.pdf

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T 267

}

// Metoda interfetei ActionListener

public void actionPerformed(ActionEvent e) {

String continut = text.getText ();

try {

PrintWriter out = new PrintWriter(

new FileWriter(nume.getText ()));

out.print(continut);

out.close();

text.requestFocus ();

} catch(IOException ex) {

ex.printStackTrace ();

}

}

}

public class TestTextArea {

public static void main(String args []) {

Fereastra f = new Fereastra("TextArea");

f.show();

}

}

Page 269: Cristian Frasinaru-Curs Practic de Java.pdf

268 CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Page 270: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 10

D esenarea

10 .1 Conceptul de desenare

U n p rog ram J av a care are interfata g rafic a cu utilizatorul tre b uie sa d e sene z ep e e c ran toate com p onente le sale care au o re p re z entare v izuala. A c eastad e senare inc lud e com p onente le stand ard folosite ın ap licatie p re cum si c e led efinite d e c atre p rog ram ator. D e senarea com p onente lor se fac e autom at sie ste un p roc es care se e x e cuta ın urm atoare le situatii:

• la afisarea p entru p rim a d ata a une i com p onente ;

• la op eratii d e m inim izare , m ax im izare , re d im ensionare a sup rafe te i d eafisare ;

• ca rasp uns al une i solic itari e x p lic ite a p rog ram ului.

M e tod e le care controleaz a p roc esul d e d e senare se g ase sc ın c lasa Componentsi sunt urm atoare le :

• void paint(G raph ics g ) - D e seneaz a o com p onenta. E ste o m etod asup rad efinita d e fie care com p onenta ın p arte p entru a furniza re p re z entareasa g rafic a sp e c ific a. M e tod a este ap e lata d e fie care d ata c and continutulcom p onente i tre b uie d e senat sau re d e senat si nu v a fi ap e lata e x p lic it.

• void update(G raph ics g ) - A c tualiz eaz a starea g rafic a a une i com -p onente . A c tiunea ac este i m e tod e se realiz eaz a ın tre i p asi:

1. ste rg e com p onenta p rin sup rad esenarea e i cu culoarea fund alului;

269

Page 271: Cristian Frasinaru-Curs Practic de Java.pdf

270 CAPIT O L UL 1 0 . D E SE NARE A

2. stab ile ste culoarea (fore g round ) a com p onente i;

3. ap e leaz a m e tod a paint p entru a re d e sena com p onenta.

• void repaint() - E x e cuta e x p lic it un ap e l al m e tod e i update p entrua actualiza re p re z entarea g rafic a a une i com p onente .

D up a cum se ob serv a, sing urul arg um ent al m e tod e lor paint si updatee ste un ob ie c t d e tip G raph ics. A c e sta re p re z inta co n textu l gra fi c ın care see x e cuta d e senarea com p onente lor (v e z i ” Conte x tul g rafic d e d e senare - c lasaG rap h ic s” ).

A tentie

T oate d e sene le care tre b uie sa ap ara p e o sup rafata d e d e senare se real-iz eaz a ın m e tod a paint a une i com p onente , ın g eneral ap e lata autom at sauex p lic it cu m etod a repaint ori d e c ate ori com p onenta resp e c tiv a tre b uiere d e senata. E x ista p osib ilitatea d e a d esena si ın afara m etod e i paint, ınsaac este d e sene se v or p ie rd e la p rim a op eratie d e m inim izare , m ax im izare ,re d im ensionare a sup rafe te i d e afisare .

10 .1.1 M etoda paint

D up a cum am sp us, toate d e sene le care tre b uie sa ap ara p e o sup rafata d eafisare se realiz eaz a ın m e tod a paint a une i com p onente . M e tod a paint e sted efinita ın sup erc lasa Component ınsa nu are nic i o im p le m entare si, d in ac estm otiv , oric e ob ie c t g rafic care d ore ste sa se d e sene z e tre b uie sa o sup rad e -fineasc a p entru a-si c rea p rop ria sa re p re z entare . Com p onente le stand ardA W T au d e ja sup rad efinita ac easta m e tod a d e c i nu tre b uie sa ne p reocup ed e senarea lor, ınsa p ute m m od ifica re p re z entarea lor g rafic a p rin creareaune i sub c lase si sup rad efinirea m etod e i paint, av and ınsa g rija sa ap e lam sim e tod a sup erc lase i care se ocup a cu d esenarea e fe c tiv a a com p onente i.

In e x e m p lul d e m ai jos, re d efinim m e tod a paint p entru un ob ie c t d etip Frame, p entru a crea o c lasa c e instantiaz a fe re stre p entru o ap licatied e m onstrativ a (ın coltul stang a sus este afisat te x tul ” A p licatie D E M O” ).

Page 272: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .1 . CO NCE PT UL D E D E SE NARE 271

L isting 10.1: S up rad efinirea m etod e i paint

import java.awt .*;

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

setSize (200, 100);

}

public void paint(Graphics g) {

// Apelam metoda paint a clasei Frame

super.paint(g);

g.setFont(new Font("Arial", Font.BOLD , 11));

g.setColor(Color.red);

g.drawString("Aplicatie DEMO", 5, 35);

}

}

public class TestPaint {

public static void main(String args []) {

Fereastra f = new Fereastra("Test paint");

f.show();

}

}

Ob serv ati c a la oric e re d im ensionare a ferestre i te x tul ” A p licatie D E M O”v a fi re d e senat. D ac a d e senarea ac estui te x t ar fi fost facuta oriund e ın altap arte d e c at ın m e tod a paint, la p rim a re d im ensionare a fe re stre i ac esta s-arp ie rd e .

A sad ar, d e senarea ın J av a tre b uie sa se fac a d oar ın cad rul m e tod e lorpaint ale com p onente lor g rafice .

10 .1.2 S uprafete de desenare - clasa Canvas

In afara p osib ilitatii d e a utiliza com p onente g rafic e stand ard , J av a oferasi p osib ilitatea controlului la niv e l d e p unct (p ix e l) p e d isp oz itiv ul g rafic ,resp e c tiv d e senarea a d ife rite form e g rafice d ire c t p e sup rafata une i com p o-nente . D e si e ste p osib il, ın g eneral nu se d eseneaz a la niv e l d e p ix e l d ire c tp e sup rafata fe restre lor sau a altor containere , c i v or fi folosite c lase d e d icateac estui scop .

In A W T a fost d efinit un tip sp e c ial d e com p onenta num ita Canvas(p anz a d e p ic tor), al c are i scop este d e a fi ex tinsa p entru a im p le m enta

Page 273: Cristian Frasinaru-Curs Practic de Java.pdf

272 CAPIT O L UL 1 0 . D E SE NARE A

ob ie c te g rafice cu o anum ita ınfatisare . A sad ar, Canvas e ste o c lasa g eneric ad in care se d e riv eaz a sub c lase p entru crearea sup rafe te lor d e d e senare (p lanse ).P lanse le nu p ot contine alte com p onente g rafice , e le fiind utilizate d oar casup rafe te d e d e senat sau ca fund al p entru anim atie . D e senarea p e o p lansase fac e p rin sup rad efinirea m etod e i paint a aceste ia.

Concret, o p la n sa e ste o sup rafata d re p tung h iulara d e culoare alb a, p ecare se p oate d e sena. D im ensiunile sale im p lic ite sunt 0 si, d in ac est m o-tiv , e ste re com and at ca o p lansa sa re d efineasca m etod a getPreferredSize,e v entual si getMinimumSize, getMaximumSize, d eoare c e ac estea v or fi ap e lated e c atre g e stionarii d e p oz itionare .

E tap e le uzuale care tre b uie p arcurse p entru crearea unui d esen, sau m aib ine z is a une i com p onente cu o anum ita ınfatisare , sunt:

• c rearea une i p lanse d e d e senare , ad ic a o sub c lasa a lui Canvas;

• re d efinirea m etod e i paint d in c lasa resp e c tiv a;

• re d efinirea m etod e lor getPreferredSize, e v entual getMinimumSize,getMaximumSize;

• ad aug area p lanse i p e un container cu m etod a add.

• tratarea e v enim ente lor d e tip FocusEvent, KeyEvent, MouseEvent,

ComponentEvent, d ac a e ste cazul.

D efinirea g eneric a a une i p lanse are urm atorul form at:

class Plansa extends Canvas implements ...Listener {

//Eventual, unul sau mai multi constructori

public Plansa() {

...

}

// Metode de desenare a componentei

public void paint(Graphics g) {

...

}

// Metodele folosite de gestionarii de pozitionare

public Dimension getPreferredSize() {

// Dimensiunea implicita a plansei

Page 274: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .1 . CO NCE PT UL D E D E SE NARE 273

return ...;

}

public Dimension getMinimumSize() {

return ...

}

public Dimension getMaximumSize() {

return ...

}

// Implementarea metodelor interfetelor de tip Listener

...

}

S a d efinim o p lansa p e care d e senam un p atrat si c e rcul sau c ircum scris,colorate d ife rite . L a fie care c lick d e m ouse , v om intersch im b a c e le d oua culoriıntre e le .

L isting 10.2: Folosirea c lase i Canvas

import java.awt .*;

import java.awt.event .*;

class Plansa extends Canvas {

Dimension dim = new Dimension (100, 100);

private Color color[] = {Color.red , Color.blue};

private int index = 0;

public Plansa () {

this.addMouseListener(new MouseAdapter () {

public void mouseClicked(MouseEvent e) {

index = 1 - index;

repaint ();

}

});

}

public void paint(Graphics g) {

g.setColor(color[index]);

g.drawRect(0, 0, dim.width , dim.height);

g.setColor(color[1 - index ]);

g.fillOval(0, 0, dim.width , dim.height);

}

public Dimension getPreferredSize () {

Page 275: Cristian Frasinaru-Curs Practic de Java.pdf

274 CAPIT O L UL 1 0 . D E SE NARE A

return dim;

}

}

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

setSize (200, 200);

add(new Plansa (), BorderLayout.CENTER);

}

}

public class TestCanvas {

public static void main(String args []) {

new Fereastra("Test Canvas").show();

}

}

10 .2 Contex tul g rafi c de desenare

Inainte ca utilizatorul sa p oata d e sena, e l tre b uie sa ob tina un conte x t g raficd e d e senare p entru sup rafata c are ia ıi ap artine re g iunea p e care se v a d esena.U n co n text gra fi c e ste , d e fap t, un ob ie c t p rin interm e d iul c aruia p ute mcontrola p roc esul d e d e senare a unui ob ie c t. In g eneral, d e senarea se p oatefac e :

• p e o p ortiune d e e c ran,

• la im p rim anta sau

• ıntr-o zona v irtuala d e m e m orie .

U n conte x t g rafic este sp e c ificat p rin interm e d iul unui ob ie c t d e tip G raph -ics p rim it ca p aram etru ın m etod e le paint si update. In func tie d e d isp oz i-tiv ul fiz ic p e care se fac e afisarea (e c ran, im p rim anta, p lotter, e tc ) m e tod e led e d e senare au im p le m entari interne d ife rite , transp arente utilizatorului.

Clasa Graphics p une la d isp oz itie m e tod e p entru:

• p rim itiv e g rafice : d e senarea d e fig uri g eom etric e , te x te si im ag ini

• stab ilirea p rop rie tatilor conte x tului g rafic , ad ic a stab ilirea:

Page 276: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .2 . CO NT E X T UL G RAF IC D E D E SE NARE 275

– culorii si fontului curente cu care se fac e d e senarea,

– orig inii coord onate lor sup rafe te i d e d e senare ,

– sup rafe te i ın care sunt v iz ib ile com p onente lor d esenate ,

– m od ului d e d e senare .

10 .2 .1 P roprietatile contex tului g rafi c

L a oric e tip d e d e senare p aram etrii le g ati d e culoare , font, e tc . v or fi sp e c ificatip entru conte x tul g rafic ın care se fac e d e senarea si nu v or fi trim isi ca ar-g um ente m e tod e lor resp e c tiv e d e d e senare . In continuare , enum eram ac estep rop rie tati si m e tod e le asoc iate lor d in c lasa Graphics.

P roprietate M etodeCuloarea d e d e senare Color getColor()

void setColor(Color c)

Fontul d e sc rie re a te x te lor Font getFont()

void setFont(Font f)

Orig inea coord onate lor translate(int x, int y)

Z ona d e d e cup are Shape getClip()

(zona ın care sunt v iz ib ile d e sene le ) void setClip(Shape s)

M od ul d e d e senare void setXorMode(Color c)

void setPaintMode(Color c)

10 .2 .2 P rim itive g rafi ce

P rin p rim itive gra fi ce ne v om re fe ri ın continuare la m etod e le c lase i Graphics,care p e rm it d e senarea d e fig uri g eom etric e si te x te .

D esenarea tex telor se fac e cu uzual cu m etod a drawString care p rim e steca arg um ente un sir si coltul d in stang a-jos al te x tului. T e x tul v a fi d esenatcu fontul si culoarea curente ale conte x tului g rafic .

// Desenam la coordonatele x=10, y=20;

drawString("Hello", 10, 20);

D esenarea fi g urilor g eom etrice se realiz eaz a cu urm atoare le m e tod e :

Page 277: Cristian Frasinaru-Curs Practic de Java.pdf

276 CAPIT O L UL 1 0 . D E SE NARE A

F ig ura g eom etrica M etodeL inie drawLine

drawPolyline

D re p tung h i sim p lu drawRect

fillRect

clearRect

D re p tung h i cu ch enar draw3DRect

” rid icat” sau ” ad anc it” fill3DRect

D re p tung h i cu colturi drawRoundRect

retunjite fillRoundRect

P olig on drawPolygon

fillPolygon

Oval (E lip sa drawOval

fillOval

A rc c ircular sau drawArc

e lip tic fillArc

M e tod e le care ınc e p cu ” fill” v or d esena fig uri g eom etric e care au interi-orul colorat, ad ic a ” um p lut” cu culoarea curenta a conte x tului d e d e senare ,ın tim p c e m e tod e le care ınc e p cu ” d raw ” v or d esena d oar conturul fig uriire sp e c tiv e .

10 .3 F olosirea fonturilor

D up a cum v azut, p entru a scrie un te x t p e e c ran av e m d oua p osib ilitati.P rim a d intre ac estea este sa folosim o com p onenta orientata-te x t, cum arfi Label, iar a d oua sa ap e lam la m etod e le c lase i Graphics d e d e senarea te x te lor, cum ar fi drawString. Ind ife rent d e m od alitatea aleasa, p ute msp e c ifica p rin interm e d iul fonturilor cum sa arate te x tul resp e c tiv , ac est lucrurealiz and u-se p rin m etod a setF ont fie d in c lasa Component, fie d in Graphics.

Ce i m ai im p ortanti p aram etri c e caracteriz eaz a un font sunt:

• N um e le fontului: H e lv e tica B old , A rial B old Italic , e tc .

• Fam ilia d in care fac e p arte fontul: H e lv e tica, A rial, e tc .

• D im ensiunea fontului: ınaltim ea sa;

• S tilul fontului: ıng rosat (b old), ın c lin a t (ita lic);

Page 278: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .3 . F O L O SIRE A F O NT URIL O R 277

• M e trica fontului.

Clase le care ofera sup ort p entru lucrul cu fonturi sunt F ont si F ontM etrics,ın continuare fiind p re z entate m od alitatile d e lucru cu ac estea.

10 .3 .1 Clasa F ont

U n ob ie c t d e tip Font ıncap suleaz a inform atii d e sp re toti p aram etrii unuifont, m ai p utin d esp re m e trica ac estuia. Constructorul uzual al c lase i e stec e l care p rim e ste ca arg um ent num e le fontului, d im ensiunea si stilul ac estuia:

Font(String name, int style, int size)

S tilul unui font este sp e c ificat p rin interm e d iul constante lor: Font.PLAIN,Font.BOLD, Font.ITALIC iar d im ensiunea p rintr-un ıntre g , ca ın e x e m p le led e m ai jos:

new Font("Dialog", Font.PLAIN, 12);

new Font("Arial", Font.ITALIC, 14);

new Font("Courier", Font.BOLD, 10);

Folosirea unui ob ie c t d e tip Font se realiz eaz a uzual astfe l:

// Pentru componente etichetate

Label label = new Label("Un text");

label.setFont(new Font("Dialog", Font.PLAIN, 12));

// In metoda paint(Graphics g)

g.setFont(new Font("Courier", Font.BOLD, 10));

g.drawString("Alt text", 10, 20);

O p latform a d e lucru are instalate , la un m om ent d at, o serie ıntreag a d efonturi care sunt d isp onib ile p entru scrie rea te x te lor. L ista ac estor fonturi sep oate ob tine astfe l:

Font[] fonturi = GraphicsEnvironment.

getLocalGraphicsEnvironment().getAllFonts();

E x e m p lul urm ator afiseaz a lista tuturor fonturilor d isp onib ile p e p lat-form a curenta d e lucru. T e x tul fie c arui num e d e font v a fi scris cu fontul saucoresp unz ator.

Page 279: Cristian Frasinaru-Curs Practic de Java.pdf

278 CAPIT O L UL 1 0 . D E SE NARE A

L isting 10.3: L ucrul cu fonturi

import java.awt .*;

class Fonturi extends Canvas {

private Font[] fonturi;

Dimension canvasSize = new Dimension (400, 400);

public Fonturi () {

fonturi = GraphicsEnvironment.

getLocalGraphicsEnvironment ().getAllFonts ();

canvasSize.height = (1 + fonturi.length) * 20;

}

public void paint(Graphics g) {

String nume;

for(int i=0; i < fonturi.length; i++) {

nume = fonturi[i]. getFontName ();

g.setFont(new Font(nume , Font.PLAIN , 14));

g.drawString(i + ". " + nume , 20, (i + 1) * 20);

}

}

public Dimension getPreferredSize () {

return canvasSize;

}

}

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

ScrollPane sp = new ScrollPane ();

sp.setSize (400, 400);

sp.add(new Fonturi ());

add(sp , BorderLayout.CENTER);

pack();

}

}

public class TestAllFonts {

public static void main(String args []) {

new Fereastra("All fonts").show();

}

}

Page 280: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .3 . F O L O SIRE A F O NT URIL O R 279

10 .3 .2 Clasa F ontM etrics

L a afisarea unui sir cu m etod a drawString tre b uie sa sp e c ific am p oz itia lacare sa ap ara te x tul resp e c tiv p e e c ran. In m om entul ın care av e m d e afisatm ai m ulte siruri conse cutiv , sau unele sub alte le , tre b uie sa calculam p oz itiilelor d e afisare ın func tie d e lung im ea si ınaltim ea ın p ix e li a c e lorlalte te x te .P entru aceasta este folosita c lasa F ontM etrics. U n ob ie c t d in ac easta c lasase construie ste p ornind d e la un ob ie c t d e tip Font si p une la d isp oz itieinform atii d e sp re d im ensiunile ın p ix e li p e care le au caractere le fontuluiresp e c tiv ıntr-un anum it conte x t d e d e senare .

A sad ar, un ob ie c t d e tip FontMetrics ıncap suleaz a inform atii d e sp rem etrica unui font, cu alte cuv inte d e sp re d im ensiunile ın p ix e li ale carac -tere lor sale . U tilitatea p rinc ip ala a ac este i c lase consta ın fap tul c a p e rm itep oz itionarea p re c isa a te x te lor p e o sup rafata d e d e senare , ind ife rent d e fontulfolosit d e ac estea.

M e trica unui font consta ın urm atoare le atrib ute p e care le au caractere lesale :

• L inia d e b az a: e ste linia d up a care sunt aliniate caractere le unui font;

• L inia d e asc end enta: linia sup erioara p e care nu o d e p aseste nic i uncaracter d in font

• L inia d e d e sc end enta: linia inferioara sub care nu cob oara nic i un car-acter d in font;

• A sc end entul: d istanta ıntre linia d e b az a si linia d e asc end enta;

• D e sc end entul: d istanta ıntre linia d e b az a si linia d e d e sc end enta;

• L atim ea: latim ea unui anum it caracter d in font;

• D istanta ıntre linii (” lead ing ” ): d istanta op tim a ıntre d oua linii d e te x tscrise cu ac e lasi font.

• Inaltim ea: d istanta d intre liniile d e b az a (lead ing + asc ent+ d e sc ent);

Fig ura d e m ai jos p re z inta o im ag ine re p re z entativ a asup ra m etric ii unuifont:

Page 281: Cristian Frasinaru-Curs Practic de Java.pdf

280 CAPIT O L UL 1 0 . D E SE NARE A

R eam intim c a la m e tod a drawString(String s, int x, int y) arg u-m ente le x si y re p re znita coltul d in stang a-jos al te x tului. Ca sa fim m aip re c isi, y re p re z inta p oz itia linie i d e b az a a te x tului care v a fi scris.

U n conte x t g rafic p une la d isp oz itie o m e tod a sp e c iala getFontMetrics

d e c reare a unui ob ie c t d e tip FontMetrics, p ornind d e la fontul curent alconte x tului g rafic :

public void paint(Graphics g) {

Font f = new Font("Arial", Font.BOLD, 11);

FontMetrics fm = g.getFontMetrics();

}

Cele m ai folosite m e tod e ale c lase i FontMetrics sunt:

• getHeight - d e te rm ina ınaltim ea une i linii p e care v or fi scrise caractereale unui font;

• stringWidth - d e te rm ina latim ea totala ın p ix e li a unui sir d e caracteresp e c ificat;

• charWidth - d e te rm ina latim ea unui anum it caracter d in font.

In e x e m p lul urm ator sunt afisate p e e c ran z ile le sap tam anii si lunile an-ului:

Page 282: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .3 . F O L O SIRE A F O NT URIL O R 281

L isting 10.4: Folosirea c lase i FontM etric s

import java.awt .*;

class Texte extends Canvas {

Dimension canvasSize = new Dimension (800, 100);

private String [] zile= {

"Luni", "Marti", "Miercuri", "Joi",

"Vineri", "Sambata", "Duminica"};

private String [] luni = {

"Ianuarie", "Februarie", "Martie", "Aprilie",

"Mai", "Iunie", "Iulie", "August", "Septembrie",

"Octombrie", "Noiembrie", "Decembrie"};

public void paint(Graphics g) {

FontMetrics fm;

int x,y;

String etZile = "Zilele saptamanii:",

etLuni = "Lunile anului:", text;

// Alegem un font si aflam metrica sa

g.setFont(new Font("Arial", Font.BOLD , 20));

fm = g.getFontMetrics ();

x = 0;

y = fm.getHeight ();

g.drawString(etZile , x, y);

x += fm.stringWidth(etZile);

for(int i=0; i < zile.length; i++) {

text = zile[i];

if (i < zile.length - 1)

text += ", ";

g.drawString(text , x, y);

x += fm.stringWidth(text);

}

// Schimbam fontul

g.setFont(new Font("Dialog", Font.PLAIN , 14));

fm = g.getFontMetrics ();

x = 0;

y += fm.getHeight ();

g.drawString(etLuni , x, y);

x += fm.stringWidth(etLuni);

for(int i=0; i < luni.length; i++) {

text = luni[i];

if (i < luni.length - 1)

Page 283: Cristian Frasinaru-Curs Practic de Java.pdf

282 CAPIT O L UL 1 0 . D E SE NARE A

text += ", ";

g.drawString(text , x, y);

x += fm.stringWidth(text);

}

}

public Dimension getPreferredSize () {

return canvasSize;

}

}

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

add(new Texte(),BorderLayout.CENTER);

pack();

}

}

public class TestFontMetrics {

public static void main(String args []) {

Fereastra f = new Fereastra("FontMetrics");

f.show();

}

}

10 .4 F olosirea culorilor

Oric e culoare este form ata p rin com b inatia culorilor stand ard rosu (re d ),v e rd e (g re en) si alb astru (b lue), la care se ad aug a un anum it g rad d e transp arenta(alp h a). Fie care d in ac e sti p atru p aram etri p oate v aria ıntr-un interv alcup rins fie ıntre 0 si 255 (d ac a d orim sa sp e c ific am v alorile p rin num ereıntre g i), fie ıntre 0.0 si 1.0 (d ac a d orim sa sp e c ific am v alorile p rin num erereale).

O culoare este re p re z entata p rintr-o instanta a c lase i Color sau a sub -c lase i sale S y stem Color. P entru a crea o culoare av e m d oua p osib ilitati:

• S a folosim una d in constante le d efinite ın c e le d oua c lase ;

• S a folosim unul d in constructorii c lase i Color.

S a v e d e m m ai ıntai care sunt constante le d efinite ın ac este c lase :

Page 284: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .4 . F O L O SIRE A CUL O RIL O R 283

Color S y stem Colorb lack activ eCap tionb lue activ eCap tionB ord erc y an activ eCap tionT e x td ark G ray controlg ray controlH ig h lig h tg re en controlS h ad owlig h tG ray contolT e x tm ag enta d esk toporang e m enup ink te x tre d te x tH ig h lig h tw h ite w ind owy e llow ...

Ob serv ati c a ın c lasa Color sunt d efinite culori uzuale d in p aleta stand ardd e culori, ın tim p c e ın c lasa SystemColor sunt d efinite culorile com p onen-te lor stand ard (fe restre , te x te , m eniuri, e tc ) ale p latform e i curente d e lucru.Folosirea ac estor constante se fac e ca ın e x e m p le le d e m ai jos:

Color rosu = Color.red;

Color galben = Color.yellow;

Color fundal = SystemColor.desktop;

D ac a nic i una d in ac este culori p re d efinite nu coresp und e p re fe rinte lor noas-tre , atunc i p ute m c rea noi culori p rin interm e d iul constructorilor c lase i Color:

Color(float red, flot green, float blue)

Color(flot red, float green, float blue, float alpha)

Color(int red, int green, int blue)

Color(int red, int green, int blue, int alpha)

Color(int rgb)

und e r ed , g r een, blu e, alp h a sunt v alorile p entru rosu, v e rd e , alb astru sitransp arenta iar p aram etrul ” rg b ” d e la ultim ul constructor re p re z inta unıntre g form at d in: b itii 16-23 rosu, 8-15 v erd e , 0-7 alb astru.

V alorile arg um ente lor v ariaz a ıntre 0 − 255 p entru tip ul int, re sp e c tiv0.0 − 1.0 p entru tip ul float. V aloarea 255 (sau 1.0) p entru transp arentasp e c ific a fap tul c a re sp e c tiv a culoare este com p le t op ac a, iar v aloarea 0 (sau0.0) sp e c ific a transp arenta totala. Im p lic it, culorile sunt com p le t op ac e .

Page 285: Cristian Frasinaru-Curs Practic de Java.pdf

284 CAPIT O L UL 1 0 . D E SE NARE A

// Exemple de folosire a constructorilor:

Color alb = new Color(255, 255, 255);

Color negru = new Color(0, 0, 0);

Color rosu = new Color(255, 0, 0);

Color rosuTransparent = new Color(255, 0, 0, 128);

M e tod e le c e le m ai folosite ale c lase i Color sunt:

brighter Creeaz a o noua v ersiune a culorii curentedarker m ai d e sch isa, re sp e c tiv m ai ınch isagetRed

getGreen D e te rm ina p aram etrii d in caregetBlue e ste alcatuita culoareagetAlpha

getRGB D e te rm ina v aloarea c e re p re z inta culoarearesp e c tiv a (b itii 16-23 rosu, 8-15 v erd e , 0-7 alb astru)

S a consid e ram o ap licatie cu ajutorul c are ia p ute m v izualiza d inam ic cu-lorile ob tinute p rin d ife rite com b inatii ale p aram etrilor c e form eaz a o culoare .A p licatia v a arata astfe l:

L isting 10.5: Folosirea c lase i Color

import java.awt .*;

import java.awt.event .*;

class Culoare extends Canvas {

public Color color = new Color(0, 0, 0, 255);

Dimension canvasSize = new Dimension (150, 50);

public void paint(Graphics g) {

g.setColor(Color.black);

Page 286: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .4 . F O L O SIRE A CUL O RIL O R 285

g.setFont(new Font("Arial", Font.BOLD , 12));

String text = "";

text += " R=" + color.getRed ();

text += " G=" + color.getGreen ();

text += " B=" + color.getBlue ();

text += " A=" + color.getAlpha ();

g.drawString(text , 0, 30);

g.setColor(color);

g.fillRect(0, 0, canvasSize.width , canvasSize.height);

}

public Dimension getPreferredSize () {

return canvasSize;

}

}

class Fereastra extends Frame implements AdjustmentListener {

private Scrollbar rValue , gValue , bValue , aValue;

private Culoare culoare;

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

Panel rgbValues = new Panel();

rgbValues.setLayout(new GridLayout (4, 1));

rValue = new Scrollbar(Scrollbar.HORIZONTAL , 0, 1, 0,

256);

rValue.setBackground(Color.red);

gValue = new Scrollbar(Scrollbar.HORIZONTAL , 0, 1, 0,

256);

gValue.setBackground(Color.green);

bValue = new Scrollbar(Scrollbar.HORIZONTAL , 0, 1, 0,

256);

bValue.setBackground(Color.blue);

aValue = new Scrollbar(Scrollbar.HORIZONTAL , 0, 1, 0,

256);

Page 287: Cristian Frasinaru-Curs Practic de Java.pdf

286 CAPIT O L UL 1 0 . D E SE NARE A

aValue.setValue (255);

aValue.setBackground(Color.lightGray);

rgbValues.add(rValue);

rgbValues.add(gValue);

rgbValues.add(bValue);

rgbValues.add(aValue);

rgbValues.setSize (200, 100);

add(rgbValues , BorderLayout.CENTER);

culoare = new Culoare ();

add(culoare , BorderLayout.NORTH);

pack();

rValue.addAdjustmentListener(this);

gValue.addAdjustmentListener(this);

bValue.addAdjustmentListener(this);

aValue.addAdjustmentListener(this);

}

public void adjustmentValueChanged(AdjustmentEvent e) {

int r = rValue.getValue ();

int g = gValue.getValue ();

int b = bValue.getValue ();

int a = aValue.getValue ();

Color c = new Color(r, g, b, a);

culoare.color = c;

culoare.repaint ();

}

}

public class TestColor{

public static void main(String args []) {

Fereastra f = new Fereastra("Color");

f.show();

}

}

10 .5 F olosirea im ag inilor

A c easta este o im ag ine :

Page 288: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .5 . F O L O SIRE A IM AG INIL O R 287

In A W T e ste p osib ila folosirea im ag inilor create e x te rn ın form at gif saujpeg . Oric e im ag ine v a fi re p re z entata ca o instanta a c lase i Im ag e. A c eastanu este o c lasa d e com p onente (nu ex tind e Component) c i im p le m enteaz aob ie c te care p ot fi d esenate p e sup rafata unor com p onente cu m etod e sp e c ific eunui conte x t g rafic p entru com p onenta resp e c tiv a (sim ilar m od ului cum sed e seneaz a o linie sau un cerc).

10 .5 .1 A fi sarea im ag inilor

A fisarea une i im ag ini p resup une realizarea urm atoarilor d oi p asi:

1. Crearea unui ob ie c t d e tip Image;

2. A fisarea p rop riu-z isa ıntr-un conte x t g rafic ;

Crearea unui ob ie c t d e tip Image se fac e folosind o im ag ine d intr-un fisie rfie afl at p e m asina p e care se lucreaz a, fie afl at la o anum ita ad resa W e b(U R L ). M e tod e le p entru ınc arcarea une i im ag ini d intr-un fisie r se g ase scın c lase le Applet si Toolkit, av and ınsa ac e easi d enum ire g etIm ag e siurm atoare le form ate :

A pplet T oolk itgetImage(URL url) getImage(URL url)

getImage(URL url, String fisier) getImage(String fisier)

P entru a ob tine un ob ie c t d e tip Toolkit se v a folosi m e tod a getDefaultToolkit,ca ın e x e m p lul d e m ai jos:

Toolkit toolkit = Toolkit.getDefaultToolkit();

Image image1 = toolkit.getImage("poza.gif");

Image image2 = toolkit.getImage(

new URL("http://www.infoiasi.ro/~acf/poza.gif"));

Page 289: Cristian Frasinaru-Curs Practic de Java.pdf

288 CAPIT O L UL 1 0 . D E SE NARE A

M e tod a getImage nu v erific a d ac a fisie rul sau ad resa sp e c ificata re p re z intao im ag ine v alid a si nic i nu ıncarc a e fe c tiv im ag inea ın m e m orie , ac este op eratiunifiind facute ab ia ın m om entul ın care se v a realiza afisarea im ag inii p entrup rim a d ata. M e tod a nu fac e d e c at sa c re e z e un ob ie c t d e tip Image care fac ere fe rinta la o anum ita im ag ine e x te rna.

A fisarea une i im ag ini ıntr-un conte x t g rafic se realiz eaz a p rin interm e d iulm e tod e i draw Im ag e d in c lasa Graphics si, ın g eneral, v a fi facuta ın m e tod apaint a une i com p onente . Cele m ai uzuale form ate ale m e tod e i sunt:

boolean drawImage(Image img, int x, int y, ImageObserver observer)

boolean drawImage(Image img, int x, int y, Color bgcolor,

ImageObserver observer)

boolean drawImage(Image img, int x, int y, int width, int height,

ImageObserver observer)

boolean drawImage(Image img, int x, int y, int width, int height,

Color bgcolor, ImageObserver observer)

und e :

• im g e ste ob ie c tul c e re p re z inta im ag inea;

• x, y sunt coord onate le stang a-sus la care v a fi afisata im ag inea, re lativ ela sp atiul d e coord onate al conte x tului g rafic ;

• obser v er e ste un ob ie c t care ” ob serv a” ınc arcarea im ag inii si v a fi in-form at p e m asura d erularii ac este ia;

• w id th , h eig th re p re z inta ınaltim ea si latim ea la care tre b uie scalataim ag inea (d ac a lip se sc , im ag inea v a fi afisata la d im ensiunile e i reale);

• bg Color re p re z inta culoarea cu care v or fi colorati p ix e lii transp arentiai im ag inii (p oate sa lip seasc a).

In e x e m p lul urm ator afisam ac e easi im ag ine d e tre i ori, folosind form ed ife rite ale m e tod e i drawImage:

Image img = Toolkit.getDefaultToolkit().getImage("taz.gif");

g.drawImage(img, 0, 0, this);

g.drawImage(img, 0, 200, 100, 100, this);

g.drawImage(img, 200, 0, 200, 400, Color.yellow, this);

Page 290: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .5 . F O L O SIRE A IM AG INIL O R 289

M etod a drawImage returneaz a true d ac a im ag inea a fost afisata ın ıntre g im esi false ın caz contrar, cu alte cuv inte m e tod a nu aste p ta ca o im ag ine safie com p le t afisata c i se te rm ina im e d iat c e p roc esul d e afisare a ınc e p ut. Inse c tiunea urm atoare v om d e talia ac est asp e c t.

10 .5 .2 M onitorizarea ıncarcarii im ag inilor

In cazul ın care se afiseaz a o im ag ine care se g ase ste p e Internet sau im ag ineaafisata este d e d im ensiuni m ari se v a ob serv a c a ac easta nu ap are com p le t d ela ınc e p ut c i e ste d e senata tre p tat, fara interv entia p rog ram atorului. A c e stlucru se ıntam p la d eoare c e m e tod a drawImage nu fac e d e c at sa d e c lanse z ep roc esul d e ınc arcare si d e senare a im ag inii, d up a care re d a im e d iat con-trolul ap e lantului, lucru d eose b it d e util ıntruc at p roc esul d e ınc arcare aune i im ag ini p oate d ura m ult si nu este d e d orit ca ın ac est interv al d e tim p(p ana la ınc arcarea com p le ta a im ag inii) ap licatia sa fie b locata. Ca urm are ,la ap e lul m e tod e i drawImage v a fi d esenata num ai p ortiunea d e im ag ine careeste d isp onib ila la m om entul initial si care p oate fi incom p le ta. D e ac e eatre b uie sa e x iste un m e canism p rin care com p onenta sa fie re d e senata au-tom at ın m om entul ın care au m ai sosit inform atii le g ate d e im ag ine , p ana laafisarea sa com p le ta. A c e st m e canism e ste realizat p rin interm e d iul interfe te iIm ag eO b server, im p le m entata d e c lasa Component si d e c i d e toate com p o-nente le . A c easta interfata d e sc rie ob ie c te care au ınc e p ut sa utiliz e z e o im ag -ine incom p le ta si care tre b uie anuntate d e noile d ate ob tinute ın le g atura cuim ag inea resp e c tiv a.

Interfata ImageObserver are o sing ura m e tod a num ita im ag eU pdate,c e v a fi ap e lata p e riod ic d e firul d e e x e cutie (c reat autom at) care se ocup acu ınc arcarea im ag inii. Form atul ac este i m e tod e e ste :

boolean imageUpdate (Image img, int flags,

int x, int y, int w, int h )

Im p le m entarea im p lic ita consta d intr-un ap e l la m etod a repaint p entrud re p tung h iul sp e c ificat la ap e l si care re p re z inta zona d in im ag ine p entru carese cunosc noi inform atii. Intre g ul f lag s furniz eaz a inform atii d e sp re stareatransferului. A c e ste inform atii p ot fi afl ate p rin interm e d iul constante lord efinite d e interfata:

Page 291: Cristian Frasinaru-Curs Practic de Java.pdf

290 CAPIT O L UL 1 0 . D E SE NARE A

ABORT Inc arcarea im ag inii a fost ıntrerup ta,ınainte d e com p le tarea sa

ALLBITS Im ag inea a fost ıncarcata com p le tERROR A ap arut o eroare ın tim p ul

ınc arc arii im ag iniiFRAMEBITS T oti b itii cad rului curent sunt d isp onib iliHEIGHT Inaltim ea im ag inii e ste d isp onib ilaPROPERTIES P rop rie tatile im ag inii sunt d isp onib ileSOMEBITS A u fost re c e p tionati noi p ix e li ai im ag iniiWIDTH L atim ea im ag inii e ste d isp onib ila

P re z enta ın p aram etrul f lag s a unui b it d e v aloare 1 p e p oz itia re p re z en-tata d e o constanta ınseam na c a re sp e c tiv a cond itie e ste ınd e p linita.

// Imaginea este completa

(flags & ALLBITS) != 0

// Eroare sau transferul imaginii a fost intrerupt

(flags & ERROR | ABORT ) != 0

M e tod a imageUpdate p oate fi re d efinta d e o com p onenta p entru a p er-sonaliza p roc esul d e afisare al im ag inii. A c easta v a fi ap e lata ap e lata asincrond e fie care d ata c and sunt d isp onib ili noi p ix e li.

public boolean imageUpdate(Image img, int flags,

int x, int y, int w, int h) {

// Desenam imaginea numai daca toti bitii sunt disponibili

if (( flags & ALLBITS) != 0)

repaint();

// Daca sunt toti bitii nu mai sunt necesare noi update-uri

return ( (flags & (ALLBITS | ABORT)) == 0);

}

D e ase m enea, se ob se rv a c a m e tod e le c lase i Image p entru d eterm inaread im ensiunilor une i im ag ini au ca arg um ent un ob ie c t d e tip ImageObserver.

int getHeight(ImageObserver observer)

int getWidth(ImageObserver observer)

D ac a d e senarea se fac e folosind c lasa Canvas, atunc i arg um entul obser v er

al m e tod e lor re fe ritoare la im ag ini v a fi th is.

Page 292: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .5 . F O L O SIRE A IM AG INIL O R 291

10 .5 .3 M ecanism ul de ” doub le-b uff ering ”

T e h nica d e d oub le -b uff ering im p lic a realizarea unui d esen ın m e m orie si ap oitransferul sau p e e c ran, p entru a elim ina e fe c tul ne p lacut d e ” c lip ire ” (” fl ick -e ring ” ) re zultat atunc i c and sunt e fe c tuate re d e senari re p e tate la interv alem ic i d e tim p . O situatie fre c v enta ın care se ap e leaz a la d oub le -b uff ering estec rearea d e anim atii.

S e c v enta g enerala d e im p le m entare a m e canism ului d e d oub le -b uff eringeste urm atoarea:

// Supradefinim update pentru a elimina stergerea desenului

public void update(Graphics g) {

paint(g);

}

public void paint(Graphics g) {

// Desenam in memorie pe un obiect de tip Image

// w si h sunt dimensiunile desenului

Image img = createImage(w, h);

Graphics gmem = img.getGraphics();

/* Realizam desenul folosind gmem

gmem.setColor(...);

gmem.fillOval(...);

...

*/

// Transferam desenul din memorie pe ecran

// desenand de fapt imaginea creata

g.drawImage(img, 0, 0, this);

gmem.dispose();

}

}

10 .5 .4 S alvarea desenelor ın form at JP E G

P ach e tul com.sun.image.codec.jpeg d in d istrib utia stand ard J av a oferasup ort p entru salv area une i im ag ini afl ate ın m e m orie ıntr-un fisie r ın for-

Page 293: Cristian Frasinaru-Curs Practic de Java.pdf

292 CAPIT O L UL 1 0 . D E SE NARE A

m at J P E G . O clasa re sp onsab ila cu realizarea ac este i op e ratiuni ar p utea fid efinita astfe l:

import com.sun.image.codec.jpeg.*;

import java.awt.image.BufferedImage;

import java.awt.*;

import java.io.*;

class JPEGWriter {

static float quality = 0.9f; //intre 0 si 1

public static void write(BufferedImage img, String filename) {

try {

FileOutputStream out = new FileOutputStream(filename);

JPEGImageEncoder encoder =

JPEGCodec.createJPEGEncoder(out);

JPEGEncodeParam jep =

encoder.getDefaultJPEGEncodeParam(img);

jep.setQuality(quality, false);

// Folosim setarile de codare jpeg implicite

encoder.setJPEGEncodeParam(jep);

encoder.encode(img);

out.close();

} catch( Exception e ) {

e.printStackTrace();

}

}

}

10 .5 .5 Crearea im ag inilor ın m em orie

In cazul ın care d orim sa folosim o anum ita im ag ine creata d ire c t d in p ro-g ram si nu ıncarcata d intr-un fisie r v om folosi c lasa M em ory Im ag eS ource,afl ata ın p ach e tul java.awt.image. P entru ac easta v a tre b ui sa d efinim un

Page 294: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .6 . T IPARIRE A 293

v e c tor d e num ere ıntre g i ın care v om scrie v alorile ıntre g i (R G B ) ale cu-lorilor p ix e lilor c e d efinesc im ag inea noastra. D im ensiunea v e c torului v afi ınaltim ea ınm ultita cu latim ea ın p ix e li a im ag inii. Constructorul c lase iMemoryImageSource e ste :

MemoryImageSource(int w, int h, int[] pixeli, int off, int scan)

und e :

• w , h re p re z inta d im ensiunile im ag inii (latim ea si ınaltim ea);

• p ixeli[] e ste v e c torul cu culorile im ag inii;

• of f , scan re p re z inta m od alitatea d e construire a m atric ii im ag inii p ornindd e la v e c torul cu p ix e li, norm al ac este v alori sunt off = 0, scan = w

In e x e m p lul urm ator v om c rea o im ag ine cu p ix e li d e culori aleatorii si ov om afisa p e e c ran:

int w = 100;

int h = 100;

int[] pix = new int[w * h];

int index = 0;

for (int y = 0; y < h; y++) {

for (int x = 0; x < w; x++) {

int red = (int) (Math.random() * 255);

int green = (int) (Math.random() * 255);

int blue = (int) (Math.random() * 255);

pix[index++] = new Color(red, green, blue).getRGB();

}

img = createImage(new MemoryImageSource(w, h, pix, 0, w));

g.drawImage(img, 0, 0, this); // g este un context grafic

10 .6 T iparirea

T ip arirea ın J av a este tratata ın ac e easi m aniera ca si d e senarea, sing urullucru d ife rit fiind conte x tul g rafic ın care se e x e cuta op e ratiile . P ach e tulcare ofera sup ort p entru tip arire e ste java.aw t.print, iar c lasa p rinc ip alacare controleaz a p roc esul d e tip arire e ste P rinterJob . O ap licatie v a ap e lam etod e ale ac este i c lase p entru:

Page 295: Cristian Frasinaru-Curs Practic de Java.pdf

294 CAPIT O L UL 1 0 . D E SE NARE A

• Crearea une i se siuni d e tip arire (job );

• Inv ocarea d ialog ului cu utilizatorul p entru sp e c ificarea unor p aram etrile g ati d e tip arire ;

• T ip arirea e fe c tiv a.

Oric e com p onenta care p oate fi afisata p e e c ran p oate fi si tip arita. In g en-eral, oric e inform atii care tre b uie atat afisate c at si tip arite , v or fi ıncap sulateıntr-un ob ie c t g rafic - com p onenta, care are o re p re z entare v izuala d esc risad e m e tod a paint si care v a sp e c ifica si m od alitatea d e re p re z entare a sa laim p rim anta.

U n ob ie c t care v a fi tip arit tre b uie sa im p le m ente z e interfata P rintab le,care contine o sing ura m e tod a print, re sp onsab ila cu d escrie rea m od alitatiid e tip arire a ob ie c tului. In cazul c and im ag inea d e p e e c ran coinc id e cuim ag inea d e la im p rim anta, m e tod e le paint si print p ot sp e c ifica ac e easise c v enta d e cod . In g eneral, m e tod a print are urm atorul form at:

public int print(Graphics g, PageFormat pf, int pageIndex)

throws PrinterException {

// Descrirea imaginii obiectului ce va fi afisata la imprimanta

// Poate fi un apel la metoda paint: paint(g)

if (ceva nu este in regula}) {

return Printable.NO_SUCH_PAGE;

}

return Printable.PAGE_EXISTS;

}

P asii care tre b uie e fe c tuati p entru tip arirea unui ob ie c t sunt:

1. Crearea une i se siuni d e tip arire : PrinterJob.getPrinterJob

2. S p e c ificarea ob ie c tului care v a fi tip arit: setPrintable; ac e sta tre b uiesa im p le m ente z e interfata Printable;

3. Op tional, initie rea unui d ialog cu utilizatorul p entru p re c izarea unorp aram etri le g ati d e tip arire : printDialog;

Page 296: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .6 . T IPARIRE A 295

4. T ip arirea e fe c tiv a: print.

In e x e m p lul urm ator v om d efini un ob ie c t care are ac e easi re p re z entarep e e c ran c at si la im p rim anta (un cerc c ircum scris unui p atrat, ınsotite d eun te x t) si v om tip ari ob ie c tul resp e c tiv .

L isting 10.6: T ip arirea une i com p onente

import java.io.*;

import java.awt .*;

import java.awt.event .*;

import java.awt.print .*;

class Plansa extends Canvas implements Printable {

Dimension d = new Dimension (400, 400);

public Dimension getPreferredSize () {

return d;

}

public void paint(Graphics g) {

g.drawRect (200, 200, 100, 100);

g.drawOval (200, 200, 100, 100);

g.drawString("Hello", 200, 200);

}

public int print(Graphics g, PageFormat pf, int pi)

throws PrinterException {

if (pi >= 1)

return Printable.NO_SUCH_PAGE;

paint(g);

g.drawString("Numai la imprimanta", 200, 300);

return Printable.PAGE_EXISTS;

}

}

class Fereastra extends Frame implements ActionListener {

private Plansa plansa = new Plansa ();

private Button print = new Button("Print");

public Fereastra(String titlu) {

super(titlu);

addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

Page 297: Cristian Frasinaru-Curs Practic de Java.pdf

296 CAPIT O L UL 1 0 . D E SE NARE A

System.exit (0);

}

});

add(plansa , BorderLayout.CENTER);

Panel south = new Panel();

south.setLayout(new FlowLayout(FlowLayout.CENTER));

south.add(print);

add(south , BorderLayout.SOUTH);

print.addActionListener(this);

pack();

}

public void actionPerformed(ActionEvent e) {

// 1. Crearea unei sesiuni de tiparire

PrinterJob printJob = PrinterJob.getPrinterJob ();

// 2. Stabilirea obiectului ce va fi tiparit

printJob.setPrintable(plansa);

// 3. Initierea dialogului cu utilizatorul

if (printJob.printDialog ()) {

try {

// 4. Tiparirea efectiva

printJob.print();

} catch (PrinterException ex) {

System.out.println("Exceptie la tiparire!");

ex.printStackTrace ();

}

}

}

}

public class TestPrint {

public static void main(String args []) throws Exception {

Fereastra f = new Fereastra("Test Print");

f.show();

}

}

Page 298: Cristian Frasinaru-Curs Practic de Java.pdf

1 0 .6 . T IPARIRE A 297

T iparirea tex telorO alta v arianta p entru tip arirea d e te x te e ste d e sch id e rea unui fl ux c atred isp oz itiv ul sp e c ial re p re z entat d e im p rim anta si sc rie rea inform atiilor, liniecu linie , p e ac est fl ux . In siste m ul d e op erare W ind ow s, im p rim anta p oatefi re fe rita p rin ” lpt1” , iar ın U nix p rin ” / dev/ lp” . Ob serv ati c a ac eastaab ord are nu este p ortab ila, d eoare c e ne c e sita tratare sp e c iala ın func tie d esiste m ul d e op erare folosit.

L isting 10.7: T ip arirea te x te lor

import java.io.*;

import java.awt .*;

class TestPrintText {

public static void main(String args []) throws Exception {

// pentru Windows

PrintWriter imp = new PrintWriter(new FileWriter("lpt1"))

;

// pentru UNIX

// PrintWriter imp = new PrintWriter(new FileWriter ("/dev/

lp"));

imp.println("Test imprimanta");

imp.println("ABCDE");

imp.close();

}

}

Page 299: Cristian Frasinaru-Curs Practic de Java.pdf

298 CAPIT O L UL 1 0 . D E SE NARE A

Page 300: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 11

S w ing

11.1 Introducere

11.1.1 JF C

T e h nolog ia S w ing fac e p arte d intr-un p roie c t m ai am p lu num it JF C (J av aFound ation Classes) care p une la d isp oz itie o serie ıntreag a d e fac ilitati p en-tru scrie rea d e ap licatii cu o interfata g rafic a m ult ım b og atita func tional sie ste tic fata d e v e ch iul m od e l A W T . In J FC sunt inc luse urm atoare le :

• Com ponente S w ingS unt com p onente c e ınlocuiesc si ın ac e lasi tim p e x tind v e ch iul set oferitd e m od e lul A W T .

• L ook -and-F eelP e rm ite sch im b area ınfatisarii si a m od ului d e interac tiune cu ap licatiaın func tie d e p re fe rinte le fie c aruia. A c e lasi p rog ram p oate utiliza d i-v e rse m od uri L ook -and -Fee l, cum ar fi c e le stand ard W ind ow s, M ac ,J av a, M otif sau alte le oferite d e d iv e rsi d e z v oltatori, ac estea p utand fiintersch im b ate d e c atre utilizator ch iar la m om entul e x e cutie i .

• A ccessib ility A P IP e rm ite d e z v oltarea d e ap licatii care sa com unic e cu d isp oz itiv e uti-lizate d e c atre p e rsoane cu d iv e rse tip uri d e h and icap , cum ar fi c ititoared e e c ran, d isp oz itiv e d e re cunoaste re a v oc ii, e c rane B raille , e tc .

• Java 2 D A P IFolosind J av a 2D p ot fi create ap licatii care utiliz eaz a g rafic a la un

299

Page 301: Cristian Frasinaru-Curs Practic de Java.pdf

300 CAPIT O L UL 1 1 . SW ING

niv e l av ansat. Clase le p use la d isp oz itie p e rm it c rearea d e d e sene com -p le x e , e fe c tuarea d e op eratii g eom e tric e (rotiri, scalari, translatii, e tc .),p re lucrarea d e im ag ini, tip arire , e tc .

• D rag -and-D ropOfera p osib ilitatea d e a e fe c tua op eratii d rag -and -d rop ıntre ap licatiiJ av a si ap licatii nativ e .

• InternationalizareInternationalizarea si localizarea ap licatiilor sunt d oua fac ilitati e x tre md e im p ortante care p e rm it d e z v oltarea d e ap licatii care sa p oata fi con-fig urate p entru e x p loatarea lor ın d iv e rse zone ale g lob ului, utiliz andlim b a si p articularitatile le g ate d e form atarea d ate i, num ere lor sau am oned e i d in zona resp e c tiv a.

In ac este cap itol v om fac e o p re z entare scurta a com p onente lor S w ing ,d eoare c e p re z entarea d etaliata a tuturor fac ilitatilor oferite d e J FC ar oferisufic ient m aterial p entru un v olum d e sine statator.

11.1.2 S w ing A P I

U nul d in p rinc ip ale le d e z id e rate ale te h nolog ie i S w ing a fost sa p una lad isp oz itie un set d e com p onente G U I e x tensib ile care sa p e rm ita d e z v oltarearap id a d e ap licatii J av a cu interfata g rafic a com p e titiv a d in p unct d e v e d e recom erc ial. P entru a realiza ac est lucru, A P I-ul oferit d e S w ing este d eose b itd e com p le x av and 17 p ach e te ın care se g ase sc sute d e c lase si interfe te . L istacom p le ta a p ac e h e te lor d in d istrib utia stand ard 1.4 este d ata ın tab e lul d em ai jos:

javax.accessibility javax.swing.plaf

javax.swing.text.html javax.swing

javax.swing.plaf.basic javax.swing.text.parser

javax.swing.border javax.swing.plaf.metal

javax.swing.text.rtf javax.swing.colorchooser

javax.swing.plaf.multi javax.swing.tree

javax.swing.event javax.swing.table

javax.swing.undo javax.swing.filechooser

javax.swing.text

Page 302: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .1 . INT RO D UCE RE 301

E v id ent, nu toate ac este p ach e te sunt nec esare la d e z v olatarea une i ap licatii,c e l m ai im p ortant si care contine com p onente le d e b az a fiind javax .sw ing .

Com p onente le folosite p entru crearea interfe te lor g rafic e S w ing p ot fi g ru-p ate astfe l:

• Com ponente atom iceJLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar,

JSlider, JProgressBar, JSeparator

• Com ponente com plex eJTable, JTree, JComboBox, JSpinner, JList, JFileChooser, JColorChooser,

JOptionPane

• Com ponente pentru editare de tex tJTextField, JFormattedTextField, JPasswordField, JTextArea,

JEditorPane, JTextPane

• M eniuriJMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem,

JRadioButtonMenuItem

• Containere interm ediareJPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane,

JToolBar

• Containere de nivel ınaltJFrame, JDialog, JWindow, JInternalFrame, JApplet

11.1.3 A sem anari si deoseb iri cu A W T

N u se p oate sp une c a S w ing ınlocuie ste m od e lul A W T c i ıl e x tind e p e ac estad in urm a ad aug and u-i noi com p onente care fie ınlocuiesc unele v e ch i fie suntcu totul noi. O conv entie ın g eneral resp e c tata e ste p refix area num e lui une ic lase A W T cu lite ra ”J” p entru a d enum i c lasa coresp ond enta d in S w ing .A stfe l, ın locul c lase i java.awt.Button p ute m folosi javax.swing.JButton,ın loc d e java.awt.Label p ute m folosi javax.swing.JLabel, e tc . E ste re co-m and at ca o ap licatie cu interfata g rafic a sa foloseasc a fie com p onente A W T ,fie S w ing , am este carea lor fiind m ai p utin uzuala.

Page 303: Cristian Frasinaru-Curs Practic de Java.pdf

302 CAPIT O L UL 1 1 . SW ING

A p licatiile G U I v or av ea ın continuare ne v oie d e p ach e tul java.awt d eoare c eaic i sunt d efinite unele c lase utilitare cum ar fi Color, Font, Dimension,e tc . care nu au fost rescrise ın S w ing .

D e ase m enea, p ach e tul java.awt.event ram ane ın continuare esentialp entru tratarea e v enim ente lor g enerate atat d e com p onente A W T c at si d ec e le d in S w ing . P e lang a ac esta m ai p oate fi nec esar si javax.swing.eventcare d e sc rie tip uri d e e v enim ente sp e c ific e unor com p onente S w ing , m e can-ism ul d e tratare a lor fiind ınsa ac e lasi ca ın A W T .

P oz itionarea com p onente lor este p re luata d in A W T , fiind ad aug ate ınsanoi c lase care d e sc riu g estionari d e p oz itionare ın com p le tarea c e lor e x is-tente , cum ar fi BoxLayout si SpringLayout. D ife ra ınsa m od ul d e lucru cucontainere , d up a cum v om v e d ea ın se c tiunea d e d icata ac estora.

M ajoritatea com p onente lor S w ing care p e rm it afisarea unui te x t ca p artea re p re z entarii lor G U I p ot sp e c ifica ac e l te x t fie ın m od norm al folosind unanum it font si o anum ita culoare c e p ot fi setate cu m etod e le setFont sisetColor, fie p rin interm e d iul lim b ajului H T M L . Folosirea H T M L ad uc e ofl e x ib ilitatea d eose b ita ın realizarea interfe te i g rafice , ıntruc at p ute m ap licaform atari m ultip le unui te x t, d e scom p unerea ac estuia p e m ai m ulte linii, e tc .,sing urul d e zav antaj fiind ınc etinirea etap e i d e afisare a com p onente lor.

JButton simplu = new JButton("Text simplu");

JButton html = new JButton(

"<html><u>Text</u> <i>formatat</i></html>");

S a d e sc rie m o ap lic tie sim p la folosind A W T si ap oi S w ing , p entru a necrea o p rim a im p re sie asup ra d ife rente lor si ase m anarilor d intre c e le d ouam od e le .

L isting 11.1: O ap licatie sim p la A W T

import java.awt .*;

import java.awt.event .*;

public class ExempluAWT extends Frame implements

ActionListener {

public ExempluAWT(String titlu) {

super(titlu);

setLayout(new FlowLayout ());

add(new Label("Hello AWT"));

Button b = new Button("Close");

b.addActionListener(this);

Page 304: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .1 . INT RO D UCE RE 303

add(b);

pack();

show();

}

public void actionPerformed(ActionEvent e) {

System.exit (0);

}

public static void main(String args []) {

new ExempluAWT("Hello");

}

}

L isting 11.2: A p licatia resc risa folosind S w ing

import javax.swing .*;

import java.awt .*;

import java.awt.event .*;

public class ExempluSwing extends JFrame implements

ActionListener {

public ExempluSwing(String titlu) {

super(titlu);

// Metoda setLayout nu se aplica direct ferestrei

getContentPane ().setLayout(new FlowLayout ());

// Componentele au denumiri ce incep cu litera J

// Textul poate fi si in format HTML

getContentPane ().add(new JLabel(

"<html ><u>Hello </u> <i>Swing </i></html >"));

JButton b = new JButton("Close");

b.addActionListener(this);

// Metoda add nu se aplica direct ferestrei

getContentPane ().add(b);

pack();

show();

}

public void actionPerformed(ActionEvent e) {

// Tratarea evenimentelor se face ca in AWT

System.exit (0);

}

public static void main(String args []) {

new ExempluSwing("Hello");

}

Page 305: Cristian Frasinaru-Curs Practic de Java.pdf

304 CAPIT O L UL 1 1 . SW ING

}

11.2 F olosirea ferestrelor

P entru a fi afisate p e e c ran com p onente le g rafic e ale une i ap licatii tre b uiep lasate p e o sup rafata d e afisare (container). Fie care com p onenta p oate ficontinuta d oar ıntr-un sing ur container, ad aug area e i p e o sup rafta nouad e afisare d e te rm inand e lim inarea e i d e p e v e ch iul container p e care fusesep lasata. Intruc at containere le p ot fi ıncap sulate ın alte containere , o com -p onenta v a fac e p arte la un m om ent d at d intr-o ie rarh ie . R ad ac ina ac este iie rarh ii tre b uie sa fie un asa num it co n ta in er d e n ivel ın a lt, care este re p re z en-tat d e una d in c lase le JF ram e, JD ialog sau JA pplet. Intruc at d e ap p le turine v om ocup a se p arat, v om analiza ın continuare p rim e le d oua c lase .

In g eneral oric e ap licatie J av a ind e p end enta b azata p e S w ing continec e l p utin un container d e niv e l ınalt re p re z entat d e fe reastra p rinc ip ala ap rog ram ului, instanta a c lase i JFrame.

S im p lificat, un ob ie c t care re p re z inta o fe reastra S w ing contine o zonacare este re z e rv ata b are i d e m eniuri si care este situata d e ob ie c i ın p artea sasup erioara si corp ul fe re stre i p e care v or fi p lasate com p onente le . Im ag inead e m ai jos p une ın e v id enta ac easta se p arare , v alab ila d e altfe l p entru oric econtainer d e niv e l ınalt:

Corp ul fe restre i e ste o instanta a c lase i Container c e p oate fi ob tinuta cum etod a g etContentP ane. P lasarea si aranjarea com p onente lor p e sup rafata

Page 306: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .2 . F O L O SIRE A F E RE ST RE L O R 305

ferestre i se v a fac e d e c i folosind ob ie c tul d e tip Container si nu d ire c t fe reas-tra. A sad ar, d e si e ste d e riv ata d in Frame, c lasa JFrame e ste folosita ıntr-unm od d ife rit fata d e p arinte le sau:

Frame f = new Frame();

f.setLayout(new FlowLayout());

f.add(new Button("OK"));

JFrame jf = new JFrame();

jf.getContentPane().setLayout(new FlowLayout());

jf.getContentPane().add(new JButton("OK"));

S p re d eose b ire d e Frame, un ob ie c t JFrame are un com p ortam ent im p lic itla ınch id e rea ferestre i care consta ın ascund erea ferestre i atunc i c and utiliza-torul ap asa b utonul d e ınch id e re . A c e st com p ortam ent p oate fi m od ificatp rin ap e larea m etod e i setD efaultCloseO peration care p rim e ste ca arg u-m ent d iv e rse constante c e se g ase sc fie ın c lasa WindowConstants, fie ch iarın JFrame.

jf.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

jf.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

A d aug area une i b are d e m eniuri se realiz eaz a cu m etod a setJM enuB ar,care p rim e ste o instanta d e tip JMenuBar. Crearea m eniurilor este sim ilaracu m od e lul A W T .

11.2 .1 F erestre interne

D in p unctul d e v e d e re al folosirii fe re stre lor, ap licatiile p ot fi ım p artite ınd oua cate g orii:

• S D I (S in gle D ocu m en t In terfa ce)

• M D I (M u ltip le D ocu m en t In terfa ce)

P rog ram e le d in p rim a cate g orie g e stioneaz a la un m om ent d at o sing urafe reastra ın care se g ase sc com p onente le cu care interac tioneaz a utilizatorul.In a d oua cate g orie , fe reastra p rinc ip ala a ap licatie i ıng lob eaz a la rand ul e ialte fe restre , uzual cu func tionalitati sim ilare , c e p e rm it lucrul concurent p em ai m ulte p lanuri.

Page 307: Cristian Frasinaru-Curs Practic de Java.pdf

306 CAPIT O L UL 1 1 . SW ING

In S w ing , c lasa JInternalF ram e p une la d isp oz itie o m od alitate d e acrea ferestre ın cad rul altor fe restre . Ferestre le interne au ap rox im ativ ac e easiınfatisare si func tionalitate cu ferestre le d e tip JFrame, sing ura d ife renta fiindm od ul d e g e stionare a ac estora.

U zual, ob ie c te le d e tip JInternalFrame v or fi p lasate p e un containerd e tip D esk topP ane, care v a fi ap oi p lasat p e o fereastra d e tip JFrame.Folosirea c lase i DesktopPane e ste ne c e sara d eoare c e ac easta ” stie ” cum sag e stione z e fe re stre le interne , av and ın v e d e re c a ac estea se p ot sup rap une sila un m om ent d at d oar una sing ura e ste activ a.

E x e m p lul urm ator p une ın e v id enta m od e lul g eneral d e c reare si afisarea ferestre lor interne :

L isting 11.3: Folosirea ferestre lor interne

import javax.swing .*;

import java.awt .*;

class FereastraPrincipala extends JFrame {

public FereastraPrincipala(String titlu) {

super(titlu);

setSize (300, 200);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

FereastraInterna fin1 = new FereastraInterna ();

fin1.setVisible(true);

FereastraInterna fin2 = new FereastraInterna ();

fin2.setVisible(true);

JDesktopPane desktop = new JDesktopPane ();

desktop.add(fin1);

desktop.add(fin2);

setContentPane(desktop);

fin2.moveToFront ();

}

}

class FereastraInterna extends JInternalFrame {

static int n = 0; //nr. de ferestre interne

static final int x = 30, y = 30;

public FereastraInterna () {

super("Document #" + (++n),

Page 308: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .3 . CL ASA J CO M PO NE NT 307

true , // resizable

true , // closable

true , // maximizable

true);// iconifiable

setLocation(x*n, y*n);

setSize(new Dimension (200, 100));

}

}

public class TestInternalFrame {

public static void main(String args []) {

new FereastraPrincipala("Test ferestre interne").show();

}

}

Ferestre le c reate d e ac est p rog ram v or arata ca ın fig ura d e m ai jos:

11.3 Clasa JCom ponent

JComponent e ste sup erc lasa tuturor com p onente lor S w ing , m ai p utin a c e lorcare d e sc riu containere d e niv e l ınalt JFrame, JDialog, JApplet. D eoare c eJComponent e x tind e c lasa Container, d e c i si Component, ea m ostene ste func tionalitateag enerala a containere lor si com p onente lor A W T , furniz and b ine ınte le s si o se -rie ıntreag a d e noi fac ilitati.

D intre noutatile ofe rite d e JComponent am intim :

• T oolT ipsFolosind m e tod a setToolTip p oate fi atasat une i com p onente un te x tcu e x p licatii le g ate d e com p onenta resp e c tiv a. Cand utilizatorul tre c e

Page 309: Cristian Frasinaru-Curs Practic de Java.pdf

308 CAPIT O L UL 1 1 . SW ING

cu m ouse -ul d easup ra com p onente i v a fi afisat, p entru o p erioad a d etim p , te x tul ajutator sp e c ificat.

• Ch enareOric e com p onenta S w ing p oate av ea unul sau m ai m ulte ch enare . S p e c i-ficarea unui ch enar se realiz eaz a cu m etod a setBorder.

• S uport pentru plasare si dim ensionareFolosind m e tod e le setPreferredSize, setMinimumSize, setMaximumSize,

setAlignmentX, setAlignmentY p ot fi controlati p aram etrii folositid e g e stionarii d e p oz itionare p entru p lasarea si d im ensionarea autom ataa com p onente lor ın cad rul unui container.

• Controlul opacitatiiFolosind m e tod a setOpaque v om sp e c ifica d ac a o com p onenta tre b uiesau nu sa d e sene z e toti p ix e lii d in interiorul sau. Im p lic it, v aloareap rop rie tatii d e op ac itate este false, c e ea c e ınseam na c a e ste p osib ilsa nu fie d esenati unii sau ch iar toti p ix e lii, p e rm itand p ix e lilor d e subcom p onenta sa ram ana v iz ib ili (com p onenta nu este op ac a). V aloareap rop rie tatii p entru c lase le d e riv ate d in J Com p onent d e p ind e ın g enerald e L ook -and -Fee l-ul folosit.

• A socierea de actiuni tastelorP entru com p onente le S w ing e x ista p osib ilitatea d e sp e c ifica anum iteac tiuni care sa se e x e cute atunc i c and utilizatorul ap asa o anum itacom b inatie d e taste si com p onenta resp e c tiv a e ste activ a (are focus-ul). A c easta fac ilitate sim p lific a v arianta initiala d e lucru, si anum etratarea e v enim ente lor d e tip KeyEvent p rintr-un ob ie c t KeyListener.

• D oub le-B uff eringT e h nica d e d oub le -b uff ering , care im p lic a d e senarea com p onente i ınm e m orie si ap oi transferul ıntre g ului d e sen p e e c ran, este im p le m entataautom at d e com p onente le S w ing , sp re d eose b ire d e c e le A W T und etre b uia realizata m anual d ac a e ra cazul.

E x e m p lul urm ator ilustreaz a m od ul d e folosire a c atorv a d intre fac ilitatileam intite m ai sus:

L isting 11.4: Fac ilitati ofe rite d e c lasa JComponent

Page 310: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .3 . CL ASA J CO M PO NE NT 309

import javax.swing .*;

import javax.swing.border .*;

import java.awt .*;

import java.awt.event .*;

class Fereastra extends JFrame {

public Fereastra(String titlu) {

super(titlu);

getContentPane ().setLayout(new FlowLayout ());

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Folosirea chenarelor

Border lowered , raised;

TitledBorder title;

lowered = BorderFactory.createLoweredBevelBorder ();

raised = BorderFactory.createRaisedBevelBorder ();

title = BorderFactory.createTitledBorder("Borders");

final JPanel panel = new JPanel ();

panel.setPreferredSize(new Dimension (400 ,200));

panel.setBackground(Color.blue);

panel.setBorder(title);

getContentPane ().add(panel);

JLabel label1 = new JLabel("Lowered");

label1.setBorder(lowered);

panel.add(label1);

JLabel label2 = new JLabel("Raised");

label2.setBorder(raised);

panel.add(label2);

// Controlul opacitatii

JButton btn1 = new JButton("Opaque");

btn1.setOpaque(true); // implicit

panel.add(btn1);

JButton btn2 = new JButton("Transparent");

btn2.setOpaque(false);

panel.add(btn2);

// ToolTips

label1.setToolTipText("Eticheta coborata");

label2.setToolTipText("Eticheta ridicata");

Page 311: Cristian Frasinaru-Curs Practic de Java.pdf

310 CAPIT O L UL 1 1 . SW ING

btn1.setToolTipText("Buton opac");

// Textul poate fi HTML

btn2.setToolTipText("<html ><b>Apasati <font color=red >F2

</font > " +

"cand butonul are <u>focusul </u>");

// Asocierea unor actiuni (KeyBindings)

/* Apasarea tastei F2 cand focusul este pe butonul al

doilea

va determina schimbarea culorii panelului */

btn2.getInputMap ().put(KeyStroke.getKeyStroke("F2"),

"schimbaCuloare");

btn2.getActionMap ().put("schimbaCuloare", new

AbstractAction () {

private Color color = Color.red;

public void actionPerformed(ActionEvent e) {

panel.setBackground(color);

color = (color == Color.red ? Color.blue : Color.red)

;

}

});

pack();

}

}

public class TestJComponent {

public static void main(String args []) {

new Fereastra("Facilitati JComponent").show();

}

}

11.4 A rh itectura m odelului S w ing

11.5 F olosirea m odelelor

M od e lul S w ing este b azat p e o arh ite c tura ase m anatoare cu M V C (m od el-view -co n tro ller). A rh ite c tura M V C sp e c ific a d e scom p unerea une i ap licatiiv izuale ın tre i p arti se p arate :

• M od elu l - care v a re p re z enta d ate le ap licatie i.

Page 312: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .5 . F O L O SIRE A M O D E L E L O R 311

• P rezen ta rea - m od ul d e re p re z entare v izuala a d ate lor.

• C o n tro lu l - transform area ac tiunilor utilizatorului asup ra com p onen-te lor v izuale ın e v enim ente care sa actualiz e z e autom at m od e lul ac es-tora (d ate le ).

D in m otiv e p ractic e , ın S w ing p artile d e p re z entare si control au fost cu-p late d eoare c e e x ista o le g atura p rea stransa ıntre e le p entru a fi conce p uteca entitati se p arate . A sad ar, arh ite c tura S w ing este d e fap t o arh ite c turacu m od el sepa ra bil, ın care d ate le com p onente lor (m od e lul) sunt se p arate d ere p re z entarea lor v izuala. A c easta ab ord are e ste log ic a si d in p ersp e c tiv afap tului c a, ın g eneral, m od ul d e conce p e re a une i ap licatii tre b uie sa fie ori-entat asup ra re p re z entarii si m anip ularii inform atiilor si nu asup ra interfe te ig rafice cu utilizatorul.

P entru a realiza se p ararea m od e lului d e p re z entare , fie c arui ob ie c t core -sp unz ator une i c lase c e d e sc rie o com p onenta S w ing ıi e ste asoc iat un ob ie c tcare g e stioneaz a d ate le sale si care im p le m enteaz a o interfata care re p re z intam od e lul com p onente i re sp e c tiv e . D up a cum se ob serv a d in tab e lul d e m aijos, com p onente cu re p re z entari d ife rite p ot av ea ac e lasi tip d e m od e l, d are x ista si com p onente care au asoc iate m ai m ulte m od e le :

M odel Com ponentaButtonModel JButton, JToggleButton, JCheckBox,

JRadioButton, JMenu, JMenuItem,

JCheckBoxMenuItem, JRadioButtomMenuItem

JComboBox ComboBoxModel

BoundedRangeModel JProgressBar, JScrollBarm, JSlider

JTabbedPane SingleSelectionModel

ListModel JList

ListSelectionModel JList

JTable TableModel

JTable TableColumnModel

JTree TreeModel

JTree TreeSelectionModel

Document JEditorPane, JTextPane, JTextArea,

JTextField, JPasswordField

Fie care com p onenta are un m od e l initial im p lic it, ınsa are p osib ilitatead e a-l ınlocui cu unul nou atunc i c and este cazul. M e tod e le care ac c e seaz a

Page 313: Cristian Frasinaru-Curs Practic de Java.pdf

312 CAPIT O L UL 1 1 . SW ING

m od e lul unui ob ie c t sunt: setM odel, re sp e c tiv g etM odel, cu arg um entesp e c ific e fie c are i com p onente ın p arte . Crearea une i c lase care sa re p re z inteun m od e l se v a fac e e x tinz and interfata coresp unz atoare si im p le m entandm e tod e le d efinite d e ac easta sau ex tinz and c lasa im p lic ita ofe rita d e A P I-ulS w ing si sup rad efinind m e tod e le care ne intereseaz a. P entru m od e le le m aicom p le x e , cum ar fi c e le asoc iate c lase lor JTable, JTree sau JList e x istac lase ab stracte care im p le m enteaz a interfata c e d e sc rie m od e lul resp e c tiv D ee x e m p lu, interfata m od e l a c lase i JList e ste ListModel care este im p le -m entata d e c lase le DefaultListModel si AbstractListModel. In func tied e ne c e sitati, oricare d in ac este c lase p oate fi e x tinsa p entru a crea un noum od e l.

L isting 11.5: Folosirea m ai m ultor m od e le p entru o com p onenta

import javax.swing .*;

import javax.swing.border .*;

import java.awt .*;

import java.awt.event .*;

class Fereastra extends JFrame implements ActionListener {

String data1 [] = {"rosu", "galben", "albastru"};

String data2 [] = {"red", "yellow", "blue"};

int tipModel = 1;

JList lst;

ListModel model1 , model2;

public Fereastra(String titlu) {

super(titlu);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Lista initiala nu are nici un model

lst = new JList();

getContentPane ().add(lst , BorderLayout.CENTER);

// La apasara butonului schimbam modelul

JButton btn = new JButton("Schimba modelul");

getContentPane ().add(btn , BorderLayout.SOUTH);

btn.addActionListener(this);

// Cream obiectele corespunzatoare celor doua modele

model1 = new Model1 ();

model2 = new Model2 ();

lst.setModel(model1);

Page 314: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .5 . F O L O SIRE A M O D E L E L O R 313

pack();

}

public void actionPerformed(ActionEvent e) {

if (tipModel == 1) {

lst.setModel(model2);

tipModel = 2;

}

else {

lst.setModel(model1);

tipModel = 1;

}

}

// Clasele corespunzatoare celor doua modele

class Model1 extends AbstractListModel {

public int getSize () {

return data1.length;

}

public Object getElementAt(int index) {

return data1[index];

}

}

class Model2 extends AbstractListModel {

public int getSize () {

return data2.length;

}

public Object getElementAt(int index) {

return data2[index];

}

}

}

public class TestModel {

public static void main(String args []) {

new Fereastra("Test Model").show();

}

}

M ulte com p onente S w ing furniz eaz a m e tod e care sa ob tina starea ob ie c -tului fara a m ai fi nev oie sa ob tine m instanta m od e lului si sa ap e lam m e tod e le

Page 315: Cristian Frasinaru-Curs Practic de Java.pdf

314 CAPIT O L UL 1 1 . SW ING

aceste ia. U n e x e m p lu este m e tod a getValue a clase i JSlider care este d efap t un ap e l d e g enul getModel().getValue(). In m ulte situatii ınsa, m aiales p entru c lase cum ar fi JTable sau JTree, folosirea m od e le lor ad uc e fl e x -ib ilitate sp orita p rog ram ului si e ste re com and ata utilizarea lor.

11.5 .1 T ratarea evenim entelor

M od e le le com p onente lor tre b uie sa notific e ap aritia unor sch im b ari ale d ate lorg estionate astfe l ınc at sa p oata fi reactualizata p re z entarea lor sau sa fie e x -e cutat un anum ti cod ın cad rul unui ob ie c t d e tip listen er. In S w ing , ac eastanotificare e ste realizata ın d oua m od uri:

1. Inform ativ (lig h tw eig h t) - M od e le le trim it un ev enim ent p rin caresunt inform ati ascultatorii c a a surv enit o anum ita sch im b are a d ate lor, faraa inc lud e ın e v enim ent d etalii le g ate d e sch im b area surv enita. Ob ie c te led e tip listener v or tre b ui sa ap e le z e m e tod e sp e c ific e com p onente lor p en-tru a afl a ce a n u m e s-a sch im b at. A c e st lucru se realiz eaz a p rin inte fataCh ang eL istener iar e v enim ente le sunt d e tip Ch ang eE vent, m od e le lecare sup orta ac easta ab ord are fiind BoundedRangeModel, ButtonModel siSingleSelectionModel.

Model L isten er T ip E v en im en t

BoundedRangeModel C h angeL istener C h angeE v ent

ButtonModel C h angeL istener C h angeE v ent

S ingleS elec tionModelModel C h angeL istener C h angeE v ent

Interfata ChangeListener are o sing ura m e tod a:

public void stateChanged(ChangeEvent e),

sing ura inform atie continuta ın e v enim ent fiind com p onenta sursa.Inre g istrarea si e lim inarea ob ie c te lor d e tip listener se realiz eaz a cu m e tod e le

addChangeListener, re sp e c tiv removeChangeListener.

JSlider slider = new JSlider();

BoundedRangeModel model = slider.getModel();

model.addChangeListener(new ChangeListener() {

public void stateChanged(ChangeEvent e) {

// Sursa este de tip BoundedRangeModel

BoundedRangeModel m = (BoundedRangeModel)e.getSource();

// Trebuie sa interogam sursa asupra schimbarii

Page 316: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .5 . F O L O SIRE A M O D E L E L O R 315

System.out.println("Schimbare model: " + m.getValue());

}

});

P entru usurinta p rog ram arii, p entru a nu lucra d ire c t cu instanta m od e lu-lui, une le c lase p e rm it ınre g istrarea ascultatorilor d ire c t p entru com p onentaın sine , sing ura d ife renta fata d e v arianta anterioara constand ın fap tul c asursa e v enim entului este acum d e tip ul com p onente i si nu d e tip ul m od e lului.S e c v enta d e cod d e m ai sus p oate fi resc risa astfe l:

JSlider slider = new JSlider();

slider.addChangeListener(new ChangeListener() {

public void stateChanged(ChangeEvent e) {

// Sursa este de tip JSlider

JSlider s = (JSlider)e.getSource();

System.out.println("Valoare noua: " + s.getValue());

}

});

2 . Consistent(statefull) - M od e le p un la d isp oz itie interfe te sp e c ial-izate si tip uri d e e v enim ente sp e c ific e c e inc lud toate inform atiile le g ate d esch im b area d ate lor.

Model L isten er T ip E v en im en t

L istModel L istD ataL istener L istD ataE v ent

L istS elec tionModel L istS elec tionL istener L istS elec tionE v ent

C om b oBox Model L istD ataL istener L istD ataE v ent

T reeModel T reeModelL istener T reeModelE v ent

T reeS elec tionModel T reeS elec tionL istener T reeS elec tionE v ent

T ab leModel T ab leModelL istener T ab leModelE v ent

T ab leC olum nModel T ab leC olum nModelL istener T ab leC olum nModelE v ent

D ocum ent D ocum entL istener D ocum entE v ent

D ocum ent U ndoab leE ditL istener U ndoab leE ditE v ent

Folosirea ac estor interfe te nu d ife ra cu nim ic d e cazul g eneral:

String culori[] = {"rosu", "galben", "albastru");

JList list = new JList(culori);

ListSelectionModel sModel = list.getSelectionModel();

sModel.addListSelectionListener(

Page 317: Cristian Frasinaru-Curs Practic de Java.pdf

316 CAPIT O L UL 1 1 . SW ING

new ListSelectionListener() {

public void valueChanged(ListSelectionEvent e) {

// Schimbarea este continuta in eveniment

if (!e.getValueIsAdjusting()) {

System.out.println("Selectie curenta: " +

e.getFirstIndex());

}

}

});

11.6 F olosirea com ponentelor

D atorita com p le x itatii m od e lului S w ing , ın ac easta se c ttiune nu v om ınc ercao ab ord are e x h austiv a a m od ului d e utilizare a tuturor com p onente lor, c i v omp une ın e v id enta d oar asp e c te le sp e c ific e ac estui m od e l, sub liniind d ife rente lesi ım b unatatirile fata A W T .

11.6 .1 Com ponente atom ice

In cate g oria com p onente lor atom ic e inc lud e m com p onente le S w ing cu func tionalitatesim p la, a c aror folosire e ste ın g eneral ase m anatoare cu a e ch iv alente lor d inA W T . A ic i inc lud e m :

• E tich e te : JLabel

• B utoane sim p le sau cu d oua stari: JButton, JCheckBox, JRadioButton,

JToggleButton; m ai m ulte b utoane rad io p ot fi g rup ate folosind c lasaButtonGroup, p entru a p erm ite se le c tarea d oar a unuia d intre e le .

• Com p onente p entru p rog res si d e rulare : JSlider, JProgressBar, JScrollBar

• S e p aratori: JSeparator

D eoare c e utilizarea ac estora este ın g eneral fac ila, nu v om analiza ın p arteac este com p onente .

11.6 .2 Com ponente pentru editare de tex t

Com p onente le S w ing p entru afisarea si e d itarea te x te lor sunt g rup ate ıntr-oie rarh ie c e are ca rad ac ina c lasa JT ex tCom ponent d in p ach e tul javax.swing.text.

Page 318: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 317

D up a cum se ob serv a d in im ag inea d e m ai sus, c lase le p ot ım p artite ıntre i cate g orii, coresp unz atoare tip ului te x tului e d itat:

• T e x t sim p lu p e o sing ura linie

– JT ex tF ield - P e rm ite e d itarea unui te x t sim p lu, p e o sing uralinie .

– JP assw ordF ield - P e rm ite e d itarea d e p arole . T e x tul ac estorav a fi ascuns, ın locul caractere lor introd use fiind afisat un caractersim b olic , cum ar fi ’* ’.

– JF orm attedT ex tF ield - P e rm ite introd uc erea unui te x t care sare sp e c te un anum it form at, fiind foarte utila p entru c itirea d enum ere , d ate calend aristic e , e tc . E ste folosita ım p reuna cu c laseutilitare p entru form atarea te x te lor, cum ar fi NumberFormatter,DateFormatter, MaskFormatter, e tc . V aloarea continuta d e oastfe l d e com p onenta v a fi ob tinuta/ se tata cu m etod e le g etV alue,re sp e c tiv setV alue si nu cu c e le uzuale getText, setText.

• T e x t sim p lu p e m ai m ulte linii

– JT ex tA rea - P e rm ite e d itarea unui te x t sim p lu, p e m ai m ultelinii. Oric e atrib ut le g at d e stil, cum ar fi culoarea sau fontul, seap lic a ıntre g ului te x t si nu p oate fi sp e c ificat d oar une i anum itep ortiuni. U zual, o com p onenta d e ac est tip v a fi inc lusa ıntr-uncontainer JScrollPane, p entru a p erm ite nav ig area p e v e rticala

Page 319: Cristian Frasinaru-Curs Practic de Java.pdf

318 CAPIT O L UL 1 1 . SW ING

si orizontala d ac a te x tul introd us nu ıncap e ın sup rafata alocataob ie c tului. A c e st lucru este v alab il p entru toate com p onente leS w ing p entru care are sens notiunea d e nav ig are p e orizontalasau v erticala, nic i una neoferind sup ort intrinse c p entru aceastaop e ratiune .

• T e x t cu stil ım b og atit p e m ai m ulte linii

– JE ditorP ane - P e rm ite afisarea si e d itarea d e te x te sc rise cu stil-uri m ultip le si care p ot inc lud e im ag ini sau ch iar d iv e rse alet com -p onente . Im p lic it, urm atoare le tip uri d e te x te sunt re cunoscute :tex t/ plain, tex t/ h tm l si tex t/ rtf. U na d in utiliz arile c e le m aisim p le ale ac este i c lase este setarea d ocum entului c e v a fi afisatcu m etod a setP ag e, c e p rim e ste ca arg um ent un U R L care p oatere fe ri un fisie r te x t, H T M L sau R T F.

– JT ex tP ane - A c easta c lasa e x tind e JEditorPane, ofe rind d iv e rsefac ilitati sup lim entare p entru lucrul cu stiluri si p arag rafe .

Clasa JTextComponent ınc earc a sa p astre z e c at m ai m ulte sim ilitud ini cuc lasa TextComponent d in A W T , ınsa e x ista d ife rente notab ile ıntre c e le d oua,com p onenta S w ing av and caracteristic i m ult m ai com p le x e cum ar fi sup ortp entru op eratii d e u n d o si red o , tratarea e v enim ente lor g enerate d e cursor(caret), e tc . Oric e ob ie c t d e riv at d in JTextComponent e ste form at d in:

• U n m odel, re fe rit sub d enum irea d e d ocu m en t, care g e stioneaz a stareacom p onente i. O re fe rinta la m od e l p oate fi ob tinuta cu m etod a getDocument,c e re turneaz a un ob ie c t d e tip Document.

• O reprezentare, care este resp onsab ila cu afisarea te x tului.

• U n ’controller’, cunoscut sub num e le d e ed ito r kit care p e rm ite sc rie reasi c itirea te x tului si care p e rm ite d efinirea d e ac tiuni ne c esare e d itarii.

E x ista d ife rent fata d e A W T si la niv e lul tratarii e v enim ente lor g enerated e com p onente le p entru e d itarea d e te x te . D intre e v enim ente le c e p ot fig enerate am intim :

• A ctionE vent - Com p onente le d e riv ate d in JTextField v or g enera unev enim ent d e ac est tip la ap asarea taste i E nter ın c asuta d e e d itare ate x tului. Interfata care tre b uie im p le m entata e ste A ctionL istener.

Page 320: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 319

• CaretE vent - E ste e v enim entul g enerat la d e p lasarea cursorului c e g e s-tioneaz a p oz itia curenta ın te x t. Interfata coresp unz atoare CaretL is-tener contine o sing ura m e tod a: caretUpdate c e v a fi ap e lata ori d ec ate ori ap are o sch im b are .

• D ocum entE vent - E v enim ente le d e ac e st tip sunt g enerate la oric esch im b are a te x tului, sursa lor fiind d ocum entul (m od e lul) com p onen-te i si nu com p onenta ın sine . Interfata coresp unz atoare este D ocu-m entL istener, c e contine m e tod e le :

– insertUpdate - ap e lata la ad aug area d e noi caractere ;

– removeUpdate - ap e lata d up a o op eratiune d e ste rg e re ;

– changedUpdate - ap e lata la sch im b area unor atrib ute le g ate d estilul te x tului.

• P roperty Ch ang eE vent - E ste un ev enim ent com un tuturor com -p onente lor d e tip J av aB ean, fiind g enerat la oric e sch im b are a une ip rop rie tati a com p onente i. Interfata coresp unz atoare este P roperty -Ch ang eL istener, c e contine m e tod a propertyChange.

11.6 .3 Com ponente pentru selectarea unor elem ente

In ac easta cate g orie v om inc lud e c lase le care p e rm it se le c tarea unor v alori(e le m ente) d intr-o serie p re stab ilita. A c e stea sunt: JL ist, JCom b oB ox siJS pinner.

Clasa JL istClasa JList d e sc rie o lista d e e le m ente d isp use p e una sau m ai m ulte coloane ,d in care utilizatorul p oate se le c ta unul sau m ai m ulte . U zual un ob ie c t d eac est tip v a fi inc lus ıntr-un container d e tip JScrollPane.

Page 321: Cristian Frasinaru-Curs Practic de Java.pdf

320 CAPIT O L UL 1 1 . SW ING

Initializarea une i liste se realiz eaz a ın m ai m ulte m od alitati:

• Folosind unul d in constructorii care p rim e sc ca arg um ent un v e ctor d ee le m ente .

Object elemente[] = {"Unu", "Doi", new Integer(3), new Double(4)};

JList lista = new JList(elemente);

• Folosind constructorul fara arg um ente si ad aug and ap oi e le m ente m od -e lului im p lic it liste i:

DefaultListModel model = new DefaultListModel();

model.addElement("Unu");

model.addElement("Doi");

model.addElement(new Integer(3));

model.addElement(new Double(4));

JList lista = new JList(model);

• Folosind un m od e l p rop riu, resp onsab il cu furnizarea e le m ente lor lis-te i. A c e sta este un ob ie c t d intr-o c lasa c e tre b uie sa im p le m ente z einterfata L istM odel, uzual fiind folosita e x tind erea c lase i p re d efiniteA b stractL istM odel si sup rad efinirea m e tod e lor: getElementAt carefurniz eaz a e le m entul d e p e o anum ita p ositie d in lista, re sp e c tiv getSize

care tre b uie sa re turne z e num arul total d e e le m ente d in lista. E v id ent,ac easta v arianta e ste m ai com p le x a, ofe rind fl e x ib ilitate sp orita ın lu-crul cu liste .

ModelLista model = new ModelLista();

JList lista = new JList(model);

Page 322: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 321

...

class ModelLista extends AbstractListModel {

Object elemente[] = {"Unu", "Doi", new Integer(3), new Double(4)};

public int getSize() {

return elemente.length;

}

public Object getElementAt(int index) {

return elemente[index];

}

}

G e stiunea articole lor se le c tate d intr-o lista se realiz eaz a p rin interm e d iulunui m od e l, ac esta fiind un ob ie c t d e tip L istS electionM odel. Ob ie c te le d etip JList g enereaz a e v enim ente d e tip L istS electionE vent, interfata core -sp unz atoare fiind L istS electionL istener c e contine m e tod a valueCh ang edap e lata ori d e c ate ori v a fi sch im b ata se le c tia e le m ente lor d in lista.

class Test implements ListSelectionListener {

...

public Test() {

...

// Stabilim modul de selectie

list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

/* sau SINGLE_INTERVAL_SELECTION

MULTIPLE_INTERVAL_SELECTION

*/

// Adaugam un ascultator

ListSelectionModel model = list.getSelectionModel();

model.addListSelectionListener(this);

...

}

public void valueChanged(ListSelectionEvent e) {

if (e.getValueIsAdjusting()) return;

int index = list.getSelectedIndex();

Page 323: Cristian Frasinaru-Curs Practic de Java.pdf

322 CAPIT O L UL 1 1 . SW ING

...

}

}

E v id ent, c lasa ofera m e tod e p entru se le c tarea unor e le m ente d in cad rulp rog ram ului setSelectedIndex, setSelectedIndices, etc. si p entru ob tinereac e lor se le c tate la un m om ent d at getSelectedIndex, getSelectedIndices,

etc..

O fac ilitate e x tre m d e im p ortanta p e care o au liste le e ste p osib ilitatea d ea stab ili un ren d erer p entru fiecare articol ın p arte . Im p lic it toate e le m ente leliste i sunt afisate ın ac e lasi fe l, ınsa ac e st lucru p oate fi sch im b at p rin creareaune i c lase c e im p le m enteaz a interfata L istCellR enderer si p e rsonaliz eaz are p re z entarea e le m ente lor liste i ın func tie d e d iv e rsi p aram etri. InterfataListCellRenderer contine o sing ura m e tod a g etL istCellR endererCom -ponent c e re turneaz a un ob ie c t d e tip Component. M e tod a v a fi ap e lata ınp arte p entru re p re z entarea fiec arui e le m ent al liste i.

class MyCellRenderer extends JLabel implements ListCellRenderer {

public MyCellRenderer() {

setOpaque(true);

}

public Component getListCellRendererComponent(

JList list, Object value, int index,

boolean isSelected, boolean cellHasFocus) {

setText(value.toString());

setBackground(isSelected ? Color.red : Color.white);

setForeground(isSelected ? Color.white : Color.black);

return this;

}

}

S e tarea unui anum it ren d erer p entru o lista se realiz eaz a cu m etod a setCell-R enderer.

Clasa JCom b oB oxClasa JComboBox e ste sim ilara cu JList, cu d eose b irea c a p e rm ite d oar se -le c tarea unui sing ur articol, ac esta fiind si sing urul p e rm anent v iz ib il. L ista

Page 324: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 323

ce lorlalte e le m ente este afisata d oar la ap asarea unui b uton m arcat cu osag eata, c e fac e p arte inte g ranta d in com p onenta.

JComboBox func tioneaz a d up a ac e leasi p rinc ip ii ca si c lasa JList.Initializarea se fac e d intr-un v e ctor sau folosind un m od e l d e tip ul Com -b oB ox M odel, fie care e le m ent p utand fi d e ase m enea re p re z entat d ife rit p rininterm e d iul unui ob ie c t c e im p le m enteaz a ac e easi inte fata ca si ın cazul lis-te lor: L istCellR enderer.

O d ife renta notab ila consta ın m od ul d e se le c tare a unui articol, d eoare c eJComboBox p e rm ite si e d itarea e x p lic ita a v alorii e le m entului, ac est lucru fiindcontrolat d e m e tod a setEditable.

E v enim ente le g enerate d e ob ie c te le JComboBox sunt d e tip ItemEvent

g enerate la nav ig area p rin lista, re sp e c tiv ActionEvent g enerate la se le c tareae fe c tiv a a unui articol.

Clasa JS pinnerClasa JSpinner ofera p osib ilitatea d e a se le c ta o anum ita v aloare (e le m ent)d intr-un d om eniu p restab ilit, lista e le m ente lor nefiind ınsa v iz ib ila. E stefolosit atunc i c and d om eniul d in care p oate fi facuta se le c tia este foarte m aresau ch iar ne m arg init; d e e x e m p lu: num ere intre g i intre 1950 si 2050. Com -p onenta contine d oua b utoane cu care p oate fi se le c tat urm atorul, resp e c tivp re d e c e sorul e le m ent d in d om eniu.

JSpiner se b az eaz a e x c lusiv p e folosirea unui m od e l. A c e sta este unob ie c t d e tip S pinnerM odel, e x istand o serie d e c lase p re d efinite c e im p le -m enteaz a ac easta interfata cum ar fi SpinnerListModel, SpinnerNumberModelsau SpinnerDateModel c e p ot fi utilizate .

Page 325: Cristian Frasinaru-Curs Practic de Java.pdf

324 CAPIT O L UL 1 1 . SW ING

Com p onente le d e ac est tip p e rm it si sp e c ificarea unui anum it tip d ee d itor p entru v alorile e le m ente lor sale . A c e sta este instalat autom at p en-tru fiecare d in m od e le le stand ard am intite m ai sus, fiind re p re z entat d euna d in c lase le JSpinner.ListEditor, JSpinner.NumberEditor, re sp e c tivJSpinner.DateEditor, toate d e riv ate d in JSpinner.DefaultEditor. Fie cared in e d itoare le am intite p e rm ite d iv e rse form atari sp e c ific e .

E v enim ente le g enerate d e ob ie c te le d e tip JSpinner sunt d e tip ChangeEvent,g enerate la sch im b area starii com p onente i.

11.6 .4 T ab ele

Clasa JT ab le p e rm ite c rearea d e com p onente care sa afise z e o serie d e e le -m ente ıntr-un form at tab e lar, articole le fiind d isp use p e linii si coloane . U ntab e l p oate fi folosit d oar p entru afisarea form atata a unor d ate , d ar estep osib ila si e d itarea inform atie i d in c e lule le sale . D e ase m enea, liniile tab e lu-lui p ot fi m arcate ca se le c tate , tip ul se le c tie i fiind sim p lu sau com p us, tab e le lee x tinz and astfe l func tionalitatea liste lor.

D e si c lasa JTable se g ase ste ın p ach e tul javax.swing, o serie d e c lase siinterfe te ne c e sare lucrului cu tab e le se g ase sc ın p ach e tul javax .sw ing .tab le,ac e sta tre b uind asad ar im p ortat.

Initializarea unui tab e l p oate fi facuta ın m ai m ulte m od uri.Cea m ai sim p la v arianta e ste sa folosim unul d in constructorii care p rim e scca arg um ente e le m ente le tab e lului sub form a une i m atric i sau a une i cole c tiid e tip Vector si d enum irile cap urilor d e coloana:

String[] coloane = {"Nume", "Varsta", "Student"};

Object[][] elemente = {

{"Ionescu", new Integer(20), Boolean.TRUE},

{"Popescu", new Integer(80), Boolean.FALSE}};

JTable tabel = new JTable(elemente, coloane);

D up a cum se ob se rv a, tip ul d e d ate al e le m ente lor d e p e o coloana ested e tip re fe rinta si p oate fi oricare . In cazul ın care c e lule le tab e lului sunt

Page 326: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 325

ed itab ile tre b uie sa e x iste un ed itor p otriv it p entru tip ul e le m entului d inc e lula resp e c tiv a. D in m otiv e d e efic ienta, im p le m entarea ac este i c lase esteorientata la niv e l d e coloana, c e ea c e ınseam na c a articole d e p e o coloanav or fi re p re z entate la fe l si v or av ea ac e lasi tip d e e d itor.

A d oua v arianta d e c reare a unui tab e l e ste p rin im p le m entarea m od e lu-lui ac estuia ıntr-o c lasa se p arata si folosirea constructorului coresp unz ator.Interfata care d e sc rie m od e lul c lase i JTable e ste T ab leM odel si continem e tod e le care v or fi interog ate p entru ob tinerea inform atie i d in tab e l. U zual,c rearea unui m od e l se fac e p rin e x tind erea c lase i p re d efinite A b stractT ab le-M odel, care im p le m enteaz a d e ja TableModel. T ot c e ea c e tre b uie sa fac e me ste sa sup rad efinim m e tod e le care ne intereseaz a, c e le m ai utilizate fiind(p rim e le tre i tre b uie ob lig atoriu sup rad efinite , e le fiind d e c larate ab stracte ınc lasa d e b az a):

• g etR ow Count - re turneaz a num arul d e linii ale tab e lului;

• g etColum nCount - re turneaz a num arul d e coloane ale tab e lului;

• g etV alueA t - re turneaz a e le m entul d e la o anum ita linie si coloana;

• g etColum nN am e - re turneaz a d enum irea fiec are i coloane ;

• isCellE ditab le - sp e c ific a d ac a o anum ita c e lula este e d itab ila.

M od e lul m ai contine si m e tod a setV alueA t care p oate fi folosita p entrusetarea e x p lic ita a v alorii une i c e lule .

ModelTabel model = new ModelTabel();

JTable tabel = new JTable(model);

...

class ModelTabel extends AbstractTableModel {

String[] coloane = {"Nume", "Varsta", "Student"};

Object[][] elemente = {

{"Ionescu", new Integer(20), Boolean.TRUE},

{"Popescu", new Integer(80), Boolean.FALSE}};

public int getColumnCount() {

return coloane.length;

}

public int getRowCount() {

Page 327: Cristian Frasinaru-Curs Practic de Java.pdf

326 CAPIT O L UL 1 1 . SW ING

return elemente.length;

}

public Object getValueAt(int row, int col) {

return elemente[row][col];

}

public String getColumnName(int col) {

return coloane[col];

}

public boolean isCellEditable(int row, int col) {

// Doar numele este editabil

return (col == 0);

}

}

Oric e sch im b are a d ate lor tab e lului v a g enera un ev enim ent d e tip T ab le-M odelE vent. P entru a trata ac este e v enim ente v a tre b ui sa im p le m entaminterfata T ab leM odelL istener c e contine m e tod a tab leCh ang ed. Inre g -istrarea unui listener v a fi facuta p entru m od e lul tab e lului:

public class Test implements TableModelListener {

...

public Test() {

...

tabel.getModel().addTableModelListener(this);

...

}

public void tableChanged(TableModelEvent e) {

// Aflam celula care a fost modificata

int row = e.getFirstRow();

int col = e.getColumn();

TableModel model = (TableModel)e.getSource();

Object data = model.getValueAt(row, col);

...

}

}

Page 328: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 327

T ab e le ofe ra p osib ilitatea d e a se le c ta una sau m ai m ulte linii, nu neap aratconse cutiv e , g e stiunea liniilor se le c tate fiind realizata p rin interm e d iul unuim od e l. A c e sta este o instanta c e im p le m enteaz a, ıntoc m ai ca la liste , interfataL istS electionM odel. T ratarea e v enim ente lor g enerate d e sch im b area se le c tie iın tab e l se realiz eaz a p rin ınre g istrarea unui ascultator d e tip L istS election-L istener:

class Test implements ListSelectionListener {

...

public Test() {

...

// Stabilim modul de selectie

tabel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

// Adaugam un ascultator

ListSelectionModel model = tabel.getSelectionModel();

model.addListSelectionListener(this);

...

}

public void valueChanged(ListSelectionEvent e) {

if (e.getValueIsAdjusting()) return;

ListSelectionModel model =

(ListSelectionModel)e.getSource();

if (model.isSelectionEmpty()) {

// Nu este nici o linie selectata

...

} else {

int index = model.getMinSelectionIndex();

// Linia cu numarul index este prima selectata

...

}

}

}

D up a cum am sp us, c e lule une i coloane v or fi re p re z entare la fe l, fie carecoloana av and asoc iat un ob ie c t ren d erer resp onsab il cu crearea com p onen-

Page 329: Cristian Frasinaru-Curs Practic de Java.pdf

328 CAPIT O L UL 1 1 . SW ING

te i c e d e sc rie c e lule le sale . U n astfe l d e ob ie c t im p le m enteaz a interfataT ab leCellR enderer, care are o sing ura m e tod a g etT ab leCellR ender-erCom ponent, ac easta fiind resp onsab ila cu crearea com p onente lor c e v orfi afisate ın c e lule le une i coloane . Im p lic it, e x ista o serie d e tip uri d e d atecu re p re z entari sp e c ific e , cum ar fi: Boolean, Number, Double, Float,

Date, ImageIcon, Icon, re stul tip urilor av and o re p re z entare stand ard c econsta ıntr-o etich e ta cu re p re z entarea ob ie c tului ca sir d e caractere . S p e c ifi-carea unui ren d erer p rop riu se realiz eaz a cu m etod a setD efaultR enderer,c e asoc iaz a un anum it tip d e d ate cu un ob ie c t d e tip TableRenderer.

public class MyRenderer extends JLabel

implements TableCellRenderer {

public Component getTableCellRendererComponent(...) {

...

return this;

}

}

O situatie sim ilara o re g asim la niv e lul e d itorului asoc iat c e lule lor d intr-oanum ita coloana. A c e sta este un ob ie c t c e im p le m enteaz a interfata T ree-CellE ditor, c e e x tind e interfata CellE ditor care g eneraliz eaz a conc e p tuld e c e lula e d itab ila p e care ıl v om m ai re g asi la arb ori. Im p lic it, e x ista oserie d e e d itoare stand ard p entru tip urile d e d ate m entionate anterior, d areste p osib ila sp e c ificarea unui e d itor p rop riu cu m etod a setD efaultE ditor.Crearea unui e d itor p rop riu se realiz eaz a c e l m ai sim p lu p rin e x tind e rea c lase iutilitare A b stractCellE ditor, care im p le m enteaz a CellEditor, p lus im p le -m entarea m etod e i sp e c ific e d in TreeCellEditor.

public class MyEditor

extends AbstractCellEditor

implements TableCellEditor {

// Singura metoda abstracta a parintelui

public Object getCellEditorValue() {

// Returneaza valoarea editata

...

}

Page 330: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 329

// Metoda definita de TableCellEditor

public Component getTableCellEditorComponent(...) {

// Returneaza componenta de tip editor

...

}

}

11.6 .5 A rb ori

Clasa JT ree p e rm ite afisarea unor e le m ente ıntr-o m aniera ie rarh ic a. Caoric e com p onenta S w ing netriv iala, un ob ie c t JTree re p re z inta d oar o im ag inea d ate lor, inform atia ın sine fiind m anip ulata p rin interm e d iul unui m od e l.L a niv e l structural, un arb ore este form at d intr-o ra d a c in a , n od u ri in tern e -care au ce l p utin un fiu si n od u ri fru n za - care nu m ai au nic i un d esc end ent.

D e si c lasa JTree se g ase ste ın p ach e tul javax.swing, o serie d e c lase siinterfe te ne c e sare lucrului cu arb ori se g ase sc ın p ach e tul javax .sw ing .tree.

Clasa care m od e leaz a notiunea d e nod al arb ore lui este D efaultM utab le-T reeN ode, ac easta fiind folosita p entru toate tip urile d e nod uri. Creareaunui arb ore p re sup une asad ar crearea unui nod (rad ac ina), instantie rea unuiob ie c t d e tip JTree cu rad ac ina creata si ad aug area ap oi d e nod uri frunz a cafii ai unor nod uri e x istente .

String text = "<html><b>Radacina</b></html>";

DefaultMutableTreeNode root = new DefaultMutableTreeNode(text);

DefaultMutableTreeNode numere =

new DefaultMutableTreeNode("Numere");

DefaultMutableTreeNode siruri =

Page 331: Cristian Frasinaru-Curs Practic de Java.pdf

330 CAPIT O L UL 1 1 . SW ING

new DefaultMutableTreeNode("Siruri");

for(int i=0; i<3; i++) {

numere.add(new DefaultMutableTreeNode(new Integer(i)));

siruri.add(new DefaultMutableTreeNode("Sirul " + i));

}

root.add(numere);

root.add(siruri);

JTree tree = new JTree(root);

D up a cum se ob serv a, nod urile arb ore lui p ot fi d e tip uri d ife rite , re p re z entarealor im p lic ita fiind ob tinutap rin ap e larea m e tod e i toString p entru ob ie c tuluicontinut. D e ase m enea, e ste p osib ila sp e c ificarea unui te x t ın form at H T M Lca v aloare a unui nod , ac esta fiind re p re z entat ca atare .

D ac a v arianta ad aug arii e x p lic ite a nod urilor nu este p otriv ita, se p oateim p le m enta o c lasa care sa d e sc rie m od e lul arb ore lui. A c easta tre b uie saim p le m ente z e inte fata T reeM odel.

S cop ul une i com p onente d e tip arb ore e ste ın g eneral se le c tarea unui nodal ie rarh ie i. Ca si ın cazul liste lor sau a tab e le lor, g e stiunea e le m ente lorse le c tate se realiz eaz a p rintr-un m od e l, ın ac easta situatie interfata core -sp unz atoare fiind T reeS electionM odel. A rb orii p e rm it ınre g istrarea unorob ie c te listen er, d e tip T reeS electionL istener, care sa trate z e e v enim ente leg enerate la sch im b area se le c tie i ın arb ore .

class Test implements TreeSelectionListener {

...

public Test() {

...

// Stabilim modul de selectie

tree.getSelectionModel().setSelectionMode(

TreeSelectionModel.SINGLE_TREE_SELECTION);

// Adaugam un ascultator

tree.addTreeSelectionListener(this);

...

}

Page 332: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 331

public void valueChanged(TreeSelectionEvent e) {

// Obtinem nodul selectat

DefaultMutableTreeNode node = (DefaultMutableTreeNode)

tree.getLastSelectedPathComponent();

if (node == null) return;

// Obtinem informatia din nod

Object nodeInfo = node.getUserObject();

...

}

}

Fie care nod al arb ore lui este re p re z entar p rin interm e d iul une i c lase ren -d erer. A c easta im p le m enteaz a interfata T reeCellR enderer, c ea folositaim p lic it fiind D efaultT reeCellR enderer. P rin im p le m entarea interfe te isau ex tind erea c lase i im p lic ite p ot fi create m od alitati d e p e rsonalizare anod urilor arb ore lui ın func tie d e tip ul sau v aloarea ac estora.

E x ista ınsa si d iv e rse m e tod e d e a sch im b a ınfatisarea unui arb ore fara sac re am noi c lase d e tip TreeCellRenderer. A c e stea sunt:

• setRootVisible - S p e c ific a d ac a rad ac ina e v iz ib ila sau nu;

• setShowsRootHandles - S p e c ific a d ac a nod urile d e p e p rim ul niv e l ausim b oluri care sa p e rm ita e x p and area sau restrang e rea lor.

• putClientProperty - S tab ile ste d iv e rse p rop rie tati, cum ar fi m od uld e re p re z entare a re latiilor (liniilor) d intre nod urile p arinte si fiu:

tree.putClientProperty("JTree.lineStyle", "Angled");

// sau "Horizontal", "None"

• S p e c ificarea une i iconite p entru nod urile frunz a sau interne :

ImageIcon leaf = createImageIcon("img/leaf.gif");

ImageIcon open = createImageIcon("img/open.gif");

ImageIcon closed = createImageIcon("img/closed.gif");

Page 333: Cristian Frasinaru-Curs Practic de Java.pdf

332 CAPIT O L UL 1 1 . SW ING

DefaultTreeCellRenderer renderer =

new DefaultTreeCellRenderer();

renderer.setLeafIcon(leaf);

renderer.setOpenIcon(open);

renderer.setClosedIcon(closed);

tree.setCellRenderer(renderer);

11.6 .6 Containere

D up a cum stim , containere le re p re z inta sup rafe t d e afisare p e care p ot fip lasate ale com p onente , e v entual ch iar alte containere . S up erc lasa com p o-nente lor d e ac est tip e ste Container, c lasa d e sp re care am m ai d iscutat ıncap itolul d e d icat m od e luli A W T .

Containere le p ot fi ım oartite ın d oua cate g orii:

1. Containere de nivel ınalt - A c e stea sunt JFrame, JDialog, JAppletsi re p re z inta rad ac inile ie rarh iilor d e com p onente ale une i ap licatii.

2. Containere interm ediare - R e p re z inta sup rafe te d e afisare cu aju-torul c arora p ot fi org anizate m ai efic ient com p onente le ap licatie i, p utandfi im b ricate . Cele m ai im p ortante c lase care d e sc riu astfe l d e containeresunt:

– JPanel

– JScrollPane

– JTabbedPane

– JSplitPane

– JLayeredPane

– JDesktopPane

– JRootPane

JP anel are ac e easi func tionalitate ca si c lasa Panel d in A W T , fiind folositp entru g rup area m ai m ultor com p onente S w ing si p lasarea lor ım p reunap e o alta sup rafata d e afisare . G e stionarul d e p oz itionare im p lic it e steFlowLayout, ac e sta p utand fi sch im b at ınsa ch iar ın m om entul construirii

Page 334: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 333

ob ie c tului JPanel sau ulterior cu m etod a setLayout. A d aug area d e com p o-nente se realiz eaz a ca p entru oric e container, folosind m e tod a add.

JPanel p = new JPanel(new BorderLayout());

/* Preferabil, deoarece nu mai este construit si

un obiect de tip FlowLayout (implicit)

*/

p.add(new JLabel("Hello"));

p.add(new JButton("OK"));

...

JS crollP ane e ste o c lasa foarte im p ortanta ın arh ite c tura m od e luluiS w ing , d eoare c e ofera sup ort p entru d erularea p e orizontala si v e rticala acom p onente lor a c aror re p re z entare com p le ta nu ıncap e ın sup rafata aso-c iata, nic i o com p onenta S w ing neoferind sup ort intrinse c p entru aceastaop e ratie .

String elemente[] = new String[100];

for(int i=0; i<100; i++)

elemente[i] = "Elementul " + i;

JList lista = new JList(elemente);

JScrollPane sp = new JScrollPane(lista);

frame.getContentPane().add(sp);

JT ab b edP ane e ste utila p entru sup rap unerea m ai m ultor containere ,uzual p anouri (ob ie c te d e tip JPanel), p e ac e lasi sp atiu d e afisare , se le c tarea

Page 335: Cristian Frasinaru-Curs Practic de Java.pdf

334 CAPIT O L UL 1 1 . SW ING

unuia sau altui p anou realiz and u-se p rin interm e d iul unor b utoane d isp usep e p artea sup erioara a com p onente i, fie care p anou av and un astfe l d e b u-ton coresp unz ator. Ca func tionalitate , ofe ra o im p le m entare ase m anatoareg e stionarului d e p oz itionare CardLayout.

JTabbedPane tabbedPane = new JTabbedPane();

ImageIcon icon = new ImageIcon("smiley.gif");

JComponent panel1 = new JPanel();

panel1.setOpaque(true);

panel1.add(new JLabel("Hello"));

tabbedPane.addTab("Tab 1", icon, panel1,

"Aici avem o eticheta");

tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

JComponent panel2 = new JPanel();

panel2.setOpaque(true);

panel2.add(new JButton("OK"));

tabbedPane.addTab("Tab 2", icon, panel2,

"Aici avem un buton");

tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);

JS plitP ane p e rm ite c rearea unui container care contine d oua com p o-nente d isp use fie una lang a c ealalta, fie una sub alta si se p ararea ac estorap rin interm e d iul une i b are care sa p e rm ita config urarea sup rafe te i alocatefie c are i com p onente .

String elem[] = {"Unu", "Doi", "Trei" };

JList list = new JList(elem);

Page 336: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 335

JPanel panel = new JPanel(new GridLayout(3, 1));

panel.add(new JButton("Adauga"));

panel.add(new JButton("Sterge"));

panel.add(new JButton("Salveaza"));

JTextArea text = new JTextArea(

"Mai multe componente separate prin\n" +

"intermediul containerelor JSplitPane");

// Separam lista de grupul celor trei butoane

JSplitPane sp1 = new JSplitPane(

JSplitPane.HORIZONTAL_SPLIT, list, panel);

// Separam containerul cu lista si butoanele

// de componenta pentru editare de text

JSplitPane sp2 = new JSplitPane(

JSplitPane.VERTICAL_SPLIT, sp1, text);

frame.getContentPane().add(sp2);

11.6 .7 D ialog uri

Clasa care d e sc rie fe re stre d e d ialog este JDialog, c rearea unui d ialog re -aliz and u-se p rin e x tind erea ac este ia, ıntoc m ai ca ın m od e lul A W T . In S w inge x ista ınsa o serie d e c lase p re d efinite c e d e sc riu anum ite tip uri d e d ialog uri,e x tre m d e utile ın m ajoritatea ap licatiilor. A c e stea sunt:

• JO ptionP ane - P e rm ite c rearea unor d ialog uri sim p le , folosite p entruafisarea unor m esaje , realizarea unor interog ari d e confirm are / renuntare ,

Page 337: Cristian Frasinaru-Curs Practic de Java.pdf

336 CAPIT O L UL 1 1 . SW ING

e tc . sau ch iar p entru introd uc erea unor v alori, c lasa fiind e x tre m d econfig urab ila. M ai jos, sunt e x e m p lificate d oua m od alitati d e utilizarea c lase i:

JOptionPane.showMessageDialog(frame,

"Eroare de sistem !", "Eroare",

JOptionPane.ERROR_MESSAGE);

JOptionPane.showConfirmDialog(frame,

"Doriti inchiderea aplicatiei ? ", "Intrebare",

JOptionPane.YES_NO_OPTION,

JOptionPane.QUESTION_MESSAGE);

• JF ileCh ooser - D ialog stand ard care p e rm ite nav ig area p rin siste m uld e fisie re si se le c tarea unui anum it fisie r p entru op eratii d e d e sch id e re ,re sp e c tiv salv are .

• JColorCh ooser - D ialog stand ard p entru se le c tarea ıntr-o m anierafac ila a une i culori.

• P rog ressM onitor - Clasa utilizata p entru m onitorizare a p rog resuluiune i op e ratii consum atoare d e tim p .

11.7 D esenarea

11.7 .1 M etode specifi ce

D up a cum stim , d e senarea une i com p onente este un p roc es care se e x e cutaautom at ori d e c ate ori e ste ne c esar. P roc esul ın sine este ase m anator c e luid in m od e lul A W T , ınsa e x ista unele d ife rente care tre b uie m entionate .

Oric e com p onenta se g ase ste ıntr-o ie rarh ie form ata d e containere , rad ac inaac este i fiind un container d e niv e l ınalt, cum ar fi o fereastra sau sup rafataunui ap p le t. Cu alte cuv inte , com p onenta este p lasata p e o sup rafata d eafisare , care la rand ul e i p oate fi p lasata p e alta sup rafata si asa m ai d e p arte .Cand este ne c esara d e senarea com p onente i re p se c tiv e , fie la p rim a sa afisare ,fie ca urm are a unor ac tiuni e x te rne sau interne p rog ram ului, op e ratia d e d e -senare v a fi ex e cutata p entru toate containere le , ınc e p and cu c e l d e la niv e lulsup erior.

Page 338: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .7 . D E SE NARE A 337

D esenarea se b az eaz a p e m od e lul A W T , m e tod a c ea m ai im p ortanta fiindpaint, ap e lata autom at ori d e c ate ori e ste ne c e sar. P entru com p onente leS w ing , ac easta m e tod a are ınsa o im p le m entare sp e c ific a si nu treb uiesupradefi nita. A c easta este resp onsab ila cu ap e lul m e tod e lor S w ing c ed e seneaz a com p onenta si anum e :

• paintCom ponent - E ste p rinc ip ala m etod a p entru d esenare c e e stesup rad efinita p entru fiecare com p onenta S w ing ın p arte p entru a d esc riere p re z entarea sa g rafic a. Im p lic it, ın cazul ın care com p onenta esteop ac a m e tod a d eseneaz a sup rafata sa cu culoarea d e fund al, d up a carev a e x e cuta d esenarea p rop riu-z isa.

• paintB order - D e seneaz a ch enare le com p onente i (d ac a e x ista). N utre b uie sup rad efinita.

• paintCh ildren - S olic ita d e senarea com p onente lor continute d e ac eastacom p onenta (d ac a e x ista). N u tre b uie sup rad efinita.

M e tod a paint e ste resp onsab ila cu ap e lul m e tod e lor am intite m ai sus sirealizarea unor op tim iz ari le g ate d e p roc esul d e d e senare , cum ar fi im p le -m entarea m e canism ului d e d o u ble-bu ff erin g . D e si e ste p osib ila sup rad efinireae i, ac e st lucru nu este re com and at, d in m otiv e le am intite m ai sus.

Ca si ın A W T , d ac a se d ore ste re d e senarea e x p lic ita a une i com p onentese v a ap e la m etod a repaint. In cazul ın care d im ensiunea sau p oz itia com -p onente i s-au sch im b at, ap e lul m e tod e i revalidate v a p re c e d e ap e lul luirepaint.

A tentie

Intoc m ai ca ın A W T , d e senarea este realizata d e firul d e e x e cutie care seocup a cu transm ite rea e v enim ente lor. P e p e rioad a ın care ac esta este ocup atcu transm ite rea unui m esaj nu v a fi facuta nic i o d esenare . D e ase m enea,d ac a ac esta este b locat ıntr-o op eratiune d e d e senare c e consum a m ult tim p ,p e p e rioad a resp e c tiv a nu v a fi transm is nic i un m esaj.

Page 339: Cristian Frasinaru-Curs Practic de Java.pdf

338 CAPIT O L UL 1 1 . SW ING

11.7 .2 Consideratii g enerale

In continuare v om p re z enta c ate v a consid e ratii g enerale le g ate d e d ife riteasp e c te ale d e senarii ın cad rul m od e lului S w ing .

A fi sarea im ag inilorIn A W T afisarea une i im ag ini e ra realizata uzual p rin sup rad efinirea c lase iCanvas si d e senarea im ag inii ın m e tod a paint a aceste ia. In S w ing , e x istac ate v a solutii m ai sim p le p entru afisarea une i im ag ini, c ea m ai utilizata fiindcrearea une i e tich e te (JLabel) sau a unui b uton (JButton) care sa aib a se -tata o anum ita im ag ine p e sup rafata sa. Im ag inea resp e c tiv a tre b uie c reatafolosind c lasa Im ag eIcon.

ImageIcon img = new ImageIcon("smiley.gif");

JLabel label = new JLabel(img);

T ransparentaCu ajutorul m e tod e i setOpaque p oate fi controlata op ac itatea com p onente lorS w ing . A c easta este o fac ilitate e x tre m d e im p ortanta d eoare c e p e rm itec rearea d e com p onente care nu au form a re c tang ulara. D e e x e m p lu, unb uton c ircular v a fi construit ca fiind transp arent (setOpaque(false)) si v ad esena ın interiorul sau o e lip sa um p luta cu o anum ita culoare . E v id ent, e stene c e sara im p le m entarea d e cod sp e c ific p entru a trata ap asarea ac estui tipd e b uton.

T rab sp arenta ınsa v ine cu un anum it p re t, d eoare c e p entru com p onente letransp arente v or tre b ui re d e senate containere le p e care se g ase ste ac easta,ınc e tinind astfe l p roc esul d e afisare . D in ac est m otiv , d e fie care d ata c andeste cazul, se re com and a se tarea com p onente lor ca fiind op ac e(setOpaque(true)).

D im ensiunile com ponentelorD up a cum stim , oric e com p onenta e ste d efinita d e o sup rafata re c tang u-lara. D im ensiunile ac este i p ot fi ob tinute cu m etod e le getSize, getWidth,

getHeight. A c e stea inc lud ınsa si d im sniunile ch enare lor, e v id ent d ac a ac es-tea e x ista. S up rafata ocup ata d e ac e stea p oate fi afl ata cu m etod a g etInsets

Page 340: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .7 . D E SE NARE A 339

ce v a returna un ob ie c t d e tip Insets c e sp e c ific a num arul d e p ix e li ocup aticu ch enare ın jurul com p onente i.

public void paintComponent(Graphics g) {

...

Insets insets = getInsets();

int currentWidth = getWidth() - insets.left - insets.right;

int currentHeight = getHeight() - insets.top - insets.bottom;

...

}

Contex te g rafi ceA rg um entul m e tod e i paintComponent e ste d e tip G raph ics c e ofe ra p rim -itiv e le stand ard d e d e senare . In m ajoritatea cazurilor ınsa, arg um entul ested e fap t d e tip G raph ics2 D , c lasa c e e x tind e Graphics si p une la d isp oz itiem e tod e m ai sofisitcate d e d e senare cunoscute sub num e le d e J av a2D . P entrua av ea ac c es la A P I-ul J av a2D , e ste sufic ient sa fac e m conv ersia arg um entuluic e d e sc rie conte x tul g rafic :

public void paintComponent(Graphics g) {

Graphics2D g2d = (Graphics2D)g;

// Desenam apoi cu g2d

...

}

In S w ing , p entru a efic ientiza d esenarea, ob ie c tul d e tip Graphics p rim itca arg um ent d e m e tod a paintComponent e ste re folosit p entru d esenarea com -p onente i, a ch enare lor si a fiilor sai. D in ac est m otiv e ste foarte im p ortantca atunc i c and sup rad efinim m e tod a paintComponent sa ne asig uram c a laterm inarea m etod e i starea ob ie c tului Graphics e ste ac e easi ca la ınc e p ut.A c e st lucru p oate fi realizat fie e x p lic it, fie folosind o cop ie a conte x tuluig rafic p rim it ca arg um ent:

// 1.Explicit

Graphics2D g2d = (Graphics2D)g;

g2d.translate(x, y); // modificam contexul

...

g2d.translate(-x, -y); // revenim la starea initiala

Page 341: Cristian Frasinaru-Curs Practic de Java.pdf

340 CAPIT O L UL 1 1 . SW ING

// 2. Folosirea unei copii

Graphics2D g2d = (Graphics2D)g.create();

g2d.translate(x, y);

...

g2d.dispose();

11.8 L ook and F eel

P rin sintag m a ’L oo k a n d F eel’ (L & F ) v om ınte le g e m od ul ın care sunt d e -senate com p onente le S w ing si fe lul ın care ac estea interac tioneaz a cu uti-lizatorul. P osib ilitatea d e a ale g e ıntre d ife rite m od uri L & F are av antajuld e a oferi p re z entarea une i ap licatii ıntr-o form a g rafic a care sa coresp und ap re fe rinte lor utilizatorilor. In p rinc ip iu, v ariante le orig inale d e L & F furnizateın d istrib utia stand ard ofereau m od alitatea ca o interfata S w ing fie sa seıncad re z e ın ansam b lul g rafic al siste m ului d e op erare folosit, fie sa aib a unasp e c t sp e c ific J av a.

Oric e L & F este d e sc ris d e o c lasa d e riv ata d in L ook A ndF eel. D istrib utiastand ard J av a inc lud e urm atoare le c lase c e p ot fi utilizate p entru se le c tareaunui L & F:

• javax.swing.plaf.metal.MetalLookAndFeel

E ste v arianta im p lic ita d e L & F si are un asp e c t sp e c ific J av a.

• com.sun.java.swing.plaf.windows.WindowsLookAndFeel

V arianta sp e c ific a siste m e lor d e op e rare W ind ow s. Inc e p and cu v ersi-unea 1.4.2 e x ista si im p le m entarea p entru W ind ow s XP .

• com.sun.java.swing.plaf.mac.MacLookAndFeel

V arianta sp e c ific a siste m e lor d e op erare M ac .

• com.sun.java.swing.plaf.motif.MotifLookAndFeel

S p e c ific a interfata CD E / M otif.

• com.sun.java.swing.plaf.gtk.GTKLookAndFeel

G T K + re p re z inta un stand ard d e c reare a interfe te lor g rafice d e z v oltatind e p end ent d e lim b ajul J av a. (G T K e ste acronim ul d e la G N U Im a geM a n ip u la tio n P rogra m T oo lkit). Folosind ac est L & F este p osib ila si

Page 342: Cristian Frasinaru-Curs Practic de Java.pdf

1 1 .8 . L O O K AND F E E L 341

sp e c ificarea une i anum ite te m e p rin interm e d iul unui fisie r d e resursesau folosind v ariab ila swing.gtkthemefile, ca ın e x e m p lul d e m ai jos:

java -Dswing.gtkthemefile=temaSpecifica/gtkrc App

S p e c ificare une i anum ite interfe te L & F p oate fi realizata p rin m ai m ultem od alitati.

F olosirea clasei U Im anag erClasa UIManager p une la d isp oz itie o serie d e m e tod e static e p entru se -le c tarea la m om entul e x e cutie i a uni anum it L & F, p re cum si p entru ob tinereaunor v ariante sp e c ific e :

• getLookAndFeel - Ob tine v arianta curenta, re turnand un ob ie c t d e tipLookAndFeel.

• setLookAndFeel - S e teaz a m od ul curet L & F. M e tod a p rim e ste ca ar-g um ent un ob ie c t d intr-o c lasa d e riv ata d in LookAndFeel, fie un sir d ecaractere cu num e le com p le t al c lase i L & F.

• getSystemLookAndFeelClassName - Ob tine v arianta sp e c ific a siste m u-lui d e op e rare folosit. In cazul ın care nu ex ista nic i o astfe l d e c lasa,re turneaz a v arianta stand ard .

• getCrossPlatformLookAndFeelClassName - R e turneaz a interfata g rafic astand ard J av a (J L F).

// Exemple:

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel");

UIManager.setLookAndFeel(

UIManager.getSystemLookAndFeelClassName());

S etarea proprietatii sw ing .defaultlafE x ista p osib ilitatea d e a sp e c ifica v arianta d e L & F a ap licatie d ire c t d e lalinia d e com and a p rin setarea p rop rie tatii sw ing .defaultlaf:

Page 343: Cristian Frasinaru-Curs Practic de Java.pdf

342 CAPIT O L UL 1 1 . SW ING

java -Dswing.defaultlaf=

com.sun.java.swing.plaf.gtk.GTKLookAndFeel App

java -Dswing.defaultlaf=

com.sun.java.swing.plaf.windows.WindowsLookAndFeel App

O alta v arianta d e a seta ac easta p rop rie tate este sch im b area e i d ire c t ınfisie rul swing.properties situat ın sub d ire c torul lib al d istrib utie i J av a.

# Swing properties

swing.defaultlaf=

com.sun.java.swing.plaf.windows.WindowsLookAndFeel

Ord inea ın care este aleasa c lasa L & F este urm atoarea:

1. A p e lul e x p lic it al m e tod e i UIManager.setLookAndFeel ınaintea cre ariiune i com p onente S w ing .

2. P rop rie tatea swing.defaultlaf sp e c ificata d e la linia d e com and a.

3. P rop rie tatea swing.defaultlaf sp e c ificata ın fisie rul swing.properties.

4. Clasa stand ard J av a (J L F).

E x ista p osib ilitatea d e a sch im b a v arianta d e L & F ch iar si d up a afisareacom p onente lor. A c e sta este un p roc es care tre b uie sa actualiz e z e ie rarh iiled e com p onente , ınc e p and cu containere le d e niv e l ınalt si v a fi realizat p rinap e lul m e tod e i S w ing U tilities.updateCom ponentT reeU I c e v a p rim i caarg um ent rad ac ina une i ie rarh ii. S e c v enta care e fe c tueaz a ac easta op e ratiep entru o fereastra f e ste :

UIManager.setLookAndFeel(numeClasaLF);

SwingUtilities.updateComponentTreeUI(f);

f.pack();

Page 344: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 12

F ire de ex ecutie

12 .1 Introducere

Fire le d e e x e cutie fac tre c e rea d e la p rog ram area se c v entiala la p rog ram areaconcurenta. U n p rog ram se c v ential re p re z inta m od e lul c lasic d e p rog ram : areun ınc e p ut, o se c v enta d e e x e cutie a instruc tiunilor sale si un sfarsit. Cu altecuv inte , la un m om ent d at p rog ram ul are un sing ur p unct d e e x e cutie . U np rog ram afl at ın e x e cutie se num e ste p roces. U n siste m d e op erare m onotask -ing , cum ar fi fi M S -D OS , nu este cap ab il sa e x e cute d e c at un sing ur p roc esla un m om ent d at, ın tim p c e un siste m d e op e rare m ultitask ing , cum ar fiU N IX sau W ind ow s, p oate rula oric ate p roc ese ın ac e lasi tim p (concurent),folosind d iv e rse strate g ii d e alocare a p roc esorului fie c aruia d intre ac estea.A m ream intit ac est lucru d eoare c e notiunea d e fir d e e x e cutie nu are sensd e c at ın cad rul unui siste m d e op erare m ultitask ing .

U n fir d e e x e cutie e ste sim ilar unui p roc es se c v ential, ın sensul c a areun ınc e p ut, o se c v enta d e e x e cutie si un sfarsit. D ife renta d intre un fir d ee x e cutie si un p roc es consta ın fap tul c a un fir d e e x e cutie nu p oate rulaind e p end ent c i tre b uie sa rule z e ın cad rul unui p roc es.

D efi nitie

U n fi r d e execu tie e ste o suc c esiune sc e v entiala d e instruc tiuni care see x e cuta ın cad rul unui p roc es.

343

Page 345: Cristian Frasinaru-Curs Practic de Java.pdf

344 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

P rog ram (p roc es) P rog ram (p roc es)

U n p rog ram ısi p oate d efini ınsa nu d oar un fir d e e x e cutie c i oric ate , c e eac e ınseam na c a ın cad rul unui p roc es se p ot e x e cuta sim ultan m ai m ulte fired e e x e cutie , p e rm itand e fe c tuarea concurenta a sarc inilor ind e p end ente aleac e lui p rog ram .

U n fir d e e x e cutie p oate fi ase m anat cu o v ersiune re d usa a unui p roc es,am b e le ruland sim ultan si ind e p end ent p e o structura se c v entiala form ata d einstruc tiunile lor. D e ase m enea, e x e cutia sim ultana a fire lor ın cad rul unuip roc es este sim ilara cu e x e cutia concurenta a p roc ese lor: siste m ul d e op erarev a aloca p roc esorul d up a o anum ita strate g ie fie c arui fir d e e x e cutie p ana laterm inarea lor. D in ac est m otiv fire le d e e x e cutie m ai sunt num ite si p roceseu soa re .

Care ar fi ınsa d eose b irile ıntre un fir d e e x e cutie si un p roc es ? In p rim ul,rand d eose b irea m ajora consta ın fap tul c a fire le d e e x e cutie nu p ot rula d e c atın cad rul unui p roc es. O alta d eose b ire re zulta d in fap tul c a fie care p roc esare p rop ria sa m e m orie (p rop riul sau sp atiu d e ad rese) iar la crearea unui noup roc es (fork ) este realizata o cop ie e x acta a p roc esului p arinte : cod si d ate ,ın tim p c e la crearea unui fir nu este cop iat d e c at cod ul p roc esului p arinte ,toate fire le d e e x e cutie av and ac c e s la ac e leasi d ate , d ate le p roc esului orig inal.A sad ar, un fir m ai p oate fi p riv it si ca un co n text d e execu tie ın cad rul unuip roc es.

Fire le d e e x e cutie sunt utile ın m ulte p riv inte , ınsa uzual e le sunt folositep entru e x e cutarea unor op eratii consum atoare d e tim p fara a b loca p roc esulp rinc ip al: calcule m ate m atic e , aste p tarea e lib e rarii une i re surse , d e senareacom p onente lor une i ap licatii G U I, e tc . D e m ulte ori ori, fire le ısi d e sfasoaraactiv itatea ın fund al ınsa, e v id ent, ac est lucru nu este ob lig atoriu.

12 .2 Crearea unui fi r de ex ecutie

Ca oric e alt ob ie c t J av a, un fir d e e x e cutie e ste o instanta a une i c lase . Fire led e e x e cutie d efinite d e o c lasa v or av ea ac e lasi cod si, p rin urm are , ac e easi

Page 346: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE 345

se c v enta d e instruc tiuni. Crearea une i c lase care sa d efineasc a fire d e e x e cutiep oate fi facuta p rin d oua m od alitati:

• p rin e x tind erea c lase i Thread.

• p rin im p le m entarea interfe te i Runnable.

Oric e c lasa ale c are i instante v or fi e x e cutate se p arat ıntr-un fir p rop riutre b uie d e c larata ca fiind d e tip R unnab le. A c easta este o interfata carecontine o sing ura m e tod a si anum e m e tod a run. A sad ar, oric e c lasa c e d e sc riefire d e e x e cutie v a contine m e tod a run ın care este im p le m entat cod ul c e v a firulat. Interfata Runnable e ste conce p uta ca fiind un p rotocol com un p entruob ie c te le care d oresc sa e x e cute un anum it cod p e d urata e x istente i lor.

Cea m ai im p ortanta c lasa care im p le m enteaz a interfata Runnable e steT h read. A c easta im p le m enteaz a un fir d e e x e cutie g eneric care , im p lic it, nufac e nim ic ; cu alte cuv inte , m e tod a run nu contine nic i un cod . Oric e fir d ee x e cutie e ste o instanta a c lase i Thread sau a une i sub c lase a sa.

12 .2 .1 E x tinderea clasei T h read

Cea m ai sim p la m e tod a d e a crea un fir d e e x e cutie care sa realiz e z e o anum itaac tiune este p rin e x tind erea c lase i Thread si sup rad efinirea m etod e i run aaceste ia. Form atul g eneral al une i astfe l d e c lase este :

public class FirExcecutie extends Thread {

public FirExcecutie(String nume) {

// Apelam constructorul superclasei

super(nume);

}

public void run() {

// Codul firului de executie

...

}

}

P rim a m e tod a a c lase i e ste constructorul, care p rim e ste ca arg um ent unsir c e v a re p re z enta num e le firului d e e x e cutie . In cazul ın care nu v re m sad am num e fire lor p e care le c re am , atunc i p ute m renunta la sup rad efinirea

Page 347: Cristian Frasinaru-Curs Practic de Java.pdf

346 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

acestui constructor si sa folosim constructorul im p lic it, fara arg um ente , carec re eaz a un fir d e e x e cutie fara nic i un num e . U lte rior, ac esta p oate p rim i unnum e cu m etod a setName. E v id ent, se p ot d efini si alti constructori, ac e stiafiind e utili atunc i c and v re m sa trim ite m d iv e rsi p aram etri d e initializarefirului nostru. A d oua m e tod a e ste m e tod a run, ” inim a” oric arui fir d ee x e cutie , ın care sc rie m e fe c tiv cod ul care tre b uie sa se e x e cute .

U n fir d e e x e cutie c reat nu este autom at p ornit, lansarea sa fiind realiz eaz ad e m e tod a start, d efinita ın c lasa Thread.

// Cream firul de executie

FirExecutie fir = new FirExecutie("simplu");

// Lansam in executie

fir.start();

S a consid e ram ın continuare un ex e m p lu ın care d efinim un fir d e e x e cutiec e afiseaz a num ere le ıntre g i d intr-un interv al, cu un anum it p as.

L isting 12.1: Folosirea c lase i Thread

class AfisareNumere extends Thread {

private int a, b, pas;

public AfisareNumere(int a, int b, int pas) {

this.a = a;

this.b = b;

this.pas = pas;

}

public void run() {

for(int i = a; i <= b; i += pas)

System.out.print(i + " " );

}

}

public class TestThread {

public static void main(String args []) {

AfisareNumere fir1 , fir2;

fir1 = new AfisareNumere (0, 100, 5);

// Numara de la 0 la 100 cu pasul 5

fir2 = new AfisareNumere (100, 200, 10);

Page 348: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE 347

// Numara de la 100 la 200 cu pasul 10

fir1.start ();

fir2.start ();

// Pornim firele de executie

// Ele vor fi distruse automat la terminarea lor

}

}

G and ind se c v ential, s-ar cre d e c a ac est p rog ram v a afisa p rim a d ata nu-m e re le d e la 0 la 100 cu p asul 5, ap oi num ere le d e la 100 la 200 cu p asul 10,ıntruc at p rim ul ap e l e ste c atre contorul fir1, d e c i re zultatul afisat p e e c ranar trb ui sa fie :

0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

100 110 120 130 140 150 160 170 180 190 200

In realitate ınsa, re zultatul ob tinut v a fi o intercalare d e v alori p rod use d ec e le d oua fire c e ruleaz a sim ultan. L a rulari d ife rite se p ot ob tine re zultated ife rite d eoare c e tim p ul alocat fie c arui fir d e e x e cutie p oate sa nu fie ac e lasi,e l fiind controlat d e p roc esor ıntr-o m aniera ” ap arent” aleatoare . U n p osib ilre zultat al p rog ram ului d e m ai sus:

0 100 5 110 10 120 15 130 20 140 25 150 160 170 180 190 200

30 35 40 45 50 55 60 65 70 75 80 85 90 95 100

12 .2 .2 Im plem entarea interfetei R unnab le

Ce fac e m ınsa c and d orim sa c re am o c lasa care instantiaz a fire d e e x e cutied ar ac easta are d e ja o sup erc lasa, stiind c a ın J av a nu este p e rm isa m osteniream ultip la ?

class FirExecutie extends Parinte, Thread // incorect !

In ac est caz , nu m ai p ute m e x tind e c lasa Thread c i tre b uie sa im p le m entamd ire c t interfata Runnable. Clasa Thread im p le m enteaz a ea ınsasi interfataRunnable si, d in ac est m otiv , la e x tind erea e i ob tineam im p le m entarea ind i-re c ta a interfe te i. A sad ar, interfata Runnable p e rm ite une i c lase sa fie activ a,fara a e x tind e c lasa Thread.

Interfata Runnable se g ase ste ın p ach e tul java.lang si e ste d efinita astfe l:

Page 349: Cristian Frasinaru-Curs Practic de Java.pdf

348 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

public interface Runnable {

public abstract void run();

}

P rin urm are , o c lasa care instantiaz a fire d e e x e cutie p rin im p le m entareainterfe te i Runnable tre b uie ob lig atoriu sa im p le m ente z e m e tod a run. O astfe ld e c lasa se m ai num e ste cla sa a ctiv a si are urm atoarea structura:

public class ClasaActiva implements Runnable {

public void run() {

//Codul firului de executie

...

}

}

S p re d eose b ire d e m od alitatea anterioara, se p ie rd e ınsa tot sup ortul oferitd e c lasa Thread. S im p la instantie re a une i c lase care im p le m eneaz a interfataRunnable nu cre eaz a nic i un fir d e e x e cutie , c rearea ac estora tre b uind facutae x p lic it. P entru a realiza ac est lucru tre b uie sa instantie m un ob ie c t d e tipThread c e v a re p re z enta firul d e e x e cutie p rop riu z is al c arui cod se g ase steın c lasa noastra. A c e st lucru se realiz eaz a, ca p entru oric e alt ob ie c t, p rininstruc tiunea new, urm ata d e un ap e l la un constructor al c lase i Thread, ınsanu la oricare d intre ac e stia. T re b uie ap e lat constructorul care sa p rim easc ad re p t arg um ent o instanta a c lase i noastre . D up a c reare , firul d e e x e cutiep oate fi lansat p rintr-un ap e l al m e tod e i start.

ClasaActiva obiectActiv = new ClasaActiva();

Thread fir = new Thread(obiectActiv);

fir.start();

A c e ste op eratiuni p ot fi facute ch iar ın cad rul c lase i noastre :

public class FirExecutie implements Runnable {

private Thread fir = null;

public FirExecutie()

if (fir == null) {

fir = new Thread(this);

Page 350: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE 349

fir.start();

}

}

public void run() {

//Codul firului de executie

...

}

}

S p e c ificarea arg um entului this ın constructorul c lase i Thread d e te rm inac rearea unui fir d e e x e cutie care , la lansarea sa, v a ap e la m etod a run d inc lasa curenta. A sad ar, ac est constructor ac c e p ta ca arg um ent oric e instantaa une i c lase ” R unnab le ” . P entru c lasa FirExecutie d ata m ai sus, lansareafirului v a fi facuta autom at la instantie rea unui ob ie c t al c lase i:

FirExecutie fir = new FirExecutie();

A tentieM e tod a run nu tre b uie ap e lata e x p lic it, ac est lucru realiz and u-se autom at

la ap e lul m e tod e i start. A p e lul e x p lic it al m e tod e i run nu va furniza nic i oeroare , ınsa ac easta v a fi ex e cutata ca oric e alta m e tod a, si nu se p arat ıntr-unfir.

S a consid e ram urm atorul e x e m p lu ın care c re am d oua fire d e e x e cutiefolosind interfata Runnable. Fie care fir v a d esena fig uri g eom etric e d e unanum it tip , p e o sup rafata d e d e senare d e tip Canvas. V om p orni ap oi d ouafire d e e x e cutie care v or rula concurent, d e senand fig uri d ife rite , fie care p esup rafata sa.

L isting 12.2: Folosirea interfe te i Runnable

import java.awt .*;

import java.awt.event .*;

class Plansa extends Canvas implements Runnable {

// Deoarece Plansa extinde Canvas ,

Page 351: Cristian Frasinaru-Curs Practic de Java.pdf

350 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

// nu mai putem extinde clasa Thread

Dimension dim = new Dimension (300, 300);

Color culoare;

String figura;

int x=0, y=0, r=0;

public Plansa(String figura , Color culoare) {

this.figura = figura;

this.culoare = culoare;

}

public Dimension getPreferredSize () {

return dim;

}

public void paint(Graphics g) {

// Desenam un chenar

g.setColor(Color.black);

g.drawRect(0, 0, dim.width -1, dim.height -1);

// Desenam figura la coordonatele calculate

// de firul de executie

g.setColor(culoare);

if (figura.equals("patrat"))

g.drawRect(x, y, r, r);

else

if (figura.equals("cerc"))

g.drawOval(x, y, r, r);

}

public void update(Graphics g) {

paint(g);

// Supradefinim update ca sa nu mai

// fie stearsa suprafata de desenare

}

public void run() {

/* Codul firului de executie:

Afisarea a 100 de figuri geometrice la pozitii

si dimensiuni calculate aleator.

Intre doua afisari , facem o pauza de 50 ms

*/

for(int i=0; i <100; i++) {

Page 352: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE 351

x = (int)(Math.random () * dim.width);

y = (int)(Math.random () * dim.height);

r = (int)(Math.random () * 100);

try {

Thread.sleep (50);

} catch(InterruptedException e) {}

repaint ();

}

}

}

class Fereastra extends Frame {

public Fereastra(String titlu) {

super(titlu);

this.addWindowListener(new WindowAdapter () {

public void windowClosing(WindowEvent e) {

System.exit (0);

}

});

// Cream doua obiecte active de tip Plansa

Plansa p1 = new Plansa("patrat", Color.blue);

Plansa p2 = new Plansa("cerc", Color.red);

// Acestea extind Canvas , le plasam pe fereastra

setLayout(new GridLayout (1, 2));

add(p1);

add(p2);

pack();

// Pornim doua fire de executie , care vor

// actualiza desenul celor doua planse

new Thread(p1).start ();

new Thread(p2).start ();

}

}

public class TestRunnable {

public static void main(String args []) {

Fereastra f = new Fereastra("Test Runnable");

f.show();

}

}

Page 353: Cristian Frasinaru-Curs Practic de Java.pdf

352 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .3 Ciclul de viata al unui fi r de ex ecutie

Fie care fir d e e x e cutie are p rop riul sau c ic lu d e v iata: e ste c reat, d e v ine activp rin lansarea sa si, la un m om ent d at, se te rm ina. In continuare , v om analizam ai ınd eap roap e starile ın care se p oate g asi un fir d e e x e cutie . D iag ram ad e m ai jos ilustreaz a g eneric ac este stari p re cum si m e tod e le care p rov oacatranz itia d intr-o stare ın alta:

A sad ar, un fir d e e x e cutie se p oate g asi ın una d in urm atoare le p atrustari:

• ” N e w T h read ”

• ” R unnab le ”

• ” N ot R unnab le ”

• ” D ead ”

S tarea ” N ew T h read”U n fir d e e x e cutie se g ase ste ın ac easta stare im e d iat d up a c rearea sa, cu altecuv inte d up a instantie rea unui ob ie c t d in c lasa Thread sau d intr-o sub c lasaa sa.

Thread fir = new Thread(obiectActiv);

// fir se gaseste in starea "New Thread"

Page 354: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 353

In aceasta stare firul este ” v id ” , e l nu are alocate nic i un fe l d e resurse sis-te m si sing ura op eratiune p e care o p ute m e x e cuta asup ra lui este lansareaın e x e cutie , p rin m etod a start. A p e lul oric are i alte m e tod e ın afara d e startnu are nic i un sens si v a p rov oca o e x c e p tie d e tip ul IllegalThreadStateException.

S tarea ” R unnab le”D up a ap e lul m e tod e i start un fir v a tre c e ın starea ” R unnab le ” , ad ic a v a fiın e x e cutie .

fir.start();

//fir se gaseste in starea "Runnable"

M e tod a start realiz e z a urm atoare le op e ratiuni ne c esare rularii firului d ee x e cutie :

• A loc a re surse le siste m ne c e sare .

• P lanific a firul d e e x e cutie la p roc esor p entru a fi lansat.

• A p e leaz a m e tod a run a ob ie c tului activ al firului.

U n fir afl at ın starea ” R unnab le ” nu ınseam na neap arat c a se g ase stee fe c tiv ın e x e cutie , ad ic a instruc tiunile sale sunt interp re tate d e p roc esor.A c e st lucru se ıntam p la d in cauza c a m ajoritatea calculatoare lor au un sing urp roc esor iar ac esta nu p oate rula sim ultan toate fire le d e e x e cutie care seg asesc ın starea ” R unnab le ” . P entru a re zolv a ac easta p rob le m a e x ista op lanificare care sa p artaje z e d inam ic si core c t p roc esorul ıntre toate fire le d ee x e cutie care sunt ın starea ” R unnab le ” . A sad ar, un fir care ” ruleaz a” p oatesa-si aste p te d e fap t rand ul la p roc esor.

S tarea ” N ot R unnab le”U n fir d e e x e cutie p oate ajung e ın ac eaata stare ın una d in urm atoare lesituatii:

• E ste ” ad orm it” p rin ap e lul m e tod e i sleep;

• A ap e lat m e tod a wait, aste p tand ca o anum ita cond itie sa fie satisfa-cuta;

Page 355: Cristian Frasinaru-Curs Practic de Java.pdf

354 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

• E ste b locat ıntr-o op eratie d e intrare / ie sire .

M e tod a sleep e ste o m etod a static a a c lase i Thread care p rov oac a op auz a ın tim p ul rularii firului curent afl at ın e x e cutie , cu alte cuv inte ıl” ad oarm e ” p entru un tim p sp e c ificat. L ung im ea ac este i p auz e este sp e c ificataın m ilise cund e si ch iar nanose cund e . Intruc at p oate p rov oca e x c e p tii d e tip ulInterruptedException, ap e lul ac este i m e tod e se fac e ıntr-un b loc d e tiptry-cacth:

try {

// Facem pauza de o secunda

Thread.sleep(1000);

} catch (InterruptedException e) {

...

}

Ob serv ati c a m e tod a fiind static a ap e lul e i nu se fac e p entru o instanta anum ea c lase i Thread. A c e st lucru este foarte norm al d eoare c e , la un m om ent d at,un sing ur fir este ın e x e cutie si d oar p entru acesta are sens ” ad orm irea” sa.

In interv alul ın care un fir d e e x e cutie ” d oarm e ” , ac esta nu va fi ex e cutch iar d ac a p roc esorul d e v ine d isp onib il. D up a e x p irarea interv alului sp e c ifi-cat firul re v ine ın starea ” R unnab le ” iar d ac a p roc esorul este ın continuared isp onib il ısi v a continua ex e cutia.

P entru fiecare tip d e intrare ın starea ” N ot R unnab le ” , e x ista o se c v entasp e c ific a d e ie sire d in starea re p e c tiv a, care read uc e firul d e e x e cutie ın starea” R unnab le ” . A c e stea sunt:

• D ac a un fir d e e x e cutie a fost ” ad orm it” , atunc i e l d e v ine ” R unnab le ”d oar d up a scurg e rea interv alului d e tim p sp e c ificat d e instruc tiuneasleep.

• D ac a un fir d e e x e cutie asteap ta o anum ita cond itie , atunc i un altob ie c t tre b uie sa ıl inform e z e d ac a ac ea cond itie e ste ınd e p linita saunu; ac est lucru se realiz eaz a p rin instruc tiunile notify sau notifyAll

(v e z i ” S incronizarea fire lor d e e x e cutie ” ).

• D ac a un fir d e e x e cutie e ste b locat ıntr-o op eratiune d e intrare / ie sireatunc i e l re d e v ine ” R unnab le ” atunc i c and ac ea op eratiune s-a term i-nat.

Page 356: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 355

S tarea ” D ead”E ste starea ın care ajung e un fir d e e x e cutie la term inarea sa. U n fir nup oate fi op rit d in p rog ram p rintr-o anum ita m e tod a, c i tre b uie sa se te rm ineın m od natural la ınch e ie rea m etod e i run p e care o e x e cuta. S p re d eose b ire d ev e rsiunile curente ale lim b ajului J av a, ın v e rsiunile m ai v e ch i e x ista m etod astop a clase i Thread care term ina fortat un fir d e e x e cutie , ınsa ac easta afost e lim inata d in m otiv e d e se curitate . A sad ar, un fir d e e x e cutie tre b uiesa-si ” aranje z e ” sing ur p rop ria sa ” m oarte ” .

12 .3 .1 T erm inarea unui fi r de ex ecutie

D up a cum am v azut, un fir d e e x e cutie nu p oate fi term inat fortat d e c atrep rog ram c i tre b uie sa-si ” aranje z e ” sing ur term inarea sa. A c e st lucru p oatefi realizat ın d oua m od alitati:

1. P rin scrie rea unor m etod e run care sa-si te rm ine e x e cutia ın m od nat-ural. L a term inarea m e tod e i run se v a term ina autom at si firul d ee x e cutie , ac esta intrand ın starea D ead . A m b e le e x e m p le anteriorarese ıncad reaz a ın ac easta cate g orie .

// Primul exemplu

public void run() {

for(int i = a; i <= b; i += pas)

System.out.print(i + " " );

}

D up a afisarea num ere lor d in interv alul sp e c ificat, m e tod a se term inasi, od ata cu ea, se v a term ina si firul d e e x e cutie re p se c tiv .

2. P rin folosirea une i v ariab ile d e te rm inare . In cazul c and m e tod a run

tre b uie sa e x e cute o b uc la infinita atunc i ac easta tre b uie controlatap rintr-o v ariab ila care sa op reasc a c ic lul atunc i c and d orim ca firul d ee x e cutie sa se te rm ine . U zual, v om folosi o v ariab ila m e m b ra a c lase icare d e sc rie firul d e e x e cutie care fie este p ub lic a, fie este asoc iata cu om etod a p ub lic a care p e rm ite sch im b area v alorii sale .

S a consid e ram e x e m p lul unui fir d e e x e cutie care tre b uie sa num ere se -cund e le scurse p ana la ap asarea taste i E nter.

Page 357: Cristian Frasinaru-Curs Practic de Java.pdf

356 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

L isting 12.3: Folosirea une i v ariab ile d e te rm inare

import java.io.*;

class NumaraSecunde extends Thread {

public int sec = 0;

// Folosim o variabila de terminare

public boolean executie = true;

public void run() {

while (executie) {

try {

Thread.sleep (1000);

sec ++;

System.out.print(".");

} catch(InterruptedException e){}

}

}

}

public class TestTerminare {

public static void main(String args [])

throws IOException {

NumaraSecunde fir = new NumaraSecunde ();

fir.start();

System.out.println("Apasati tasta Enter");

System.in.read();

// Oprim firul de executie

fir.executie = false;

System.out.println("S-au scurs " + fir.sec + " secunde");

}

}

N u este ne c esara d istrug erea e x p lic ita a unui fir d e e x e cutie . S iste m ulJ av a d e cole c tare a ” g unoiului” se ocup a d e ac est lucru. S e tarea v aloriinull p entru v ariab ila care re fe rea instanta firului d e e x e cutie v a usura ınsaactiv itatea p roc esului g c .

M e tod a System.exit v a op rit fortat toate fire le d e e x e cutie si v a term inaap licatia curenta.

Page 358: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 357

P entru a testa d ac a un fir d e e x e cutie a fost p ornit d ar nu s-a term inatınc a p ute m folosi m e tod a isA live. M e tod a returneaz a:

• true - d ac a firul este ın una d in starile ” R unnab le ” sau ” N ot R unnab le ”

• false - d ac a firul este ın una d in starile ” N e w T h read ” sau ” D ead ”

Intre starile ” R unnab le ” sau ” N ot R unnab le ” , re p e c tiv ” N e w T h read ”sau ” D ead ” nu se p oate fac e nic i o d ife rentie re .

NumaraSecunde fir = new NumaraSecunde();

// isAlive retuneaza false (starea este New Thread)

fir.start();

// isAlive retuneaza true (starea este Runnable)

fir.executie = false;

// isAlive retuneaza false (starea este Dead)

12 .3 .2 F ire de ex ecutie de tip ” daem on”

U n p roc es este consid e rat ın e x e cutie d ac a contine c e l p utin un fir d e e x e cutieactiv . Cu alte cuv inte , la rularea une i ap licatii, m asina v irtuala J av a nu se v aop ri d e c at atunc i c and nu m ai e x ista nic i un fir d e e x e cutie activ . D e m ulte oriınsa d orim sa folosim fire care sa realiz e z e d iv e rse activ itati, e v entual p e riod ic ,p e toata d urata d e e x e cutie a p rog ram ului iar ın m om entul term inarii ac estuiasa se te rm ine autom at si fire le resp e c tiv e . A c e ste fire d e e x e cutie se num escd em o n i.

D up a c rearea sa, un fir d e e x e cutie p oate fi facut d e m on, sau scos d inac easta stare , cu m etod a setD aem on.

L isting 12.4: Crearea unui fir d e e x cutie d e tip ” d ae m on”

class Beeper implements Runnable {

public void run() {

while (true) {

java.awt.Toolkit.getDefaultToolkit ().beep();

try {

Thread.sleep (1000);

} catch(InterruptedException e) {}

}

Page 359: Cristian Frasinaru-Curs Practic de Java.pdf

358 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

}

}

public class TestDaemon {

public static void main(String args [])

throws java.io.IOException {

Thread t = new Thread(new Beeper ());

t.setDaemon(true);

t.start();

System.out.println("Apasati Enter ...");

System.in.read();

// "Demonul" se termina automat

// la terminarea aplicatiei

}

}

12 .3 .3 S tab ilirea prioritatilor de ex ecutie

M ajoritatea calculatoare lor au un sig ur p roc esor, c e ea c e ınseam na c a fire led e e x e cutie tre b uie sa-si ım p arta ac c e sul la ac e l p roc esor. E x e cutia ıntr-o an-um ita ord ine a m ai m ultor fire d e e x e cutie p e un num ar lim itat d e p roc esoarese num e ste p la n ifi ca re (sch ed u lin g). S iste m ul J av a d e e x e cutie a p rog ram e lorim p le m enteaz a un alg oritm sim p lu, d e te rm inist d e p lanificare , cunoscut subnum e le d e p la n ifi ca re cu p rio rita ti fi xa te .

Fie care fir d e e x e cutie J av a p rim e ste la crearea sa o anum ita p riori-tate . O p rioritate este d e fap t un num ar ıntre g cu v alori cup rinse ıntreMIN PRIORITY si MAX PRIORITY. Im p lic it, p rioritatea unui fir nou creat arev aloarea NORM PRIORITY. A c e ste tre i constante sunt d efinite ın c lasa Thread

astfe l:

public static final int MAX_PRIORITY = 10;

public static final int MIN_PRIORITY = 1;

public static final int NORM_PRIORITY= 5;

S ch im b area ulterioara a p rioritatii unui fir d e e x e cutie se realiz eaz a cu m etod asetP riority a clase i Thread.

L a niv e lul siste m ului d e op erare , e x ista d oua m od e le d e lucru cu fire d ee x e cutie :

Page 360: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 359

• M od elu l coo pera tiv , ın care fire le d e e x e cutie d e c id c and sa c e d e z e p ro-c e sorul; d e zav antajul ac estui m od e l e ste c a unele fire p ot acap ara p ro-c e sorul, ne p e rm itand si e x e cutia altora p ana la term inarea lor.

• M od elu l p reem p tiv , ın care fire le d e e x e cutie p ot fi ıntrerup te oric and ,d up a c e au fost lasate sa rule z e o p erioad a, urm and sa fie re luate d up ac e si c e le lalte fire afl ate ın e x e cutie au av ut ac c es la p roc esor; ac estsiste m se m ai num e ste cu ” cuante d e tim p ” , d e zav antajul sau fiindne v oia d e a sincroniza ac c esul fire lor la resurse le com une .

A sad ar, ım m od e lul coop erativ fire le d e e x e cutie sunt resp onsab ile cu p ar-tajarea tim p ului d e e x e cutie , ın tim p c e ın m od e lul p re e m p tiv e le tre b uiesa p artaje z e resurse le com une . D eoare c e sp e c ificatiile m asinii v irtuale J av anu im p un folosirea unui anum it m od e l, p rog ram e le J av a tre b uie sc rise astfe lınc at sa func tione z e core c t p e am b e le m od e le . In continuare , v om m ai d e taliap utin ac este asp e c te .

P lanificatorul J av a lucreaz a ın m od ul urm ator: d ac a la un m om ent d atsunt m ai m ulte fire d e e x e cutie ın starea ” R unnab le ” , ad ic a sunt p re g atitep entru a fi rulate , p lanificatorul ıl v a ale g e p e c e l cu p rioritatea c ea m aim are p entru a-l e x e cuta. D oar c and firul d e e x e cutie cu p rioritate m ax im a sete rm ina, sau este susp end at d in d iv e rse m otiv e , v a fi ales un fir cu o p rioritatem ai m ic a. In cazul ın care toate fire le au ace easi p rioritate e le sunt alese p erand , d up a un alg oritm sim p lu d e tip ” round -rob in” . D e ase m enea, d ac aun fir cu p rioritate m ai m are d e c at firul care se e x e cuta la un m om ent d atsolic ita p roc esorul, atunc i firul cu p rioritate m ai m are este im e d iat tre cut ıne x e cutie iar c e lalalt tre cut ın aste p tare . P lanificatorul J av a nu v a ıntrerup eınsa un fir d e e x e cutie ın fav oarea altuia d e ac e easi p rioritate , ınsa ac est lucruıl p oate fac e siste m ul d e op erare ın cazul ın care ac esta aloc a p roc esorul ıncuante d e tim p (un astfe l d e S O este W ind ow s).

A sad ar, un fir d e e x e cutie J av a c e d eaz a p roc esorul ın una d in situatiile :

• un fir d e e x e cutie cu o p rioritate m ai m are solic ita p roc esorul;

• m e tod a sa run se term ina;

• fac e e x p lic it ac est lucru ap e land m e tod a yield;

• tim p ul alocat p entru e x e cutia sa a e x p irat (p e S O cu cuante d e tim p ).

Page 361: Cristian Frasinaru-Curs Practic de Java.pdf

360 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

A tentie

In nic i un caz core c titud inea unui p rog ram nu tre b uie sa se b az e z e p em e cansim ul d e p lanificare a fire lor d e e x e cutie , d eoare c e ac esta p oate fi d ife ritd e la un siste m d e op erare la altul.

U n fir d e e x e cutie d e lung a d urata si care nu ce d eaz a e x p lic it p roc esorul laanum ite interv ale d e tim p astfe l ınc at sa p oata fi ex e cutate si c e le lalte fire d ee x e cutie se num e ste fir d e e x e cutie ego ist. E v id ent, tre b uie e v itata sc rie rea lorıntruc at acap areaz a p e te rm en ned efinit p roc esorul, b loc and e fe c tiv e x e cutiac e lorlalte fire d e e x e cutie p ana la term inarea sa. U ne le siste m e le d e op e r-are com b at ac est tip d e com p ortam ent p rin m etod a aloc arii p roc esorului ıncuante d e tim p fie c arui fir d e e x e cutie , ınsa nu tre b uie sa ne b az am p e ac estlucru la scrie rea unui p rog ram . U n fir d e e x e cutie tre b uie sa fie ” core c t”fatad e c e le lalte fire si sa c e d e z e p e riod ic p roc esorul astfe l ınc at toate sa aib ap osib ilitatea d e a se e x e cuta.

L isting 12.5: E x e m p lu d e fir d e e x e cutie ” e g oist”

class FirEgoist extends Thread {

public FirEgoist(String name) {

super(name);

}

public void run() {

int i = 0;

while (i < 100000) {

// Bucla care acapareaza procesorul

i ++;

if (i % 100 == 0)

System.out.println(getName () + " a ajuns la " + i);

// yield ();

}

}

}

public class TestFirEgoist {

public static void main(String args []) {

FirEgoist s1 , s2;

s1 = new FirEgoist("Firul 1");

s1.setPriority (Thread.MAX_PRIORITY);

s2 = new FirEgoist("Firul 2");

s2.setPriority (Thread.MAX_PRIORITY);

Page 362: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 361

s1.start ();

s2.start ();

}

}

Firul d e e x e cutie s1 are p rioritate m ax im a si p ana nu-si v a term inae x e cutia nu-i v a p erm ite firului s2 sa e x e cute nic i o instruc tiune , acap arande fe c tiv p roc esorul. R e zultatul v a arata astfe l:

Firul 1 a ajuns la 100

Firul 1 a ajuns la 200

Firul 1 a ajuns la 300

...

Firul 1 a ajuns la 99900

Firul 1 a ajuns la 100000

Firul 2 a ajuns la 100

Firul 2 a ajuns la 200

...

Firul 2 a ajuns la 99900

Firul 2 a ajuns la 100000

R e zolv area ac este i p rob le m e se fac e fie p rin interm e d iul m e tod e i static e yielda clase i Thread, care d e te rm ina firul d e e x e cutie curent sa se op reasc a te m -p orar, d and ocaz ia si altor fire sa se e x e cute , fie p rin ” ad orm irea” te m p oraraa firului curent cu ajutorul m e tod e i sleep. P rin m etod a yield un fir d ee x e cutie nu ce d eaz a p roc esorul d e c at fire lor d e e x e cutie care au ace easi p ri-oritate cu a sa si nu ce lor cu p rioritati m ai m ic i. D e com entand linia ın careap e lam yeld d in e x e m p lul anterior, e x e cutia c e lor d oua fire se v a intercala.

...

Firul 1 a ajuns la 31900

Firul 1 a ajuns la 32000

Firul 2 a ajuns la 100

Firul 1 a ajuns la 32100

Firul 2 a ajuns la 200

Firul 2 a ajuns la 300

...

Page 363: Cristian Frasinaru-Curs Practic de Java.pdf

362 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .3 .4 S incronizarea fi relor de ex ecutie

P ana acum am v azut cum p ute m c rea fire d e e x e cutie ind e p end ente si as-incrone , cu alte cuv inte care nu d e p ind ın nic i un fe l d e e x e cutia sau d ere zultate le altor fire . E x ista ınsa num eroase situatii c and fire d e e x e cutiese p arate , d ar care ruleaz a concurent, tre b uie sa com unic e ıntre e le p entrua ac c esa d ife rite resurse com une sau p entru a-si transm ite d inam ic re zul-tate le ” m unc ii” lor. Cel m ai e loc v ent sc enariu ın care fire le d e e x e cutietre b uie sa se com unic e ıntre e le e ste cunoscut sub num e le d e p rob le m a p ro -d u c a to ru lu i/ co n su m a to ru lu i, ın care p rod uc atorul g enereaz a un fl ux d e d atecare este p re luat si p re lucrat d e c atre consum ator.

S a consid e ram d e e x e m p lu o ap licatie J av a ın care un fir d e e x e cutie (p ro-d uc atorul) scrie d ate ıntr-un fisie r ın tim p c e alt fir d e e x e cutie (consum a-torul) c ite ste d ate d in ac e lasi fisie r p entru a le p re lucra. S au, sa p re sup unemc a p rod uc atorul g enereaz a niste num ere si le p laseaz a, p e rand , ıntr-un b uff eriar consum atorul c ite ste num ere le d in ac e l b uff er p entru a le p roc esa. In am -b e le cazuri av e m d e -a fac e cu fire d e e x e cutie concurente care folosesc oresursa com una: un fisie r, re sp e c tiv o zona d e m e m orie si, d in ac est m otiv ,e le tre b uie sincronizate ıntr-o m aniera care sa p e rm ita d e curg e rea norm ala aactiv itatii lor.

12 .3 .5 S cenariul producator / consum ator

P entru a ınte le g e m ai b ine m od alitatea d e sincronizare a d oua fire d e e x e cutiesa im p le m entam e fe c tiv o p rob le m a d e tip p rod uc ator/ consum ator. S a con-sid e ram urm atoarea situatie :

• P rod u c a to ru l g enereaz a num ere le ıntre g i d e la 1 la 10, fie care la uninterv al nere g ulat cup rins ıntre 0 si 100 d e m ilise cund e . P e m asura c ele g enereaz a ınc earc a sa le p lase z e ıntr-o zona d e m e m orie (o v ariab ilaıntreag a) d e und e sa fie c itite d e c atre consum ator.

• C o n su m a to ru l v a p re lua, p e rand , num ere le g enerate d e c atre p ro-d uc ator si v a afisa v aloarea lor p e e c ran.

P entru a fi acc esib ila am b e lor fire d e e x e cutie , v om ıncap sula v ariab ila c e v acontine num ere le g enerate ıntr-un ob ie c t d e sc ris d e c lasa Buffer si care v aav ea d oua m e tod e put (p entru p unerea unui num ar ın b uff er) si g et (p entruob tinerea num arului d in b uff er).

Page 364: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 363

Fara a folosi nic i un m e canism d e sincronizare c lasa Buffer arata astfe l:

L isting 12.6: Clasa Buffer fara sincronizare

class Buffer {

private int number = -1;

public int get() {

return number;

}

public void put(int number) {

this.number = number;

}

}

V om im p le m enta acum c lase le Producator si Consumator care v or d esc riec e le d oua fire d e e x e cutie . A m b e le v or av ea o re fe rinta com una la un ob ie c td e tip Buffer p rin interm e d iul c aruia ısi com unic a v alorile .

L isting 12.7: Clase le Producator si Consumator

class Producator extends Thread {

private Buffer buffer;

public Producator(Buffer b) {

buffer = b;

}

public void run() {

for (int i = 0; i < 10; i++) {

buffer.put(i);

System.out.println("Producatorul a pus:\t" + i);

try {

sleep((int)(Math.random () * 100));

} catch (InterruptedException e) { }

}

}

}

class Consumator extends Thread {

private Buffer buffer;

public Consumator(Buffer b) {

buffer = b;

Page 365: Cristian Frasinaru-Curs Practic de Java.pdf

364 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

}

public void run() {

int value = 0;

for (int i = 0; i < 10; i++) {

value = buffer.get();

System.out.println("Consumatorul a primit :\t" + value);

}

}

}

public class TestSincronizare1 {

public static void main(String [] args) {

Buffer b = new Buffer ();

Producator p1 = new Producator(b);

Consumator c1 = new Consumator(b);

p1.start ();

c1.start ();

}

}

D up a cum ne aste p tam , re zultatul rularii ac estui p rog ram nu v a re zolv anic i p e d e p arte p rob le m a p rop usa d e noi, m otiv ul fiind lip sa oric are i sin-croniz ari ıntre c e le d oua fire d e e x e cutie . M ai p re c is, re zultatul v a fi ce v a d eform a:

Consumatorul a primit: -1

Consumatorul a primit: -1

Producatorul a pus: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Consumatorul a primit: 0

Producatorul a pus: 1

Producatorul a pus: 2

Producatorul a pus: 3

Producatorul a pus: 4

Producatorul a pus: 5

Page 366: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 365

Producatorul a pus: 6

Producatorul a pus: 7

Producatorul a pus: 8

Producatorul a pus: 9

A m b e le fire d e e x e cutie ac c e seaz a re sursa com una, ad ic a ob ie c tul d e tipBuffer, ıntr-o m aniera h aotic a si ac e st lucru se ıntam p la d in d ou m otiv e :

• Consum atorul nu asteap ta ınainte d e a c iti ca p rod uc atorul sa g enere z eun num ar si v a p re lua d e m ai m ulte ori ac e lasi num ar.

• P rod uc atorul nu asteap ta consum atorul sa p re ia num arul g enerat ınainted e a p rod uc e un altul, ın fe lul ac esta consum atorul v a ” rata” cu sig urantaunele num ere (ın cazul nostru ap roap e p e toate).

P rob le m a care se rid ic a ın ac est m om ent este : c ine tre b uie sa se ocup e d esincronizarea c e lor d oua fire d e e x e cutie : c lase le Producator si Consumatorsau resursa com una Buffer ? R asp unsul este e v id ent: resursa com unaBuffer, d eoare c e ea tre b uie sa p e rm ita sau nu acc esul la continutul sau sinu fire le d e e x e cutie care o folosesc . In fe lul ac esta e fortul sincroniz arii e stetransferat d e la p rod uc ator/ consum ator la un niv e l m ai jos, c e l al resurse ic ritic e .

A c tiv itatile p rod uc atorului si consum atorului tre b uie sincronizate la niv e lulresurse i com une ın d oua p riv inte :

• Cele d oua fire d e e x e cutie nu tre b uie sa ac c e se z e sim ultan b uff er-ul;ac est lucru se realiz eaz a p rin b locarea ob ie c tului Buffer atunc i c andeste ac c e sat d e un fir d e e x e cutie , astfe l ınc at nic i nu alt fir d e e x e cutiesa nu-l m ai p oata ac c e sa (v e z i ” M onitoare ” ).

• Cele d oua fire d e e x e cutie tre b uie sa se coord onez e , ad ic a p rod uc atorultre b uie sa g aseasc a o m od alitate d e a ” sp une” consum atorului c a ap lasat o v aloare ın b uff er, iar consum atorul tre b uie sa com unic e p ro-d uc atorului c a a p re luat ac easta v aloare , p entru ca ac esta sa p oata g en-era o alta. P entru a realiza ac easta com unicare , c lasa Thread p une lad isp oz itie m e tod e le wait, notify, notifyAll. (v e z i ” S e m afoare ” ).

Folosind sincronizarea c lasa Buffer v a arata astfe l:

Page 367: Cristian Frasinaru-Curs Practic de Java.pdf

366 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

L isting 12.8: Clasa Buffer cu sincronizare

class Buffer {

private int number = -1;

private boolean available = false;

public synchronized int get() {

while (! available) {

try {

wait();

// Asteapta producatorul sa puna o valoare

} catch (InterruptedException e) {

e.printStackTrace ();

}

}

available = false;

notifyAll ();

return number;

}

public synchronized void put(int number) {

while (available) {

try {

wait();

// Asteapta consumatorul sa preia valoarea

} catch (InterruptedException e) {

e.printStackTrace ();

}

}

this.number = number;

available = true;

notifyAll ();

}

}

R e zultatul ob tinut v a fi ce l scontat:

Producatorul a pus: 0

Consumatorul a primit: 0

Producatorul a pus: 1

Consumatorul a primit: 1

...

Producatorul a pus: 9

Consumatorul a primit: 9

Page 368: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 367

12 .3 .6 M onitoare

D efi nitieU n se g m ent d e cod c e g e stioneaz a o resursa com una m ai m ultor d e fire d e

e x e cutie se p arate concurente se num e ste sec tiu n e critic a . In J av a, o se c tiunecritic a p oate fi un b loc d e instruc tiuni sau o m etod a.

Controlul ac c e sului ıntr-o se c tiune critic a se fac e p rin cuv antul ch e ie sy n-ch ronized. P latform a J av a asoc iaz a un m onitor (” lac at” ) fie c arui ob ie c t alunui p rog ram afl at ın e x e cutie . A c e st m onitor v a ind ica d ac a re sursa critic ae ste ac c e sata d e v reun fir d e e x e cutie sau este lib e ra, cu alte cuv inte ” m on-itoriz eaz a” re sursa resp e c tiv a. In cazul ın care este ac c e sata, v a p une unlac at p e ac easta, astfe l ınc at sa ım p ie d ic e ac c e sul altor fire d e e x e cutie la ea.In m om entul c and resursa este e lib e rata ” lac atul” v a fi elim inat, p entru ap erm ite ac c e sul altor fire d e e x e cutie .

In e x e m p lul d e tip p rod uc ator/ consum ator d e m ai sus, se c tiunile c ritic esunt m etod e le put si get iar resursa critic a com una este ob ie c tul buffer.Consum atorul nu tre b uie sa ac c e se z e b uff er-ul c and p rod ucatorul toc m aip une o v aloare ın e l, iar p rod uc atorul nu tre b uie sa m od ific e v aloarea d inb uff er ın m om entul c and ac easta este c itita d e c atre consum ator.

public synchronized int get() {

...

}

public synchronized void put(int number) {

...

}

S a ob serv am c a am b e le m e tod e au fost d e c larate cu m od ificatorul synchronized.Cu toate ac estea, siste m ul asoc iaz a un m onitor une i instante a c lase i Buffersi nu une i m e tod e anum e . In m om entul ın care e ste ap e lata o m e tod a sin-cronizata, firul d e e x e cutie care a facut ap e lul v a b loca ob ie c tul a c are i m e tod ao ac c eseaz a, c e ea c e ınseam na c a c e le lalte fire d e e x e cutie nu v or m ai p uteaac c esa resurse le c ritic e ale ac e lui ob ie c t. A c e sta este un lucru log ic , d eoare c em ai m ulte se c tiuni critic e ale unui ob ie c t g e stioneaz a d e fap t o sing ura re sursac ritic a.

In e x e m p lul nostru, atunc i c and p rod ucatorul ap e leaz a m e tod a put p en-tru a scrie un num ar, v a b loca tot ob ie c tul buffer, astfe l c a firul d e e x e cutie

Page 369: Cristian Frasinaru-Curs Practic de Java.pdf

368 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

consum ator nu v a av ea ac c es la m e tod a get, si re c ip roc .

public synchronized void put(int number) {

// buffer blocat de producator

...

// buffer deblocat de producator

}

public synchronized int get() {

// buffer blocat de consumator

...

// buffer deblocat de consumator

}

M onitoare fi neA d e seori, folosirea unui m onitor p entru ıntre g ob ie c tul p oate fi p rea restric -tiv a. D e c e sa b loc am toate resurse le unui ob ie c t d ac a un fir d e e x e cutienu d ore ste d e c at ac c e sarea une ia sau a c atorv a d intre e le ? D eoare c e oric eob ie c t are un m onitor, p ute m folosi ob ie c te fictiv e ca lac ate p entru fiecared in resurse le ob ie c tului nostru, ca ın e x e m p lul d e m ai jos:

class MonitoareFine {

//Cele doua resurse ale obiectului

Resursa x, y;

//Folosim monitoarele a doua obiecte fictive

Object xLacat = new Object(),

yLacat = new Object();

public void metoda() {

synchronized(xLacat) {

// Accesam resursa x

}

// Cod care nu foloseste resursele comune

...

synchronized(yLacat) {

// Accesam resursa y

}

Page 370: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 369

...

synchronized(xLacat) {

synchronized(yLacat) {

// Accesam x si y

}

}

...

synchronized(this) {

// Accesam x si y

}

}

}

M e tod a d e m ai sus nu a fost d e c larata cu synchronized c e ea c e ar fi d e -te rm inat b locarea tuturor resurse lor com une la ac c e sarea ob ie c tului resp e c tivd e un fir d e e x e cutie , c i au fost folosite m onitoare le unor ob ie c te fictiv e p entrua controla folosirea fiec are i re sursa ın p arte .

12 .3 .7 S em afoare

Ob ie c tul d e tip Buffer d in e x e m p lul anterior are o v ariab ila m e m b ra p riv atanum ita nu m ber , ın care este m e m orat num arul p e care ıl com unic a p rod u-catorul si p e care ıl p re ia consum atorul. D e ase m enea, m ai are o v ariab ilap riv ata log ic a av ailable care ne d a starea b uff er-ului: d ac a are v aloarea true

ınseam na c a p rod uc atorul a p us o v aloare ın b uff er si consum atorul nu ap re luat-o ınca; d ac a e ste false, consum atorul a p re luat v aloarea d in b uff erd ar p rod uc atorul nu a p us d eocam d ata alta la loc . D e c i, la p rim a v e d e re ,m e tod e le c lase i Buffer ar tre b ui sa arate astfe l:

public synchronized int get() {

while (!available) {

// Nimic - asteptam ca variabila sa devina true

}

available = false;

return number;

}

public synchronized int put(int number) {

while (available) {

Page 371: Cristian Frasinaru-Curs Practic de Java.pdf

370 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

// Nimic - asteptam ca variabila sa devina false

}

available = true;

this.number = number;

}

V arianta d e m ai sus, d e si p are core c ta, nu este . A c easta d eoare c e im -p le m entarea m etod e lor este ” se lfish ” , c e le d oua m e tod e ısi asteap ta ın m ode g oist cond itia d e te rm inare . Ca urm are , core c titud inea func tionarii v a d e -p ind e d e siste m ul d e op erare p e care p rog ram ul este rulat, c e ea c e re p re z intao g re seala d e p rog ram are .

P unerea core c ta a unui fir d e e x e cutie ın aste p tare se realiz eaz a cu m e tod aw ait a clase i Thread, care are urm atoare le form e :

void wait( )

void wait( long timeout )

void wait( long timeout, long nanos )

D up a ap e lul m e tod e i wait, firul d e e x e cutie curent e lib e reaz a m onitorulasoc iat ob ie c tului resp e c tiv si asteap ta ca una d in urm atoare le cond itii sa fieınd e p linita:

• U n alt fir d e e x e cutie inform eaz a p e c e i care ” asteap ta” la un anum itm onitor sa se ” tre z easc a” - ac est lucru se realiz eaz a p rintr-un ap e l alm e tod e i notify A ll sau notify .

• P e rioad a d e aste p atare sp e c ificata a e x p irat.

M e tod a wait p oate p rod uc e e x c e p tii d e tip ul InterruptedException,atunc i c and firul d e e x e cutie care asteap ta (e ste d e c i ın starea ” N ot R unnab le ” )este ıntrerup t d in aste p tare si tre cut fortat ın starea ” R unnab le ” , d e si cond itiaaste p tata nu era ınc a ınd e p linita.

M e tod a notifyAll inform eaz a toate fire le d e e x e cutie care sunt ın aste p tarela m onitorul ob ie c tului curent ınd e p linirea cond itie i p e care o aste p tau. M e tod anotify inform eaz a d oar un sing ur fir d e e x e cutie , sp e c ificat ca arg um ent.

R eam intim v arianta core cta a c lase i Buffer:

L isting 12.9: Folosirea se m afoare lor

class Buffer {

private int number = -1;

Page 372: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE 371

private boolean available = false;

public synchronized int get() {

while (! available) {

try {

wait();

// Asteapta producatorul sa puna o valoare

} catch (InterruptedException e) {

e.printStackTrace ();

}

}

available = false;

notifyAll ();

return number;

}

public synchronized void put(int number) {

while (available) {

try {

wait();

// Asteapta consumatorul sa preia valoarea

} catch (InterruptedException e) {

e.printStackTrace ();

}

}

this.number = number;

available = true;

notifyAll ();

}

}

12 .3 .8 P rob lem e leg ate de sincronizare

D in p acate , folosirea m onitoare lor rid ic a si une le p rob le m e . S a analiz amc ate v a d intre e le si p osib ile le lor solutii:

D eadlockD ead lock -ul este o p rob le m a c lasic a ıntr-un m e d iu ın care ruleaz a m ai m ultefire d e e x e cutie si consta ın fap tul c a, la un m om ent d at, ıntre g p roc esulse p oate b loca d eoare c e unele fire asteap ta d e b locarea unor m onitoare carenu se v or d e b loca nic iod ata. E x ista num eroase e x e m p le ın ac est sens, c eam ai cunoscuta fiind ” P rob le m a filozofilor” . R e form ulata, sa ne im ag inamd oua p e rsoane ” A ” si ” B ” (fire d e e x e cutie ) care stau la ac e easi m asa si tre -

Page 373: Cristian Frasinaru-Curs Practic de Java.pdf

372 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

b uie sa foloseasc a ın com un cutitul si furculita (resurse le com une) p entru am anca. E v id ent, c e le d oua p e rsoane d oresc ob tinerea am b e lor resurse . S ap re sup unem c a ” A ” a otinut cutitul si ” B ” furculita. Firul ” A ” se v a b loca ınaste p tarea e lib e rarii furculite i iar firul ” A ” se v a b loca ın aste p atrea e lib e rariicutitului, c e ea c e cond uc e la starea d e ” d ead lock ” . D e si ac e st e x e m p lu ested e sp rins d e realitate , e x ista num eroase situatii ın care fenom enul d e ” d ead -lock ” se p oate m anife sta, m ulte d intre ac estea fiind d ific il d e d e te c tat.

E x ista c ate v a re g uli c e p ot fi ap licate p entru e v itarea d ead lock -ului:

• Fire le d e e x e cutie sa solic ite resurse le ın ac e easi ord ine . A c easta ab or-d are e lim ina situatiile d e aste p tare c irculara.

• Folosirea unor m onitoare care sa controle z e ac c e sul la un g rup d e resurse .In cazul nostru, p ute m folosi un m onitor ” tac am uri” care tre b uie b locatınainte d e a c ere furculita sau cutitul.

• Folosirea unor v ariab ile care sa inform e z e d isp onib ilitatea resurse lorfara a b loca m onitoare le asoc iate ac estora.

• Cel m ai im p ortat, conc e p e rea une i arh ite c turi a siste m ului care sa e v itep e c at p osib il ap aritia unor p otentiale situatii d e d easlock .

V ariab ile volatileCuv antul ch e ie volatile a fost introd us p entru a controla unele asp e c tele g ate d e op tim iz arile e fe c tuate d e unele com p ilatoare . S a consid e ram urm atorule x e m p lu:

class TestVolatile {

boolean test;

public void metoda() {

test = false;

// *

if (test) {

// Aici se poate ajunge...

}

}

}

Page 374: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .4 . G RUPARE A F IRE L O R D E E X E CUT IE 373

U n com p ilator care op tim iz eaz a cod ul, p oate d e c id e c a v ariab ila test fi-ind setata p e false, corp ul if -ului nu se v a e x e cuta si sa e x c lud a se c v entaresp e c tiv a d in re zultatul com p ilarii. D ac a ac easta c lasa ar fi ınsa ac c e satad e m ai m ulte fire d e e x e cutie , v ariab ile test ar p utea fi setata p e true d e unalt fir, e x act ıntre instruc tiunile d e atrib uire si if ale firului curent.

D e c lararea une i v ariab ile cu m od ificatorul volatile inform eaz a com p ila-torul sa nu op tim iz e z e cod ul ın care ac easta ap are , p re v iz ionand v aloarea p ecare v ariab ila o are la un m om ent d at.

F ire de ex ecutie inaccesib ileU neori fire le d e e x e cutie sunt b locate d in alte m otiv e d e c at aste p tarea laun m onitor, c ea m ai fre c v enta situatie d e ac est tip fiind op eratiunile d e in-trare / ie sire (IO) b locante . Cand ac est lucru se ıntam p la c e le lalte fire d ee x e cutie tre b uie sa p oata ac c e sa ın continuare ob ie c tul. D ar d ac a op e ratiuneaIO a fost facuta ıntr-o m etod a sincronizata, ac est lucru nu m ai e ste p osib il,m onitorul ob ie c tului fiind b locat d e firul care asteap ta d e fap t sa realiz e z eop e ratia d e intrare / ie sire . D in ac est m otiv , op e ratiile IO nu tre b uie facuteın m e tod e sincronizate .

12 .4 G ruparea fi relor de ex ecutie

G rup area fire lor d e e x e cutie p une la d isp oz itie un m e canism p entru m anip u-larea ac estora ca un tot si nu ind iv id ual. D e e x e m p lu, p ute m sa p ornim sau sasusp end am toate fire le d intr-un g rup cu un sing ur ap e l d e m e tod a. G rup areafire lor d e e x e cutie se realiz eaz a p rin interm e d iul c lase i T h readG roup.

Fie care fir d e e x e cutie J av a este m e m b ru al unui g rup , ind ife rent d ac asp e c ific am e x p lic it sau nu acest lucru. A filie rea unui fir la un anum it g rupse realiz eaz a la crearea sa si d e v ine p e rm anenta, ın sensul c a nu v om p uteam uta un fir d intr-un g rup ın altul, d up a c e ac esta a fost creat. In cazul ıncare c re am un fir folosind un constructor care nu sp e c ific a d in c e g rup fac ep arte , e l v a fi p lasat autom at ın ac e lasi g rup cu firul d e e x e cutie care l-acreat. L a p ornirea unui p rog ram J av a se cre eaz a autom at un ob ie c t d e tipThreadGroup cu num e le m ain, care v a re p re z enta g rup ul tuturor fire lor d ee x e cutie c reate d ire c t d in p rog ram si care nu au fost atasate e x p lic it altuig rup . Cu alte cuv inte , p ute m sa ig noram com p le t p lasarea fire lor d e e x e cutieın g rup uri si sa lasam siste m ul sa se ocup e cu ac easta, ad unand u-le p e toate

Page 375: Cristian Frasinaru-Curs Practic de Java.pdf

374 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

ın g rup ul main.E x ista situatii ınsa c and g rup area fire lor d e e x e cutie p oate usura sub stantial

m anev rarea lor. Crearea unui fir d e e x e cutie si p lasarea lui ıntr-un g rup (altuld e c at c e l im p lic it) se realiz eaz a p rin urm atorii constructori ai c lase i Thread:

public Thread(ThreadGroup group, Runnable target)

public Thread(ThreadGroup group, String name)

public Thread(ThreadGroup group, Runnable target, String name)

Fie care d in ac e sti costructori c re eaz a un fir d e e x e cutie , ıl initializ eaz a siıl p laseaz a ıntr-un g rup sp e c ificat ca arg um ent. P entru a afl a c arui g rupap artine un anum it fir d e e x e cutie p ute m folosi m e tod a getThreadGroup aclase i Thread. In e x e m p lul urm ator v or fi create d oua g rup uri, p rim ul cud oua fire d e e x e cutie iar al d oilea cu tre i:

ThreadGroup grup1 = new ThreadGroup("Producatori");

Thread p1 = new Thread(grup1, "Producator 1");

Thread p2 = new Thread(grup1, "Producator 2");

ThreadGroup grup2 = new ThreadGroup("Consumatori");

Thread c1 = new Thread(grup2, "Consumator 1");

Thread c2 = new Thread(grup2, "Consumator 2");

Thread c3 = new Thread(grup2, "Consumator 3");

U n g rup p oate av ea ca p arinte un alt g rup , c e ea c e ınseam na c a fire le d ee x e cutie p ot fi p lasate ıntr-o ie rarh ie d e g rup uri, ın care rad ac ina este g rup ulim p lic it main, ca ın fig ura d e m ai jos:

Page 376: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .4 . G RUPARE A F IRE L O R D E E X E CUT IE 375

S a consid e ram un ex e m p lu ım care listam fire le d e e x e cutie activ e :

L isting 12.10: Folosirea c lase i ThreadGroup

public class TestThreadGroup {

static class Dummy implements Runnable {

public void run() {

while (true)

Thread.yield ();

}

}

public static void main(String args []) {

// Cream o fereastra pentru a fi create

// automat firele de executie din AWT

java.awt.Frame f = new java.awt.Frame("Test");

// Cream un fir propriu

new Thread(new Dummy(), "Fir de test").start ();

// Obtinem o referinta la grupul curent

Thread firCurent = Thread.currentThread ();

ThreadGroup grupCurent = firCurent.getThreadGroup ();

// Aflam numarul firelor de executie active

int n = grupCurent.activeCount ();

// Enumeram firele din grup

Thread [] lista = new Thread[n];

grupCurent.enumerate(lista);

// Le afisam

for (int i=0; i < n; i++)

System.out.println("Thread #" + i + "=" +

lista[i]. getName ());

}

}

Page 377: Cristian Frasinaru-Curs Practic de Java.pdf

376 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .5 Com unicarea prin fl ux uri de tip ” pipe”

O m od alitate d eose b it d e utila p rin care d oua fire d e e x e cutie p ot com unicaeste realizata p rin interm e d iul ca n a lelo r d e co m u n ica tii (p ipes). A c e stea suntim p le m entate p rin fl ux uri d e sc rise d e c lase le :

• P ipedR eader, P ipedW riter - p entru caractere , re sp e c tiv

• P ipedO utputS tream , P ipedInputS tream - p entru octe ti.

Flux urile ” p ip e ” d e ie sire si c e le d e intrare p ot fi conectate p entru aefe c tua transm ite rea d ate lor. A c e st lucru se realiz eaz a uzual p rin inte m e d iulconstructorilor:

public PipedReader(PipedWriterpw)

public PipedWriter(PipedReaderpr)

In cazul ın care este folosit un constructor fara arg um ente , cone ctarea unuifl ux d e intrare cu un fl ux d e ie sire se fac e p rin m etod a connect:

public void connect(PipedWriterpw)

public void connect(PipedReaderpr)

Intruc at fl ux urile care sunt conectate p rintr-un p ip e tre b uie sa e x e cutesim ultan op eratii d e sc rie re / c itire , folosirea lor se v a fac e d in cad rul unor fired e e x e cutie .

Func tionarea ob ic e te lor care instantiaz a PipedWriter si PipedReader

e ste ase m anatoare cu a canale lor d e com unicare U N IX (p ip e s). Fie care cap atal unui canal este utilizat d intr-un fir d e e x e cutie se p arat. L a un cap at sesc riu caractere , la c e lalalt se c ite sc . L a c itire , d ac a nu sunt d ate d isp onib ilefirul d e e x e cutie se v a b loca p ana c e ac estea v or d e v eni d isp onib ile . S e ob serv ac a ac e sta este un com p ortam ent tip ic p rod uc ator-consum ator asincron, fire led e e x e cutie com unic and p rintr-un canal.

R ealizarea conex iunii se fac e astfe l:

PipedWriter pw1 = new PipedWriter();

PipedReader pr1 = new PipedReader(pw1);

// sau

PipedReader pr2 = new PipedReader();

PipedWriter pw2 = new PipedWriter(pr2);

// sau

Page 378: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .5 . CO M UNICARE A PRIN F L UX URI D E T IP ” PIPE ” 377

PipedReader pr = new PipedReader();

PipedWriter pw = new PipedWirter();

pr.connect(pw) //echivalent cu

pw.connect(pr);

S c rie rea si c itirea p e / d e p e canale se realiz eaz a p rin m etod e le uzuale read siwrite, ın toate form e le lor.

S a re consid e ram acum e x e m p lul p rod uc ator/ consum ator p re z entat ante -rior, folosind canale d e com unicatie . P rod uc atorul trim ite d ate le p rintr-unfl ux d e ie sire d e tip DataOutputStream c atre consum ator, care le p rim e step rintr-un fl ux d e intrare d e tip DataInputStream. A c e ste d oua fl ux uri v or fiintercone ctate p rin interm e d iul unor fl ux uri d e tip ” p ip e ” .

L isting 12.11: Folosirea fl ux urilor d e tip ” p ip e ”

import java.io.*;

class Producator extends Thread {

private DataOutputStream out;

public Producator(DataOutputStream out) {

this.out = out;

}

public void run() {

for (int i = 0; i < 10; i++) {

try {

out.writeInt(i);

} catch (IOException e) {

e.printStackTrace ();

}

System.out.println("Producatorul a pus:\t" + i);

try {

sleep((int)(Math.random () * 100));

} catch (InterruptedException e) { }

}

}

}

class Consumator extends Thread {

private DataInputStream in;

public Consumator(DataInputStream in) {

this.in = in;

Page 379: Cristian Frasinaru-Curs Practic de Java.pdf

378 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

}

public void run() {

int value = 0;

for (int i = 0; i < 10; i++) {

try {

value = in.readInt ();

} catch (IOException e) {

e.printStackTrace ();

}

System.out.println("Consumatorul a primit :\t" + value);

}

}

}

public class TestPipes {

public static void main(String [] args)

throws IOException {

PipedOutputStream pipeOut = new PipedOutputStream ();

PipedInputStream pipeIn = new PipedInputStream(pipeOut);

DataOutputStream out = new DataOutputStream(pipeOut);

DataInputStream in = new DataInputStream(pipeIn);

Producator p1 = new Producator(out);

Consumator c1 = new Consumator(in);

p1.start ();

c1.start ();

}

}

12 .6 Clasele T im er si T im erT ask

Clasa Timer ofera o fac ilitate d e a p lanifica d iv e rse ac tiuni p entru a fi real-izate la un anum it m om ent d e c atre un fir d e e x e cutie c e ruleaz a ın fund al.A c tiunile unui ob ie c t d e tip Timer sunt im p le m entate ca instante ale c lase iTimerTask si p ot fi p rog ram ate p entru o sing ura e x e cutie sau p entru e x e cutiire p e tate la interv ale re g ulate .

P asii care tre b uie facuti p entru folosirea unui tim e r sunt:

Page 380: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .6 . CL ASE L E T IM E R SI T IM E RT ASK 379

• Crearea une i sub c lase Actiune a lui TimerTask si sup read efinirea m e tod e irun c e v a contine ac tiunea p e care v re m sa o p lanific am . D up a cumv om v e d ea, p ot fi folosite si c lase anonim e .

• Crearea unui fir d e e x e cutie p rin instantie rea c lase i Timer;

• Crearea unui ob ie c t d e tip Actiune;

• P lanificarea la e x e cutie a ob ie c tuluii d e tip Actiune, folosind m e tod aschedule d in c lasa Timer;

M e tod e le d e p lanificare p e care le av e m la d isp oz itie au urm atoare le for-m ate :

schedule(TimerTask task, Date time)

schedule(TimerTask task, long delay, long period)

schedule(TimerTask task, Date time, long period)

scheduleAtFixedRate(TimerTask task, long delay, long period)

scheduleAtFixedRate(TimerTask task, Date time, long period)

und e , task d e sc rie ac tiunea c e se v a e x e cuta, d elay re p re z inta ıntarz ie rea fatad e m om entul curent d up a care v a ınc e p e e x e cutia, tim e m om entul e x act lacare v a ınc e p e e x e cutia iar p er iod interv alul d e tim p ıntre d oua e x e cutii.

D up a cum se ob serv a, m e tod e le d e p lanificare se ım p art ın d oua cate g orii:

• sch edule - p lanificare cu ıntarz ie re fix a: d ac a d intr-un anum it m otivac tiunea este ıntarz iata, urm atoare le ac tiuni v or fi si e le ıntarz iate ınconse c inta;

• sch eduleA tF ix edR ate - p lanificare cu num ar fix d e rate : d ac a d intr-un anum it m otiv ac tiunea este ıntarz iata, urm atoare le ac tiuni v or fie x e cutata m ai re p e d e , astfe l ınc at num arul total d e ac tiuni d intr-o p e -rioad a d e tim p sa fie tot tim p ul ac e lasi;

U n tim e r se v a op ri natural la term inarea m etod e i sale run sau p oate fiop rit fortat folosind m e tod a cancel. D up a op rirea sa e l nu v a m ai p utea fifolosit p entru p lanificarea altor ac tiuni. D e ase m enea, m e tod a System.exit

v a op rit fortat toate fire le d e e x e cutie si v a term ina ap licatia curenta.

Page 381: Cristian Frasinaru-Curs Practic de Java.pdf

380 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

L isting 12.12: Folosirea c lase lor Timer si TimerTask

import java.util .*;

import java.awt .*;

class Atentie extends TimerTask {

public void run() {

Toolkit.getDefaultToolkit ().beep();

System.out.print(".");

}

}

class Alarma extends TimerTask {

public String mesaj;

public Alarma(String mesaj) {

this.mesaj = mesaj;

}

public void run() {

System.out.println(mesaj);

}

}

public class TestTimer {

public static void main(String args []) {

// Setam o actiune repetitiva , cu rata fixa

final Timer t1 = new Timer();

t1.scheduleAtFixedRate(new Atentie (), 0, 1*1000);

// Folosim o clasa anonima pentru o alta actiune

Timer t2 = new Timer();

t2.schedule(new TimerTask () {

public void run() {

System.out.println("S-au scurs 10 secunde.");

// Oprim primul timer

t1.cancel ();

}

}, 10*1000);

// Setam o actiune pentru ora 22:30

Calendar calendar = Calendar.getInstance ();

calendar.set(Calendar.HOUR_OF_DAY , 22);

calendar.set(Calendar.MINUTE , 30);

calendar.set(Calendar.SECOND , 0);

Date ora = calendar.getTime ();

Page 382: Cristian Frasinaru-Curs Practic de Java.pdf

1 2 .6 . CL ASE L E T IM E R SI T IM E RT ASK 381

Timer t3 = new Timer();

t3.schedule(new Alarma("Toti copiii la culcare!"), ora);

}

}

Page 383: Cristian Frasinaru-Curs Practic de Java.pdf

382 CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

Page 384: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 13

P rog ram are ın retea

13 .1 Introducere

P rog ram area ın re tea im p lic a trim ite rea d e m e saje si d ate ıntre ap licatii c eruleaz a p e calculatoare afl ate ıntr-o re tea locala sau conectate la Internet.P ach e tul care ofe ra sup ort p entru scrie rea ap licatiilor d e re tea este java.net.Clase le d in ac est p ach e t ofera o m od alitate fac ila d e p rog ram are ın re tea, faraa fi nev oie d e cunostinte p realab ile re fe ritoare la com unicarea e fe c tiv a ıntrecalculatoare . Cu toate ac estea, sunt nec esare c ate v a notiuni fund am entalere fe ritoare la re te le cum ar fi: p rotocol, ad resa IP , p ort, sock e t.

Ce este un protocol ?U n p ro toco l re p re z inta o conv entie d e re p re z entare a d ate lor folosita ın com u-nicarea ıntre d oua calculatoare . A v and ın v e d e re fap tul c a oric e inform atiecare tre b uie trim isa p rin re tea tre b uie se rializata astfe l ınc at sa p oata fi trans-m isa se c v ential, octet cu octet, c atre d e stinatie , e ra nev oie d e stab ilirea unorconv entii (p rotocoale) care sa fie folosite atat d e calculatorul care trim ited ate le c at si d e c e l care le p rim e ste , p entru a se ” ınte le g e ” ıntre e le .

D oua d intre c e le m ai utilizate p rotocoale sunt T CP si U D P .

• T C P (T ra n spo rt C o n tro l P ro toco l) e ste un p rotocol c e furniz eaz a unfl ux sig ur d e d ate ıntre d oua calculatoare afl ate ın re tea. A c e st p roto-col asig ura stab ilirea une i conex iuni p e rm anente ıntre c e le d oua calcu-latoare p e p arcursul com unicatie i.

• U D P (U ser D a ta gra m P ro toco l) e ste un p rotocol b azat p e p ach e te ind e -

383

Page 385: Cristian Frasinaru-Curs Practic de Java.pdf

384 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

p end ente d e d ate , num ite d a ta gra m e , trim ise d e la un calculator c atrealtul fara a se g aranta ın v reun fe l ajung erea ac estora la d estinatie sauord inea ın care ac estea ajung . A c e st p rotocol nu stab ile ste o conex iunap e rm anta ıntre c e le d oua calculatoare .

Cum este identifi cat un calculator ın retea ?Oric e calculator conectat la Internet este id entificat ın m od unic d e ad resa saIP (IP e ste acronim ul d e la In tern et P ro toco l). A c easta re p re z inta un num arre p re z entat p e 32 d e b iti, uzual sub form a a 4 octe ti, cum ar fi d e e x e m p lu:193.231.30.131 si e ste num it ad resa IP n u m eric a . Coresp unz atoare une iad rese num eric e e x ista si o ad resa IP sim bo lic a , cum ar fi thor.infoiasi.ro

p entru ad resa num eric a anterioara.

D e ase m enea, fie care calculator afl at ıntr-o re tea locala are un num e unicc e p oat fi folosit la id entificarea locala a ac estuia.

Clasa J av a care re p re z inta notiunea d e ad resa IP e ste InetA ddress.

Ce este un port ?U n calculator are ın g eneral o sing ura le g atura fiz ic a la re tea. Oric e inform atied e stinata une i anum ite m asini tre b uie d e c i sa sp e c ific e ob lig atoriu ad resaIP a ac e le i m asini. Insa p e un calculator p ot e x ista concurent m ai m ultep roc ese care au stab ilite conex iuni ın re tea, aste p tand d iv e rse inform atii.P rin urm are , d ate le trim ise c atre o d estinatie tre b uie sa sp e c ific e p e lang aad resa IP a calculatorului si p roc esul c atre care se ınd reap ta inform atiilere sp e c tiv e . Id entificarea p roc ese lor se realiz eaz a p rin interm d iul porturilor.

U n po rt e ste un num ar p e 16 b iti care id entific a ın m od unic p roc ese lecare ruleaz a p e o anum ita m asina. Oric e ap licatie care realiz eaz a o cone x iuneın re tea v a tre b ui sa atase z e un num ar d e p ort ac e le i cone x iuni. V alorile p ecare le p oate lua un num ar d e p ort sunt cup rinse ıntre 0 si 65535 (d eoare c esunt num ere re p re z entate p e 16 b iti), num ere le cup rinse ıntre 0 si 1023 fiindınsa re z e rv ate unor serv ic ii siste m si, d in ac est m otiv , nu tre b uie folosite ınap licatii.

Clase de b az a din java.netClase le d in java.net p e rm it com unicarea ıntre p roc ese folosind p rotocoale le

Page 386: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .2 . L UCRUL CU URL -URI 385

T CP si U D P si sunt p re z entate ın tab e lul d e m ai jos.

T CP U D PURL DatagramPacket

URLConnection DatagramSocket

Socket MulticastSocket

ServerSocket

13 .2 L ucrul cu U R L -uri

T e rm enul U R L e ste acronim ul p entru U n ifo rm R eso u rce L oca to r si re p re z intao re fe rinta (ad resa) la o resursa afl ata p e Internet. A c easta este ın g eneral unfisie r re p re z entand o p ag ina W e b , un te x t, im ag ine , e tc ., ınsa un U R L p oatere fe ri si interog ari la b az e d e d ate , re zultate ale unor com enz i e x e cutate lad istanta, e tc . M ai jost, sunt p re z entate c ate v a e x e m p le d e U R L -uri sunt:

http://java.sun.com

http://students.infoiasi.ro/index.html

http://www.infoiasi.ro/~acf/imgs/taz.gif

http://www.infoiasi.ro/~acf/java/curs/9/prog_retea.html#url

D up a cum se ob serv a d in e x e m p le le d e m ai sus, un U R L are d oua com -p onente p rinc ip ale :

• Id entificatorul p rotocolului folosit (h ttp , ftp , e tc );

• N um e le resurse i re fe rite . A c e sta are urm atoare le com p onente :

– N um e le calculatorului g az d a (www.infoiasi.ro).

– Calea com p le ta sp re resursa re fe rita ( acf/java/curs/9/prog retea.html).N otatia user se m nific a uzual sub d ire c torul html al d ire c toru-lui re z e rv at p e un serv e r W e b utilizatorului sp e c ificat (HOME). Incazul ın care este sp e c ificat d oar un d ire c tor, fisie rul c e re p re z intare sursa v a fi consid e rat im p lic it index.html.

– Op tional, o re fe rinta d e tip a n ch o r ın cad rul fisie rului re fe rit (#url).

– Op tional, p ortul la care sa se realiz e z e cone x iunea.

Page 387: Cristian Frasinaru-Curs Practic de Java.pdf

386 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

Clasa care p e rm ite lucrul cu U R L -uri e ste java.net.U R L . A c easta arem ai m ulti constructori p entru crearea d e ob ie c te c e re p re z inta re fe rinte c atreresurse afl ate ın re tea, c e l m ai uzual fiind c e l care p rim e ste ca p aram etruun sir d e caractere . In cazul ın care sirul nu re p re z inta un U R L v alid v a fiaruncata o e x c e p tie d e tip ul MalformedURLException.

try {

URL adresa = new URL("http://xyz.abc");

} catch (MalformedURLException e) {

System.err.println("URL invalid !\n" + e);

}

U n ob ie c t d e tip U R L p oate fi folosit p entru:

• A fl area inform atiilor d esp re re sursa re fe rita (num e le calculatorului g az d a,num e le fisie rului, p rotocolul folosit. e tc ).

• Citirea p rintr-un fl ux a continutului fisie rului resp e c tiv .

• Conectarea la ac e l U R L p entru c itirea si sc rie rea d e inform atii.

Citirea continutului unui U R LOric e ob ie c t d e tip URL p oate returna un fl ux d e intrare d e tip InputStream

p entru c itirea continutului sau. S e c v enta stand ard p entru aceasta op e ratiuneeste p re z entata ın e x e m p lul d e m ai jos, ın care afisam continutul resurse isp e c ificata la linia d e com and a. D ac a nu se sp e c ific a m ic i un arg um ent, v a fiafisat fisie rul index.html d e la ad resa: http://www.infoiasi.ro.

L isting 13.1: Citirea continutului unui U R L

import java.net .*;

import java.io.*;

public class CitireURL {

public static void main(String [] args)

throws IOException{

String adresa = "http ://www.infoiasi.ro";

if (args.length > 0)

adresa = args [0];

Page 388: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .3 . SO CK E T -URI 387

BufferedReader br = null;

try {

URL url = new URL(adresa);

InputStream in = url.openStream ();

br = new BufferedReader(new InputStreamReader(in));

String linie;

while ((linie = br.readLine ()) != null) {

// Afisam linia citita

System.out.println(linie);

}

} catch(MalformedURLException e) {

System.err.println("URL invalid !\n" + e);

} finally {

br.close ();

}

}

}

Conectarea la un U R LS e realiz eaz a p rin m etod a openConnection c e stab ile ste o cone x iune b id ire c tionalacu resursa sp e c ificata. A c easta cone x iune este re p re z entata d e un ob ie c t d etip U R L Connection, c e p e rm ite c rearea atat a unui fl ux d e intrare p entruc itirea inform atiilor d e la U R L -ul sp e c ificat, c at si a unui fl ux d e ie sire p entruscrie rea d e d ate c atre ac e l U R L . Op eratiunea d e trim ite re d e d ate d intr-unp rog ram c atre un U R L e ste sim ilara cu trim ite rea d e d ate d intr-un form ulard e tip FORM afl at ıntr-o p ag ina H T M L . M e tod a folosita p entru trim ite re e stePOST.

In cazul trim ite rii d e d ate , ob ie c tul U R L e ste uzual un p roc es c e ruleaz ap e se rv e rul W e b re fe rit p rin U R L -ul resp e c tiv (jsp , se rv le t, c g i-b in, p h p , e tc ).

13 .3 S ock et-uri

D efi nitieU n socket (soclu ) e ste o ab strac tiune softw are folosita p entru a re p re z enta

fiecare d in c e le d oua ” cap ete ” ale une i conex iuni ıntre d oua p roc ese c e ruleaz aıntr-o re tea. Fie care sock e t este atasat unui p ort astfe l ınc at sa p oata id en-tifica unic p rog ram ul c aruia ıi sunt d estinate d ate le .

Page 389: Cristian Frasinaru-Curs Practic de Java.pdf

388 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

S ock e t-urile sunt d e d oua tip uri:

• T CP , im p le m entate d e c lase le Socket si ServerSocket;

• U D P , im p le m entate d e c lasa DatagramSocket.

O ap licatie d e re tea c e folose ste sock e t-uri se ıncad reaz a ın m od e lul clien-t/ server d e conc e p e re a une i ap licatii. In ac est m od e l ap licatia este form atad in d oua cate g orii d istincte d e p rog ram e num ite servere , re sp e c tiv clien ti.

P rog ram e le d e tip se rv e r sunt c e le care ofera d iv e rse se rv ic ii e v entualilorc lienti, fiind ın stare d e aste p tare atata v re m e c at nic i un client nu le solic itase rv ic iile . P rog ram e le d e tip c lient sunt c e le care initiaz a conv ersatia cu unserv e r, solic itand un anum it serv ic iu. U zual, un serv e r tre b uie sa fie cap ab il satrate z e m ai m ulti c lienti sim ultan si, d in ac est m otiv , fie care c e re re ad resatase rv e rului v a fi tratata ıntr-un fir d e e x e cutie se p arat.

Inc e p and cu v ersiunea 1.4 a p latform e i stand ard J av a, e x ista o c lasa utili-tara care im p le m enteaz a o p e re ch e d e tip ul (a d resa IP , n u m a r po rt). A c eastaeste InetS ock etA ddress (d e riv ata d in SocketAddress), ob ie c te le sale fiindutilizate d e constructori si m e tod e d efinite ın cad rul c lase lor c e d e sc riu sock -e turi, p entru a sp e c ifica c e i d oi p aram etri ne c e sari id entific arii unui p roc escare trim ite sau re c e p tioneaz a d ate ın re tea.

13 .4 Com unicarea prin conex iuni

In ac est m od e l se stab ile ste o conex iune T CP ıntre o ap licatie c lient si oap licatie se rv e r care furniz eaz a un anum it serv ic iu. A v antajul p rotocolulT CP / IP e ste c a asig ura realizarea une i com unic ari stab ile , p e rm anente ınre tea, e x istand sig uranta c a inform atiile trim ise d e un p roc es v or fi re c e p tionatecore c t si com p le t la d estinatie sau v a fi se m nalata o e x c e p tie ın caz contrar.

L e g atura ıntre un client si un serv e r se realiz eaz a p rin interm e d iul ad oua ob ie c te d e tip S ock et, c ate unul p entru fiecare cap at al ” canalului”d e com unicatie d intre c e i d oi. L a niv e lul c lientului crearea sock e tului se re -aliz eaz a sp e c ific and ad resa IP a serv e rului si p ortul la care ruleaz a ac esta,constructorul uzual folosit fiind :

Socket(InetAddress address, int port)

Page 390: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .4 . CO M UNICARE A PRIN CO NE X IUNI 389

L a niv e lul serv e rului, ac esta tre b uie sa c re e z e ıntai un ob ie c t d e tipS erverS ock et. A c e st tip d e sock e t nu asig ura com unicarea e fe c tiv a cuc lientii c i e ste resp onsab il cu ” ascultarea” re te le i si c rearea unor ob ie c te d etip Socket p entru fiecare c e re re ap aruta, p rin interm e d iul c aruia v a fi real-izata le g atura cu c lientul. Crearea unui ob ie c t d e tip ServerSocket se fac esp e c ific and p ortul la care ruleaz a se rv e rul, constructorul folosit fiind :

ServerSocket(int port)

M e tod a c lase i ServerSocket care asteap ta ” asculta” re teaua este accept.A c easta b loch eaz a p roc esul p arinte p ana la ap aritia unui c e re ri si re turneaz aun nou ob ie c t d e tip Socket c e v a asig ura com unicarea cu c lientul. B locareap oate sa nu fie p erm anenta c i d oar p entru o anum ita p e rioad a d e tim p -ac easta v a fi sp e c ificata p rin m e tod a setS oT im eout, cu arg um entul d at ınm ilise cund e .

P entru fiecare d in c e le d oua sock e turi d e sch ise p ot fi create ap oi d ouafl ux uri p e octe ti p entru c itirea, resp e c tiv sc rie rea d ate lor. A c e st lucru se re -aliz eaz a p rin interm e d iul m e tod e lor g etInputS tream , re sp e c tuv g etO ut-putS tream . Flux urile ob tinute v or fi folosite ım p reuna cu fl ux uri d e p roc e -sare care sa asig ure o com unicare fac ila ıntre c e le d oua p roc ese . In func tied e sp e c ificul ap licatie i ac e stea p ot fi p ere ch ile :

• BufferedReader, BufferedWriter si PrintWriter - p entru com uni-care p rin interm e d iul sirurilor d e caractere ;

• DataInputStream, DataOutputStream - p entru com unicare p rin d atep rim itiv e ;

• ObjectInputStream, ObjectOutputStream - p entru com inicare p rininterm e d iul ob ie c te lor;

Page 391: Cristian Frasinaru-Curs Practic de Java.pdf

390 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

S tructura g enerala a unui serv e r b azat p e conex iuni este :

1. Creeaza un obiect de tip ServerSocket la un anumit port

while (true) {

2. Asteapta realizarea unei conexiuni cu un client,

folosind metoda accept;

(va fi creat un obiect nou de tip Socket)

3. Trateaza cererea venita de la client:

3.1 Deschide un flux de intrare si primeste cererea

3.2 Deschide un flux de iesire si trimite raspunsul

3.3 Inchide fluxurile si socketul nou creat

}

E ste re com and at ca tratarea c e re rilor sa se realiz e z e ın fire d e e x e cutiese p arate , p entru ca m etod a accept sa p oata fi reap e lata c at m ai re p e d e ınv e d e rea stab ilirii cone x iunii cu un alt c lient.

S tructura g enerala a unui c lient b azat p e conex iuni este :

1. Citeste sau declara adresa IP a serverului si portul

la care acesta ruleaza;

2. Creeaza un obiect de tip Socket cu adresa si portul specificate;

3. Comunica cu serverul:

3.1 Deschide un flux de iesire si trimite cererea;

3.2 Deschide un flux de intrare si primeste raspunsul;

3.3 Inchide fluxurile si socketul creat;

In e x e m p lul urm ator v om im p le m enta o ap licatie c lient-serv e r folosindcom unicarea p rin conex iuni. Clientul v a trim ite se rv e rului un num e iar ac estav a rasp und e p rin m esajul ” H e llo nu m e” . T ratarea c e re rilor se v a fac e ın fired e e x e cutie se p arate .

L isting 13.2: S tructura unui serv e r b azat p e conex iuni

import java.net .*;

import java.io.*;

class ClientThread extends Thread {

Socket socket = null;

public ClientThread(Socket socket) {

this.socket = socket;

Page 392: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .4 . CO M UNICARE A PRIN CO NE X IUNI 391

}

public void run() {

// Executam solicitarea clientului

String cerere , raspuns;

try {

// in este fluxul de intrare de la client

BufferedReader in = new BufferedReader(new

InputStreamReader(

socket.getInputStream () ));

// out este flux de iesire catre client

PrintWriter out = new PrintWriter(

socket.getOutputStream ());

// Primim cerere de la client

cerere = in.readLine ();

// Trimitem raspuns clientului

raspuns = "Hello " + cerere + "!";

out.println(raspuns);

out.flush();

} catch (IOException e) {

System.err.println("Eroare IO \n" + e);

} finally {

// Inchidem socketul deschis pentru clientul curent

try {

socket.close ();

} catch (IOException e) {

System.err.println("Socketul nu poate fi inchis \n" +

e);

}

}

}

}

public class SimpleServer {

// Definim portul pe care se gaseste serverul

// (in afara intervalului 1 -1024)

public static final int PORT = 8100;

public SimpleServer () throws IOException {

ServerSocket serverSocket = null;

Page 393: Cristian Frasinaru-Curs Practic de Java.pdf

392 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

try {

serverSocket = new ServerSocket(PORT);

while (true) {

System.out.println("Asteptam un client ...");

Socket socket = serverSocket.accept ();

// Executam solicitarea clientului intr -un fir de

executie

ClientThread t = new ClientThread(socket);

t.start();

}

} catch (IOException e) {

System.err.println("Eroare IO \n" + e);

} finally {

serverSocket.close ();

}

}

public static void main(String [] args) throws IOException {

SimpleServer server = new SimpleServer ();

}

}

L isting 13.3: S tructura unui c lient b azat p e cone x iuni

import java.net .*;

import java.io.*;

public class SimpleClient {

public static void main(String [] args) throws IOException {

// Adresa IP a serverului

String adresaServer = "127.0.0.1";

// Portul la care serverul ofera serviciul

int PORT = 8100;

Socket socket = null;

PrintWriter out = null;

BufferedReader in = null;

String cerere , raspuns;

try {

socket = new Socket(adresaServer , PORT);

Page 394: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .5 . CO M UNICARE A PRIN D AT AG RAM E 393

out = new PrintWriter(socket.getOutputStream (), true);

in = new BufferedReader(new InputStreamReader(

socket.getInputStream ()));

// Trimitem o cerere la server

cerere = "Duke";

out.println(cerere);

// Asteaptam raspunsul de la server (" Hello Duke !")

raspuns = in.readLine ();

System.out.println(raspuns);

} catch (UnknownHostException e) {

System.err.println("Serverul nu poate fi gasit \n" + e)

;

System.exit (1);

} finally {

if (out != null)

out.close();

if (in != null)

in.close ();

if (socket != null)

socket.close ();

}

}

}

13 .5 Com unicarea prin datag ram e

In ac est m od e l nu ex ista o conex iune p e rm anenta ıntre c lient si se rv e r p rininterm e d iul c are ia sa se realiz e z e com unicarea. Clientul trim ite c e re rea c atrese rv e r p rin interm e d iul unuia sau m ai m ultor p ach e te d e d ate ind e p end ente ,se rv e rul le re c e p tioneaz a, e x trag e inform atiile continute si re turneaz a rasp unsultot p rin interm e d iul p ach e te lor. U n astfe l d e p ach e t se num e ste d a ta gra m asi e ste re p re z entat p rintr-un ob ie c t d in c lasa D atag ram P ack et. R utaread atag ram e lor d e la o m asina la alta se fac e e x c lusiv p e b aza inform atiilorcontinute d e ac estea. P rim irea si trim ite rea d atag ram e lor se realiz eaz a p rininterm e d iul unui sock e t, m od e lat p rin interm e d iul c lase i D atag ram S ock et.

Page 395: Cristian Frasinaru-Curs Practic de Java.pdf

394 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

D up a cum am m entionat d e ja, d e zav antajul ac este i m e tod e e ste c a nug aranteaz a ajung erea la d estinatie a p ach e te lor trim ise si nic i c a v or fi p rim iteın ac e easi ord inie ın care au fost e x p e d iate . P e d e alta p arte , e x ista situatiiın care ac este lucruri nu sunt im p ortante si ac e st m od e l e ste d e p re fe rat c e luib azat p e conex iuni care solic ita m ult m ai m ult atat serv e rul c at si c lientul. D efap t, p rotocolul T CP / IP folose ste tot p ach e te p entru trim ite rea inform atiilord intr-un nod ın altul al re te le i, cu d eose b irea c a asig ura re sp e c tarea ord inii d etransm ite re a m esaje lor si v e rific a ajung erea la d estinatie a tuturor p ach e te lor- ın cazul ın care unul nu a ajuns, ac esta v a fi retrim is autom at.

Clasa DatagramPacket contine urm atorii constructori:

DatagramPacket(byte[] buf, int length,

InetAddress address, int port)

DatagramPacket(byte[] buf, int offset, int length,

InetAddress address, int port)

DatagramPacket(byte[] buf, int offset, int length,

SocketAddress address)

DatagramPacket(byte[] buf, int length,

SocketAddress address)

DatagramPacket(byte[] buf, int length)

DatagramPacket(byte[] buf, int offset, int length)

P rim e le d oua p e re ch i d e constructori sunt p entru creare p ach e te lor c ev or fi ex pediate, d ife renta ıntre e le fiind utilizarea c lase lor InetAddress,re sp e c tiv SocketAddress p entru sp e c ificarea ad rese i d e sinatie .

A tre i p e re ch e d e constructori e ste folosita p entru crearea unui p ach e t ıncare v or fi receptionate d ate , e i nesp e c ific and v reo sursa sau d estinatie .

Page 396: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .5 . CO M UNICARE A PRIN D AT AG RAM E 395

D up a c rearea unui p ach e t p roc esul d e trim ite re si p rim ire a ac estuia im -p lic a ap e lul m e tod e lor send si receive ale c lase i DatagramSocket. D eoare c etoate inform atii sunt inc luse ın d atag ram a, ac e lasi sock e t p oate fi folosit atatp entru trim ite rea d e p ach e te , e v entual c atre d e stinatii d ife rite , c at si p entrure c e p tionarea ac estora d e la d iv e rse surse . In cazul ın care re folosim p ach e te ,p ute m sch im b a continutul ac estora cu m etod a setD ata, p re cum si ad resa lacare le trim ite m p rin setA ddress, setP ort si setS ock etA ddress.

E x trag erea inform atiilor contiunte d e un p ach e t se realiz eaz a p rin m e tod ag etD ata d in c lasa DatagramPacket. D e ase m enea, ac easta c lasa ofe ra m e tod ep entru afl area ad rese i IP si a p ortului p roc esului care a trim is d atag ram a,p entru a-i p utea rasp und e d ac a e ste ne c esar. A c e stea sunt: g etA dress,g etP ort si g etS ock etA ddress.

L isting 13.4: S tructura unui serv e r b azat p e d atag ram e

import java.net .*;

import java.io.*;

public class DatagramServer {

public static final int PORT = 8200;

private DatagramSocket socket = null;

DatagramPacket cerere , raspuns = null;

public void start() throws IOException {

socket = new DatagramSocket(PORT);

try {

while (true) {

// Declaram pachetul in care va fi receptionata

cererea

byte[] buf = new byte [256];

cerere = new DatagramPacket(buf , buf.length);

System.out.println("Asteptam un pachet ...");

socket.receive(cerere);

// Aflam adresa si portul de la care vine cererea

InetAddress adresa = cerere.getAddress ();

int port = cerere.getPort ();

// Construim raspunsul

Page 397: Cristian Frasinaru-Curs Practic de Java.pdf

396 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

String mesaj = "Hello " + new String(cerere.getData ()

);

buf = mesaj.getBytes ();

// Trimitem un pachet cu raspunsul catre client

raspuns = new DatagramPacket(buf , buf.length , adresa ,

port);

socket.send(raspuns);

}

} finally {

if (socket != null)

socket.close ();

}

}

public static void main(String [] args) throws IOException {

new DatagramServer ().start ();

}

}

L isting 13.5: S tructura unui c lient b azat p e d atag ram e

import java.net .*;

import java.io.*;

public class DatagramClient {

public static void main(String [] args) throws IOException {

// Adresa IP si portul la care ruleaza serverul

InetAddress adresa = InetAddress.getByName("127.0.0.1");

int port =8200;

DatagramSocket socket = null;

DatagramPacket packet = null;

byte buf [];

try {

// Construim un socket pentru comunicare

socket = new DatagramSocket ();

// Construim si trimitem pachetul cu cererea catre

server

buf = "Duke".getBytes ();

Page 398: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .6 . T RIM IT E RE A D E M E SAJ E CAT RE M AI M UL T I CL IE NT I 397

packet = new DatagramPacket(buf , buf.length , adresa ,

port);

socket.send(packet);

// Asteaptam pachetul cu raspunsul de la server

buf = new byte [256];

packet = new DatagramPacket(buf , buf.length);

socket.receive(packet);

// Afisam raspunsul (" Hello Duke !")

System.out.println(new String(packet.getData ()));

} finally {

if (socket != null)

socket.close ();

}

}

}

13 .6 T rim iterea de m esaje catre m ai m ulti

clienti

D iv e rse situatii im p un g rup area m ai m ultor c lienti astfe l ınc at un m esaj (p a-ch e t) trim is p e ad resa g rup ului sa fie re c e p tionat d e fie care d intre ac e stia.G rup area m ai m ultor p rog ram e ın v e d e rea trim ite rii m ultip le d e m e saje serealiz eaz a p rin interm e d iul unui sock e t sp e c ial, d e sc ris d e c lasa M ulticast-S ock et, e x tensie a c lase i DatagramSocket.

U n g rup d e c lienti ab onati p entru trim ite re m ultip la este sp e c ificat p rintr-o ad resa IP d in interv alul 224.0.0.1 - 239.255.255.255 si un p ort U D P .A d re sa 224.0.0.0 e ste re z e rv ata si nu tre b uie folosita.

Page 399: Cristian Frasinaru-Curs Practic de Java.pdf

398 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

L isting 13.6: Inre g istrarea unui c lient ıntr-un g rup

import java.net .*;

import java.io.*;

public class MulticastClient {

public static void main(String [] args) throws IOException {

// Adresa IP si portul care reprezinta grupul de clienti

InetAddress group = InetAddress.getByName("230.0.0.1");

int port =4444;

MulticastSocket socket = null;

byte buf [];

try {

// Ne alaturam grupului aflat la adresa si portul

specificate

socket = new MulticastSocket(port);

socket.joinGroup(group);

// Asteaptam un pachet venit pe adresa grupului

buf = new byte [256];

DatagramPacket packet = new DatagramPacket(buf , buf.

length);

System.out.println("Asteptam un pachet ...");

socket.receive(packet);

Page 400: Cristian Frasinaru-Curs Practic de Java.pdf

1 3 .6 . T RIM IT E RE A D E M E SAJ E CAT RE M AI M UL T I CL IE NT I 399

System.out.println(new String(packet.getData ()).trim())

;

} finally {

if (socket != null) {

socket.leaveGroup(group);

socket.close ();

}

}

}

}

L isting 13.7: T ransm ite rea unui m esaj c atre un g rup

import java.net .*;

import java.io.*;

public class MulticastSend {

public static void main(String [] args) throws IOException {

InetAddress grup = InetAddress.getByName("230.0.0.1");

int port = 4444;

byte[] buf;

DatagramPacket packet = null;

// Cream un socket cu un numar oarecare

DatagramSocket socket = new DatagramSocket (0);

try {

// Trimitem un pachet catre toti clientii din grup

buf = (new String("Salut grup!")).getBytes ();

packet = new DatagramPacket(buf , buf.length , grup , port

);

socket.send(packet);

} finally {

socket.close ();

}

}

}

Page 401: Cristian Frasinaru-Curs Practic de Java.pdf

400 CAPIT O L UL 1 3 . PRO G RAM ARE IN RE T E A

Page 402: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 14

A ppleturi

14 .1 Introducere

D efi nitie

U n a p p let re p re z inta un p rog ram J av a d e d im ensiuni re d use c e g e stioneaz ao sup rafata d e afisare (container) care p oate fi inc lusa ıntr-o p ag ina W e b . U nastfe l d e p rog ram se m ai num e ste m in ia p lica tie .

Ca oric e alta ap licatie J av a, cod ul unui ap p le t p oate fi form at d in una saum ai m ulte c lase . U na d intre ac estea este p rin cipa la si e x tind e c lasa Applet,ac easta fiind c lasa c e tre b uie sp e c ificata ın d ocum entul H T M L c e d e sc riep ag ina W e b ın care d orim sa inc lud e m ap p le tul.

D ife renta fund am entala d intre un ap p le t si o ap licatie consta ın fap tul c aun ap p le t nu p oate fi e x e cutat ind e p end ent, c i v a fi e x e cutat d e b row serulın care este ınc arcata p ag ina W e b c e contine ap p le tul resp e c tiv . O ap licatieind e p end enta e ste e x e cutata p rin ap e lul interp re torului ja va , av and ca ar-g um ent num e le c lase i p rinc ip ale a ap licatie i, c lasa p rinc ip ala fiind c ea carecontine m e tod a m a in . Cic lul d e v iata al unui ap p le t este com p le t d ife rit,fiind d ic tat d e e v enim ente le g enerate d e c atre b row ser la v izualizarea d ocu-m entului H T M L c e contine ap p le tul.

P ach e tul care ofera sup ort p entru crearea d e ap p le turi e ste java.applet,c ea m ai im p ortanta c lasa fiind A pplet. In p ach e tul javax .sw ing e x istasi c lasa JA pplet, care e x tind e Applet, ofe rind sup ort p entru crearea d eap p le turi p e arh ite c tura d e com p onente J FC/ S w ing .

401

Page 403: Cristian Frasinaru-Curs Practic de Java.pdf

402 CAPIT O L UL 1 4 . APPL E T URI

Ie rarh ia c lase lor d in care d e riv a ap p le turile e ste p re z entata ın fig ura d em ai jos:

Fiind d e riv ata d in c lasa Container, c lasa Applet d e sc rie d e fap t sup rafe ted e afisare , ase m enea c lase lor Frame sau Panel.

14 .2 Crearea unui applet sim plu

Crearea structurii d e fisie re si com p ilarea ap p le t-urilor sunt id entic e ca ıncazul ap licatiilor. D ife ra ın sch im b structura p rog ram ului si m od ul d e rularea ac estuia. S a p arg uream ın continuare ac e sti p asi p entru a realiza un ap p le te x tre m d e sim p lu, care afiseaz a o im ag ine si un sir d e caractere .

1. S crierea codului sursa

import java.awt.* ;

import java.applet.* ;

public class FirstApplet extends Applet {

Image img;

public void init() {

img = getImage(getCodeBase(), "taz.gif");

}

Page 404: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .2 . CRE ARE A UNUI APPL E T SIM PL U 403

public void paint (Graphics g) {

g.drawImage(img, 0, 0, this);

g.drawOval(100,0,150,50);

g.drawString("Hello! My name is Taz!", 110, 25);

}

}

P entru a p utea fi ex e cutata d e b row se r, c lasa p rinc ip ala a ap p le tului tre -b uie sa fie p ub lic a.

2 . S alvarea fi sierelor sursa

Ca oric e c lasa p ub lic a, c lasa p rinc ip ala a ap p le tului v a fi salv ata ıntr-unfisie r cu ac e lasi num e si e x tensia .java. A sad ar, v om salv a c lasa d e m ai susıntr-un fisie r FirstApplet.java.

3 . Com pilarea

Com p ilarea se fac e la fe l ca si la ap licatiile ind e p end ente , folosind com p i-latorul javac ap e lat p entru fisie rul c e contine ap p le tul.

javac FirstApplet.java

In cazul ın care com p ilarea a reusit v a fi g enerat fisie rul FirstApplet.class.

4 . R ularea appletului

A p p le t-urile nu ruleaza ind e p end ent. E le p ot fi rulate d oar p rin inter-m e d iul unui b row ser: Internet E x p lorer, N e tscap e , M oz illa, Op era, e tc . saup rintr-un p rog ram sp e c ial cum ar fi appletview er d in k itul d e d e z v oltareJ 2S D K . P entru a ex e cuta un ap p le t tre b uie sa fac e m d oua op eratii:

• Crearea unui fi sier H T M L ın care v om inc lud e ap p le t-ul. S a con-sid e ram fisie rul simplu.html, av and continutul d e m ai jos:

Page 405: Cristian Frasinaru-Curs Practic de Java.pdf

404 CAPIT O L UL 1 4 . APPL E T URI

<html>

<head>

<title>Primul applet Java</title>

</head>

<body>

<applet code=FirstApplet.class width=400 height=400>

</applet>

</body>

</html>

• V izualizarea appletului: se d e sch id e fisie rul simplu.html folosindunul d in b row ser-e le am intite sau efe c tuand ap e lul:appletviewer simplu.html.

14 .3 Ciclul de viata al unui applet

E x e cutia unui ap p le t ınc e p e ın m om entul ın care un b row ser afiseaz a o p ag inaW e b ın care este inc lus ap p le tul resp e c tiv si p oate tre c e p rin m ai m ulte e tap e .Fie care e tap a e ste strans le g ata d e un ev enim ent g enerat d e c atre b row ser sid e te rm ina ap e larea une i m e tod e sp e c ific e d in c lasa c e im p le m enteaz a ap p le -tul.

• Incarcarea ın m em orieE ste c reata o instanta a c lase i p rinc ip ale a ap p le tului si ıncarcata ınm e m orie .

• InitializareaE ste ap e lata m e tod a init c e p e rm ite initializarea d iv e rse lor v ariab ile ,c itirea unor p aram etri d e intrare , e tc .

• P ornireaE ste ap e lata m e tod a start

• E x ecutia propriu-z isaConsta ın interac tiunea d intre utilizator si com p onente le afisate p esup rafata ap p le tului sau ın e x e cutarea unui anum it cod ıntr-un fir d ee x e cutie . In unele situatii ıntreag a e x e cutie a ap p le tului se consum a laetap e le d e initializare si p ornire .

Page 406: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .3 . CICL UL D E V IAT A AL UNUI APPL E T 405

• O prirea tem poraraIn cazul ın care utilizatorul p arase ste p ag ina W e b ın care ruleaz a ap p le -tul este ap e lata m e tod a stop a acestuia, d and u-i astfe l p osib ilitatea saop reasca te m p orar e x e cutia sa p e p e rioad a ın care nu este v iz ib il, p entrua nu consum a inutil d in tim p ul p roc esorului. A c e lasi lucru se ıntam p lad ac a fe reastra b row serului este m inim izata. In m om entul c and p ag inaW e b c e contine ap p le tul d e v ine d in nou activ a, v a fi reap e lata m e tod astart.

• O prirea defi nitivaL a ınch id e rea tuturor instante lor b row serului folosit p entru v izualizare ,ap p le tul v a fi elim inat d in m e m orie si v a fi ap e lata m e tod a destroy aacestuia, p entru a-i p e rm ite sa e lib e re z e re surse le d e tinute . A p e lulm e tod e i destroy e ste ıntotd eauna p re c e d at d e ap e lul lui stop.

M etodele specifi ce appleturilor

A sad ar, e x ista o serie d e m e tod e sp e c ific e ap p le turilor c e sunt ap e late au-tom at la d iv e rse e v enim ente g enerate d e c atre b row se r. A c e stea sunt d efiniteın c lasa Applet si sunt enum erate ın tab e lul d e m ai jos:

M etoda S ituatia ın care este apelatainit L a initializarea ap p le tului. T eoretic , ac easta m e tod a

ar tre b ui sa se ap e le z e o sing ura d ata, la p rim aafisare a ap p le tului ın p ag ina, ınsa, la unele b row se re ,e ste p osib il ca ea sa se ap e le z e d e m ai m ulte ori.

start Im e d iat d up a initializare si d e fie care d atac and ap p le tul re d e v ine activ , d up a o op rire te m p orara.

stop D e fie care d ata c and ap p le tul nu m ai este v iz ib il(p ag ina W e b nu m ai este v iz ib ila, fe reastra b row seruluieste m inim izata, e tc ) si ınainte d e destroy.

destroy L a ınch id e rea ultim e i instante a b row seruluicare a ınc arcat ın m e m orie c lasa p rinc ip ala a ap p le tului.

A tentie

Page 407: Cristian Frasinaru-Curs Practic de Java.pdf

406 CAPIT O L UL 1 4 . APPL E T URI

A c e ste m e tod e sunt ap e late autom at d e b row ser si nu tre b uie ap e latee x p lic it d in p rog ram !

S tructura g enerala a unui applet

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

public class StructuraApplet extends Applet {

public void init() {

}

public void start() {

}

public void stop() {

}

public void destroy() {

}

}

14 .4 Interfata g rafi ca cu utilizatorul

D up a cum am v azut, c lasa Applet e ste o e x tensie a sup erc lase i Container,c e ea c e ınseam na c a ap p le turile sunt, ınainte d e toate , sup rafe te d e afisare .P lasarea com p onente lor, g e stionarea p oz itionarii lor si tratarea e v enim ente lorg enerate se realiz eaz a la fe l ca si ın cazul ap licatiilor. U zual, ad aug area com -p onente lor p e sup rafata ap p le tului p re cum si stab ilirea ob ie c te lor resp ons-ab ile cu tratarea e v enim ente lor g enerate sunt op eratiuni c e v or fi realizate ınm e tod a init.

Page 408: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .4 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL 407

G estionarul d e p oz itionare im p lic it e ste FlowLayout, ınsa ac esta p oate fisch im b at p rin m etod a setLayout.

Page 409: Cristian Frasinaru-Curs Practic de Java.pdf

408 CAPIT O L UL 1 4 . APPL E T URI

D esenarea pe suprafata unui appletE x ista o cate g orie ıntreag a d e ap p le turi c e nu com unic a cu utilizatorul

p rin interm e d iul com p onente lor c i, e x e cutia lor se re zum a la d iv e rse op eratiunid e d e senare realizate ın m e tod a paint. R eam intim c a m e tod a paint e ste re -sp onsab ila cu d efinirea asp e c tului g rafic al oric are i com p onente . Im p lic it,m e tod a paint d in c lasa Applet nu realiz eaz a nim ic , d e c i, ın cazul ın cared orim sa d e senam d ire c t p e sup rafata unui ap p le t v a fi nev oie sa sup rad efinimac easta m e tod a.

public void paint(Graphics g) {

// Desenare

...

}

In cazul ın care este aleasa ac easta solutie , e v enim ente le tratate uzual v or fic e le g enerate d e m ouse sau tastatura.

14 .5 D efi nirea si folosirea param etrilor

P aram etrii sunt p entru ap p le turi c e ea c e arg um ente le d e la linia d e com and asunt p entru ap licatiile ind e p end ente . E i p e rm it utilizatorului sa p e rsonaliz e z easp e c tul sau com p ortarea unui ap p le t fara a-i sch im b a cod ul si re com p ilac lase le .

D efi nirea p aram etrilor se fac e ın cad rul tag ului APPLET d in d ocum en-tul H T M L c e contine ap p le tul si sunt id entificati p rin atrib utul P A R A M .Fie care p aram etru are un num e , sp e c ificat p rin N A M E si o v aloare , sp e c i-ficata p rin V A L U E , ca ın e x e m p lul d e m ai jos:

<APPLET CODE="TestParametri.class" WIDTH=100 HEIGHT=50

<PARAM NAME=textAfisat VALUE="Salut">

<PARAM NAME=numeFont VALUE="Times New Roman">

<PARAM NAME=dimFont VALUE=20>

</APPLET>

Ca si ın cazul arg um ente lor trim ise ap licatiilor d e la linia d e com and a, tip ulp aram etrilor este ıntotd eauna sir de caractere, ind ife rent d ac a v aloareaeste ıntre g h ilim e le sau nu.

Fie care ap p le t are si un set d e p aram etri p re stab iliti ale c aror num e nuv or p utea fi folosite p entru d efinirea d e noi p aram etri folosind m e tod a d e

Page 410: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .5 . D E F INIRE A SI F O L O SIRE A PARAM E T RIL O R 409

m ai sus. A c e stia ap ar d ire c t ın corp ul tag ului APPLET si d efinesc inform atiig enerale d e sp re ap p le t. E x e m p le d e astfe l d e p aram etri sunt CODE, WIDTH sauHEIGHT. L ista lor com p le ta v a fi p re z entata la d escrie rea tag ului APPLET.

F olosirea p aram etrilor p rim iti d e c atre un ap p le t se fac e p rin interm e d iulm e tod e i g etP aram eter care p rim e ste ca arg um ent num e le unui p aram etrusi re turneaz a v aloarea ac estuia. In cazul ın care nu ex ista nic i un p aram etrucu num e le sp e c ificat, m e tod a ıntoarc e null, caz ın care p rog ram ul tre b uiesa atrib uie o v aloare im p lic ita v ariab ile i ın care se d orea c itirea resp e c tiv uluip aram etru.

Oric e ap p le t p oate p une la d isp oz itie o ” d ocum entatie ” re fe ritoare la p ara-m e trii p e care ıi sup orta, p entru a v eni ın ajutorul utilizatorilor care d oresc sainc lud a ap p le tul ıntr-o p ag ina W e b . A c easta se realiz eaz a p rin sup rad efiniream etod e i g etP aram eterInfo, care returneaz a un v e c tor form at d in trip le ted e siruri. Fie care e le m ent al v e c torului este d e fap t un v e ctor cu tre i e le m ented e tip String, c e le tre i siruri re p re z entand n u m ele p aram etrului, tip u l sau sio d escriere a sa. Inform atiile furnizate d e un ap p le t p ot fi c itite d in b row serulfolosit p entru v izualizare p rin m etod e sp e c ific e ac estuia. D e e x e m p lu, ın ap -p le tv ie w e r inform atiile d e sp re p aram etri p ot fi v izualizate la rub rica In fo d inm eniul Ap p let, ın N e tscap e se folose ste op tiunea P a ge in fo d in m eniul V iew ,e tc .

S a sc rie m un ap p le t care sa afise z e un te x t p rim it ca p aram etru, folosindun font cu num e le si d im ensiunea sp e c ificate d e ase m enea ca p aram etri.

L isting 14.1: Folosirea p aram etrilor

import java.applet.Applet;

import java.awt .*;

public class TestParametri extends Applet {

String text , numeFont;

int dimFont;

public void init() {

text = getParameter("textAfisat");

if (text == null)

text = "Hello"; // valoare implicita

numeFont = getParameter("numeFont");

if (numeFont == null)

numeFont = "Arial";

Page 411: Cristian Frasinaru-Curs Practic de Java.pdf

410 CAPIT O L UL 1 4 . APPL E T URI

try {

dimFont = Integer.parseInt(getParameter("dimFont"));

} catch(NumberFormatException e) {

dimFont = 16;

}

}

public void paint(Graphics g) {

g.setFont(new Font(numeFont , Font.BOLD , dimFont));

g.drawString(text , 20, 20);

}

public String [][] getParameterInfo () {

String [][] info = {

// Nume Tip Descriere

{"textAfisat", "String", "Sirul ce va fi afisat"},

{"numeFont", "String", "Numele fontului"},

{"dimFont", "int", "Dimensiunea fontului"}

};

return info;

}

}

14 .6 T ag -ul A P P L E T

S intax a com p le ta a tag ului A P P L E T , cu ajutorul c aruia p ot fi inc luse ap p le -turi ın cad rul p ag inilor W e b e ste :

<APPLET

CODE = clasaApplet

WIDTH = latimeInPixeli

HEIGHT = inaltimeInPixeli

[ARCHIVE = arhiva.jar]

[CODEBASE = URLApplet]

[ALT = textAlternativ]

[NAME = numeInstantaApplet]

[ALIGN = aliniere]

[VSPACE = spatiuVertical]

Page 412: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .6 . T AG -UL APPL E T 411

[HSPACE = spatiuOrizontal] >

[< PARAM NAME = parametru1 VALUE = valoare1 >]

[< PARAM NAME = parametru2 VALUE = valoare2 >]

...

[text HTML alternativ]

</APPLET>

A trib ute le p use ıntre p arante z e p atrate sunt op tionale .

• CO D E = cla saAp p letN um e le fisie rului c e contine c lasa p rinc ip ala a ap p le tului. A c e sta v afi c autat ın d ire c torul sp e c ificat d e CODEBASE. N u p oate fi ab solut sitre b uie ob lig atoriu sp e c ificat. E x tensia ” .c lass” p oate sau nu sa ap ara.

• W ID T H = la tim eIn P ixeli, H E IG H T = in a ltim eIn P ixeliS p e c ific a latim ea si ınaltim ea sup rafe te i ın care v a fi afisat ap p le tul.S unt ob lig atorii.

• A R CH IV E = a rh iva .ja rS p e c ific a arh iv a ın care se g ase sc c lase le ap p le tului.

• CO D E B A S E = d irecto rAp p letS p e c ific a U R L -ul la care se g ase ste c lasa ap p le tului. U zual se e x p rim are lativ la d ire c torul d ocum entului H T M L . In cazul ın care lip se ste , seconsid e ra im p lic it U R L -ul d ocum entului.

• A L T = textAltern a tivS p e c ific a te x tul c e tre b uie afisat d ac a b row serul ınte le g e tag ul APPLETd ar nu p oate rula ap p le turi J av a.

• N A M E = n u m eIn sta n taAp p letOfera p osib ilitatea d e a d a un num e resp e c tiv e i instante a ap p le tu-lui, astfe l ınc at m ai m ulte ap p le turi afl ate p e ac e easi p ag ina sa p oatacom unica ıntre e le folosind u-se d e num e le lor.

• A L IG N = a lin iereS e m nific a m od alitatea d e alinie re a ap p le tului ın p ag ina W e b . A c e statrib ut p oate p rim i una d in urm atoare le v alori: left, right, top,

Page 413: Cristian Frasinaru-Curs Practic de Java.pdf

412 CAPIT O L UL 1 4 . APPL E T URI

texttop, middle, absmiddle, baseline, bottom, absbottom , se m inificatiilelor fiind ac e leasi ca si la tag ul IMG.

• V S P A CE = spa tiu V ertica l, H S P A CE = spa tiu Orizo n ta lS p e c ific a num arul d e p ix e li d intre ap p le t si m arg inile sup rafete i d eafisare .

• P A R A MT ag -urile PARAM sunt folosite p entru sp e c ificarea p aram etrilor unui ap -p le t (v e z i ” Folosirea p aram etrilor” ).

• text H T M L a ltern a tivE ste te x tul c e v a fi afisat ın cazul ın care b row serul nu ınte le g e tag ulAPPLET. B row se re le J a va -en a bled v or ig nora ac est te x t.

14 .7 F olosirea fi relor de ex ecutie ın appleturi

L a ınc arcarea une i p ag ini W e b , fie c arui ap p le t ıi e ste c reat autom at un fird e e x e cutie re sp onsab il cu ap e larea m e tod e lor ac estuia. A c e stea v or rulaconcurent d up a re g ulile d e p lanificare im p le m entate d e m asina v irtuala J av aa p latform e i folosite .

D in p unctul d e v e d e re al interfe te i g rafice ınsa, fie care ap p le t afl at p e op ag ina W e b are ac c e s la un acelasi fir d e e x e cutie , c reat d e ase m enea autom atd e c atre b row ser, si care este resp onsab il cu d esenarea ap p le tului (ap e lulm e tod e lor update si paint) p re cum si cu transm ite rea m esaje lor g enerated e c atre com p onente . Intruc at toate ap p le turile d e p e p ag ina ” ım p art” ac estfir d e e x e cutie , nic i unul nu tre b uie sa ıl solic ite ın m od e x c e siv , d eoare c e v ap rov oca func tionarea anorm ala sau ch iar b locarea c e lorlalte .

In cazul ın care d orim sa e fe c tuam op eratiuni consum atoare d e tim p e stere com and at sa le realiz am ıntr-un alt fir d e e x e cutie , p entru a nu b locainterac tiunea utilizatorului cu ap p le tul, re d e senarea ac estuia sau activ itateac e lorlalte ap p le turi d e p e p ag ina.

S a consid e rm am m ai ıntai d oua ab ord ari g re site d e lucru cu ap p le turi.D orim sa c re am un ap p le t care sa afise z e la coord onate aleatoare m e sajul” H e llo” , cu p auz a d e o se cund a ıntre d oua afisari. P rim a v arianta, g re sita d ealtfe l, ar fi:

Page 414: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .7 . F O L O SIRE A F IRE L O R D E E X E CUT IE IN APPL E T URI 413

L isting 14.2: Incore c t: b locarea m etod e i paint

import java.applet .*;

import java.awt .*;

public class AppletRau1 extends Applet {

public void paint(Graphics g) {

while(true) {

int x = (int)(Math.random () * getWidth ());

int y = (int)(Math.random () * getHeight ());

g.drawString("Hello", x, y);

try {

Thread.sleep (1000);

} catch (InterruptedException e) {}

}

}

}

M otiv ul p entru care ac est ap p le t nu func tioneaz a core c t si p rob ab il v ad uc e la anom alii ın func tionarea b row serului este c a firul d e e x e cutie carese ocup a cu d esenarea v a ram ane b locat ın m etod a paint, ınc e rc and sa oterm ine . Ca re g ula g enerala, cod ul m e tod e i paint tre b uie sa fie c at m aisim p lu d e e x e cutat c e ea c e , e v id ent, nu este cazul ın ap p le tul d e m ai sus.

O alta id e e d e re zolv are care ne -ar p utea v eni, d e ase m enea g re sita, e steurm atoarea :

L isting 14.3: Incore c t: ap p le tul nu term ina initializarea

import java.applet .*;

import java.awt .*;

public class AppletRau2 extends Applet {

int x, y;

public void init() {

while(true) {

x = (int)(Math.random () * getWidth ());

y = (int)(Math.random () * getHeight ());

repaint ();

try {

Thread.sleep (1000);

} catch (InterruptedException e) {}

}

}

public void paint(Graphics g) {

Page 415: Cristian Frasinaru-Curs Practic de Java.pdf

414 CAPIT O L UL 1 4 . APPL E T URI

g.drawString("Hello", x, y);

}

}

P entru a p utea d a o solutie core c ta p rob le m e i p rop use , tre b uie sa folosimun fir d e e x e cutie p rop riu. S tructura unui ap p le t care d oreste sa lanse z e unfir d e e x e cutie p oate av ea d oua form e . In p rim a situatie ap p le tul p orne stefirul la initialzarea sa iar ac esta v a rula, ind ife rent d ac a ap p le tul m ai e ste saunu v iz ib il, p ana la op rirea sa naturala (term inarea m etod e i run) sau p ana laınch id e rea sesiunii d e lucru a b row serului.

L isting 14.4: Core ct: folosirea unui fir d e e x e cutie p rop riu

import java.applet .*;

import java.awt .*;

public class AppletCorect1 extends Applet implements Runnable

{

int x, y;

Thread fir = null;

public void init() {

if (fir == null) {

fir = new Thread(this);

fir.start();

}

}

public void run() {

while(true) {

x = (int)(Math.random () * getWidth ());

y = (int)(Math.random () * getHeight ());

repaint ();

try {

Thread.sleep (1000);

} catch (InterruptedException e) {}

}

}

public void paint(Graphics g) {

g.drawString("Hello", x, y);

}

}

In cazul ın care firul d e e x e cutie p ornit d e ap p le t e fe c tueaz a op e ratii c e

Page 416: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .7 . F O L O SIRE A F IRE L O R D E E X E CUT IE IN APPL E T URI 415

au sens d oar d ac a ap p le tul este v iz ib il, cum ar fi anim atie , ar fi d e d oritca ac esta sa se op reasca atunc i c and ap p le tul nu m ai este v iz ib il (la ap e lulm e tod e i stop) si sa re p orneasca atunc i c and ap p le tul re d e v ine v iz ib il (laap e lul m e tod e i start). U n ap p le t este consid e rat a ctiv im e d iat d up a ap e lulm e tod e i start si d e v ine inactiv la ap e lul m e tod e i stop. P entru a afl a d ac aun ap p le t este activ se folose ste m e tod a isA ctive.

S a m od ific am p rog ram ul anterior, ad aug and si un contor care sa num ereafisarile d e m e saje - ac esta nu va fi incre m entat p e p e rioad a ın care ap p le tulnu este activ .

L isting 14.5: Folosirea m e tod e lor start si stop

import java.applet .*;

import java.awt .*;

public class AppletCorect2 extends Applet implements Runnable

{

int x, y;

Thread fir = null;

boolean activ = false;

int n = 0;

public void start() {

if (fir == null) {

fir = new Thread(this);

activ = true;

fir.start();

}

}

public void stop() {

activ = false;

fir = null;

}

public void run() {

while(activ) {

x = (int)(Math.random () * getWidth ());

y = (int)(Math.random () * getHeight ());

n ++;

repaint ();

try {

Thread.sleep (1000);

} catch (InterruptedException e) {}

Page 417: Cristian Frasinaru-Curs Practic de Java.pdf

416 CAPIT O L UL 1 4 . APPL E T URI

}

}

public void paint(Graphics g) {

g.drawString("Hello " + n, x, y);

}

}

A tentie

E ste p osib il ca unele b row sere sa nu ap e le m e tod a stop ın situatiilep re v azute ın sp e cfic iatiile ap p le turilor. D in ac est m otiv , core c titud inea unuiap p le t nu tre b uie sa se b az e z e p a ac est m e canism .

14 .8 A lte m etode oferite de clasa A pplet

P e lang a m e tod e le d e b az a: init, start, stop, destroy, c lasa Applet

ofera m e tod e sp e c ific e ap p le t-urilor cum ar fi:

P unerea la dispoz itie a unor inform atii despre appletS im ilara cu m e tod a getParameterInfo c e ofe rea o ” d ocum entatie ” d e sp rep aram etrii p e care ıi ac c e p ta un ap p le t, e x ista m e tod a g etA ppletInfo c e p e r-m ite sp e c ificarea unor inform atii le g ate d e ap p le t cum ar fi num e le , autorul,v e rsiunea, e tc . M e tod a returneaz a un sir d e caractere continand inform atiilere sp e c tiv e .

public String getAppletInfo() {

return "Applet simplist, autor necunoscut, ver 1.0";

}

A fl area adreselor U R L referitoare la appletS e realiz eaz a cu m etod e le :

Page 418: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .8 . AL T E M E T O D E O F E RIT E D E CL ASA APPL E T 417

• g etCodeB ase - c e re turneaz a U R L -ul d ire c torului c e contine c lasaap p le tului;

• g etD ocum entB ase - re turneaz a U R L -ul d ire c torului c e contine d oc -um entul H T M L ın care este inc lus ap p le tul resp e c tiv .

A c e ste m e tod e sunt foarte utile d eoare c e p e rm it sp e c ificarea re lativ a a unorfisie re folosite d e un ap p le t, cum ar fi im ag ini sau sunete .

A fi sarea unor m esaje ın b ara de stare a b row seruluiA c e st lucru se realiz eaz a cu m etod a sh ow S tatus

public void init() {

showStatus("Initializare applet...");

}

A fi sarea im ag inilorA fisarea im ag inilor ıntr-un ap p le t se fac e fie p rin interm e d iul une i com p o-nente c e p e rm ite ac est lucru, cum ar fi o sup rafata d e d e senare d e tip Canvas,fie d ire c t ın m e tod a paint a ap p le t-ului, folosind m e tod a drawImage a clase iGraphics. In am b e le cazuri, ob tinerea une i re fe rinte la im ag inea resp e c tiv ase v a fac e cu ajutorul m e tod e i g etIm ag e d in c lasa Applet. A c easta p oatep rim i ca arg um ent fie ad resa U R L ab soluta a fisie rului c e re p re z inta im ag -inea, fie calea re lativ a la o anum ita ad resa U R L , cum ar fi c ea a d ire c toruluiın care se g ase ste d ocum entul H T M L c e contine ap p le tul (getDocumentBase)sau a d ire c torului ın care se g ase ste c lasa ap p le tului (getCodeBase).

L isting 14.6: A fisarea im ag inilor

import java.applet.Applet;

import java.awt .*;

public class Imagini extends Applet {

Image img = null;

public void init() {

img = getImage(getCodeBase (), "taz.gif");

}

Page 419: Cristian Frasinaru-Curs Practic de Java.pdf

418 CAPIT O L UL 1 4 . APPL E T URI

public void paint(Graphics g) {

g.drawImage(img , 0, 0, this);

}

}

A fl area contex tului de ex ecutieConte x tul d e e x e cutie al unui ap p le t se re fe ra la p ag ina ın care ac esta ruleaz a,e v entual ım p reuna cu alte ap p le turi, si e ste d e sc ris d e interfata A ppletCon-tex t. Crearea unui ob ie c t c e im p le m enteaz a ac easta interfata se realiz eaz a d ec atre b row se r, la ap e lul m e tod e i g etA ppletContex t a clase i Applet. P rininterm e d iul ac este i interfe te un ap p le t p oate ” v e d ea” ın jurul sau, p utandcom unica cu alte ap p le t-uri afl ate p e ac e easi p ag ina sau cere b row ser-ului sad e sch id a d iv e rse d ocum ente .

AppletContext contex = getAppletContext();

A fi sarea unor docum ente ın b row serS e fac e cu m etod a sh ow D ocum ent c e p rim e ste ad resa U R L a fisie rului c econtine d ocum entul p e care d orim sa-l d e sch id e m (te x t, h tm l, im ag ine , e tc ).A c easta m e tod a e ste ac c e sata p rin interm e d iul conte x tului d e e x e cutie alap p le tului.

try {

URL doc = new URL("http://www.infoiasi.ro");

getAppletContext().showDocument(doc);

} catch(MalformedURLException e) {

System.err.println("URL invalid! \n" + e);

}

Com unicarea cu alte applet-uriA c easta com unicare im p lic a d e fap t id entificarea unui ap p le t afl at p e ac e easip ag ina si ap e larea une i m e tod e sau setarea une i v ariab ile p ub lic e a ac estuia.Id entificarea se fac e p rin interm e d iu num e lui p e care oric e instanta a unuiap p le t ıl p oate sp e c ifica p rin atrib utul NAME.

Page 420: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .8 . AL T E M E T O D E O F E RIT E D E CL ASA APPL E T 419

Ob tinerea une i re fe rinte la un ap p le t al c arui num e ıl cunoaste m sauob tinerea une i enum erari a tuturor ap p le t-urilor d in p ag ina se fac p rin in-term e d iul conte x tului d e e x e cutie , folosind m e tod e le g etA pplet, re sp e c tivg etA pplets.

R edarea sunetelorClasa Applet ofera si p osib ilitatea re d arii d e sunete ın form at .au. A c e steasunt d escrise p rin interm e d iul unor ob ie c te c e im p le m enteaz a interfata A u-dioClip d in p ach e tul java.applet. P entru a re d a un sunet afl at ıntr-unfisie r ” .au” la un anum it U R L e x ista d oua p osib ilitati:

• Folosirea m etod e i play d in c lasa Applet care p rim e ste ca arg um entU R L -ul la care se afl a sunetul; ac esta p oate fi sp e c ificat ab solut saure lativ la U R L -ul ap p le tului

• Crearea unui ob ie c t d e tip AudioClip cu m etod a g etA udioClip ap oiap e larea m e tod e lor start, loop si stop p entru acesta.

L isting 14.7: R e d area sunete lor

import java.applet .*;

import java.awt .*;

import java.awt.event .*;

public class Sunete extends Applet implements ActionListener{

Button play = new Button("Play");

Button loop = new Button("Loop");

Button stop = new Button("Stop");

AudioClip clip = null;

public void init() {

// Fisierul cu sunetul trebuie sa fie in acelasi

// director cu appletul

clip = getAudioClip(getCodeBase (), "sunet.au");

add(play);

add(loop);

add(stop);

play.addActionListener(this);

loop.addActionListener(this);

stop.addActionListener(this);

Page 421: Cristian Frasinaru-Curs Practic de Java.pdf

420 CAPIT O L UL 1 4 . APPL E T URI

}

public void actionPerformed(ActionEvent e) {

Object src = e.getSource ();

if (src == play)

clip.play();

else if (src == loop)

clip.loop();

else if (src == stop)

clip.stop();

}

}

In cazul ın care ap p le tul folose ste m ai m ulte tip uri d e sunete , e ste re co-m and at ca ınc arcarea ac estora sa fie facuta ıntr-un fir d e e x e cutie se p arat,p entru a nu b loca te m p orar activ itatea fireasc a a p rog ram ului.

14 .9 A rh ivarea appleturilor

D up a cum am v azut, p entru ca un ap p le t afl at p e o p ag ina W e b sa p oatafi e x e cutat cod ul sau v a fi transferat d e p e se rv e rul care g az d uie ste p ag inaW e b solic itata p e m asina c lientului. D eoare c e transferul d ate lor p rin re teaeste un p roc es lent, cu c at d im ensiunea fisie rlor care form eaz a ap p le tul estem ai re d usa, cu ata ınc arcarea ac estuia se v a fac e m ai re p e d e . M ai m ult, d ac aap p le tul contine si alte c lase ın afara d e c ea p rinc ip ala sau d iv e rse resurse(im ag ini, sunete , e tc ), ac estea v or fi transferate p rin re tea ab ia ın m om entulın care v a fi nev oie d e e le , op rind te m p orar activ itatea ap p le tului p ana laınc arcarea lor. D in ac este m otiv e , c ea m ai efic ienta m od alitate d e a d istrib uiun ap p le t este sa arh iv am toate fisie re le ne c e sare ac estuia.

A rh ivarea fi sierelor unui applet se fac e cu utilitarul jar, ofe rit ınd istrib utia J 2S D K .

// Exemplu

jar cvf arhiva.jar ClasaPrincipala.class AltaClasa.class

imagine.jpg sunet.au

// sau

jar cvf arhiva.jar *.class *.jpg *.au

Page 422: Cristian Frasinaru-Curs Practic de Java.pdf

1 4 .1 0 . RE ST RICT II D E SE CURIT AT E 421

Includerea unui applet arh ivat ıntr-o p ag ina W e b se realiz eaz a sp e -c ific and p e lang a num e le c lase i p rinc ip ale si num e le arh iv e i care o contine :

<applet archive=arhiva.jar code=ClasaPrincipala

width=400 height=200 />

14 .10 R estrictii de securitate

D eoare c e un ap p le t se e x e cuta p e m asina utilizatorului care a solic itat p ag -ina W e b c e contine ap p le tul resp e c tiv , e ste foarte im p ortant sa e x iste anu-m ite re stric tii d e se curitate care sa controle z e activ itatea ac estuia, p entru ap re v eni ac tiuni rau intentionate , cum ar fi ste rg e ri d e fisie re , e tc ., care saad uc a p re jud ic ii utilizatorului. P entru a realiza ac est lucru, p roc esul careruleaz a ap p le turi instaleaz a un m anag er d e se curitate , ad ic a un ob ie c t d etip SecurityManager care v a ” sup erv iza” activ itatea m etod e lor ap p le tului,arunc and e x c e p tii d e tip Security Exception ın cazul ın care una d in ac es-tea ınc earc a sa e fe c tue z e o op eratie ne p e rm isa.

U n ap p le t nu p oate sa:

• Citeasc a sau sa sc rie fisie re p e calculatorul p e care a fost ıncarcat(c lient).

• D e sch id a cone x iuni cu alte m asini ın afara d e c ea d e p e care p rov ine(h ost).

• P orneasc a p rog ram e p e m asina c lient.

• Citeasc a d iv e rse p rop rie tati ale siste m ului d e op e rare al c lientului.

Ferestre le folosite d e un ap p le t, alte le d e c at c ea a b row serului, v or arataaltfe l d e c at ıntr-o ap licatie ob isnuita, ind ic and fap tul c a au fost create d e unap p le t.

14 .11 A ppleturi care sunt si aplicatii

D eoare c e c lasa Applet e ste d e riv ata d in Container, d e c i si d in Component,ea d esc rie o sup rafata d e afisare care p oate fi inc lusa ca oric e alta com p onentaıntr-un alt container, cum ar fi o fereastra. U n ap p le t p oate func tiona si cao ap licatie ind e p end enta astfe l:

Page 423: Cristian Frasinaru-Curs Practic de Java.pdf

422 CAPIT O L UL 1 4 . APPL E T URI

• A d aug am m e tod a main c lase i care d e sc rie ap p le tul, ın care v om fac eop eratiunile urm atoare .

• Cre am o instanta a ap p le tului si o ad aug am p e sup rafata une i fe re stre .

• A p e lam m e tod e le init si start, care ar fi fost ap e late autom at d ec atre b row ser.

• Face m fe reastra v iz ib ila.

L isting 14.8: A p p le t si ap licatie

import java.applet.Applet;

import java.awt .*;

public class AppletAplicatie extends Applet {

public void init() {

add(new Label("Applet si aplicatie"));

}

public static void main(String args []) {

AppletAplicatie applet = new AppletAplicatie ();

Frame f = new Frame("Applet si aplicatie");

f.setSize (200, 200);

f.add(applet , BorderLayout.CENTER);

applet.init();

applet.start ();

f.show();

}

}

Page 424: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 15

L ucrul cu b aze de date

15 .1 Introducere

15 .1.1 G eneralitati despre b aze de date

A p licatiile care folosesc b az e d e d ate sunt, ın g eneral, ap licatii com p le x efolosite p entru g estionarea unor inform atii d e d im ensiuni m ari ıntr-o m anierasig ura si efic ienta.

Ce este o b az a de date ?L a niv e lul c e l m ai g eneral, o ba za d e d a te re p re z inta o m od alitate d e stocare aunor inform atii (d ate) p e un sup ort e x te rn, cu p osib ilitatea re g asirii ac e stora.U zual, o b az a d e d ate e ste m e m orata ıntr-unul sau m ai m ulte fisie re .

M od e lul c lasic d e b az e d e d ate este c e l rela tio n a l, ın care d ate le suntm e m orate ın tab e le . U n tab e l re p re z inta o structura d e d ate form ata d intr-om ultim e d e articole , fie care articol av and d efinite o serie d e atrib ute - ac esteatrib ute coresp und coloanelor tab e lului, ın tim p c e o linie v a re p re z enta unarticol. P e lang a tab e le , o b az a d e d ate m ai p oate contine : p roc e d uri sifunc tii, utilizatori si g rup uri d e utilizatori, tip uri d e d ate , ob ie c te , e tc .

D intre p rod uc atorii c e i m ai im p ortanti d e b az e d e d ate am intim com -p aniile Orac le , S y b ase , IB M , Inform ix , M ic rosoft, e tc . fie care furniz and oserie ıntreag a d e p rod use si utilitare p entru lucrul cu b az e d e d ate . A c e step rod use sunt ın g eneral re fe rite p rin term enii D B M S (D atab ase M anag e m entS y ste m ) sau, ın trad uc ere , S G B D (S iste m d e G e stiune a B az e lor d e D ate). Inac est cap itol v om analiza lucrul cu b az e d e d ate d in p ersp e c tiv a p rog ram arii

423

Page 425: Cristian Frasinaru-Curs Practic de Java.pdf

424 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

ın lim b ajul J av a, fara a d esc rie p articularitati ale une i solutii d e stocare ad ate lor anum e . V om v e d ea c a, folosind J av a, p ute m c rea ap licatii care sarule z e fara nic i o m od ificare folosind d iv e rse tip uri d e b az e care au ace easistructura, d uc and ın fe lul ac esta notiunea d e p ortab ilitate si m ai d e p arte .

Crearea unei b aze de dateCrearea une i b az e d e d ate se fac e uzual folosind ap licatii sp e c ializate oferited e p rod uc atorul tip ului resp e c tiv d e siste m d e g e stiune a d ate lor, d ar e x istasi p osib ilitatea d e a crea o b aza folosind un scrip t S Q L . A c e st asp e c t ne v ap reocup a ınsa m ai p utin, e x e m p le le p re z entate p resup unand c a b aza a fostcreata d e ja si are o anum ita structura sp e c ificata.

A ccesul la b aza de dateS e fac e p rin interm e d iul unui driver sp e c ific tip ului resp e c tiv d e S G B D .A c e sta este re sp onsab il cu ac c e sul e fe c tiv la d ate le stocate , fiind le g aturad intre ap licatie si b aza d e d ate .

L im b ajul S Q LS Q L (S tructure d Q uery L ang uag e) re p re z inta un lim aj d e p rog ram are c ep e rm ite interog area si actualizarea inform atiilor d in b az e d e d ate re lationale .A c e sta este stand ard izat astfe l ınc at d iv e rse tip uri d e d riv e re sa se com p orteid entic , ofe rind astfe l o m od alitate unitara d e lucru cu b az e d e d ate .

15 .1.2 JD B C

J D B C (J a va D a ta ba se C o n n ectivity ) e ste o interfata stand ard S Q L d e ac c e sla b az e d e d ate . J D B C este constituita d intr-un set d e c lase si interfe te

Page 426: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E 425

scrise ın J av a, furniz and m e canism e stand ard p entru p roie c tantii ap licatiilorc e folosesc d e b az e d e d ate .

Folosind J D B C este usor sa transm ite m se c v ente S Q L c atre b az e d e d atere lationale . Cu alte cuv inte , nu este ne c esar sa sc rie m un p rog ram p entru aacc esa o b az a d e d ate Oracle , alt p rog ram p entru a ac c esa o b az a d e d ateS y b ase si asa m ai d e p arte . E ste d e ajuns sa sc rie m un sing ur p rog ram folosindA P I-ul J D B C si ac esta v a fi cap ab il sa com unic e cu d riv e re d ife rite , trim itandse c v ente S Q L c atre b aza d e d ate d orita. B ine ınte le s, sc riind cod ul sursa ınJ av a, ne este asig urata p ortab ilitatea p rog ram ului. D e c i, iata d oua m otiv ep uternic e care fac com b inatia J av a - J D B C d e m na d e luat ın seam a.

P ach e te le care ofera sup ort p entru lucrul cu b az e d e d ate sunt java.sq lc e re p re z inta nucleul te h nolog ie i J D B C si, p re luat d e p e p latform a J 2E E ,javax .sq l.

In linii m ari, A P I-ul J D B C ofera urm atoare le fac ilitati:

1. S tab ilirea une i conex iuni cu o b az a d e d ate .

2. E fe c tuarea d e se c v ente S Q L .

3. P re lucrarea re zultate lor ob tinute .

15 .2 Conectarea la o b az a de date

P roc esul d e conectare la o b az a d e d ate im p lic a e fe c tuarea a d oua op eratii:

1. Inre g istrarea unui d riv e r coresp unz ator.

2. R ealizarea une i cone x iuni p rop riu-z ise .

D efi nitieO co n exiu n e (sesiu n e) la o b az a d e d ate re p re z inta un conte x t p rin care

sunt trim ise se c v ente S Q L si p rim ite re zultate . Intr-o ap licatie p ot e x istasim ultan m ai m ulte conex iuni la b az e d e d ate d ife rite sau la ac e easi b az a.

Clase le si interfe te le re sp onsab ile cu realizarea une i conex iuni sunt:

• D riverM anag er - e ste c lasa c e se ocup a cu ınre g istrarea d riv e re lor c ev or fi folosite ın ap licatie ;

Page 427: Cristian Frasinaru-Curs Practic de Java.pdf

426 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

• D river - interfata p e care tre b uie sa o im p le m ente z e oric e c lasa c ed e sc rie un d riv e r;

• D riverP roperty Info - p rin interm e d iul ac este i c lase p ot fi sp e c ificated iv e rse p rop rie tati c e v or fi folosite la realizarea conex iunilor;

• Connection - d e sc rie ob ie c te le c e m od e leaz a o conex iune p rop riu-z isacu b aza d e d ate .

15 .2 .1 Inreg istrarea unui driver

P rim ul lucru p e care tre b uie sa-l fac a o ap licatie ın p roc esul d e conectarela o b az a d e d ate este sa ınre g istre z e la m asina v irtuala c e ruleaz a ap licatiad riv e rul J D B C resp onsab il cu com unicarea cu resp e c tiv a b az a d e d ate . A c e stlucru p resup une ınc arcarea ın m e m orie a c lase i c e im p le m enteaz a d riv e r-ul sip oate fi realizata ın m ai m ulte m od alitati.

a. Folosirea c lase i D riverM anag er:DriverManager.registerDriver(new TipDriver());

b . Folosirea m etod e i Class.forN am e c e ap e leaz a ClassL oad er-ul m asiniiv irtuale :Class.forName("TipDriver");

Class.forName("TipDriver").newInstance();

c . S e tarea p rop rie tatii siste m jdb c.drivers, care p oate fi realizata ın d ouafe luri:

– D e la linia d e com and a:java -Djdbc.drivers=TipDriver Aplicatie

– D in p rog ram :System.setProperty("jdbc.drivers", "TipDriver");

Folosind ac easta m e tod a, sp e c ificarea m ai m ultor d riv e re se fac e se p arandnum e le c lase lor cu p unct si v irg ula.

D ac a sunt ınre g istrate m ai m ulte d riv e re , ord inea d e p re c e d enta ın ale g e read riv e rului folosit la crearea une i noi cone x iuni este :

1) D riv e re le ınre g istrate folosind p rop rie tatea jdbc.drivers la initializaream asinii v irtuale c e v a rula p roc esul.

2) D riv e re le ınre g istrate d inam ic d in ap licatie .

Page 428: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E 427

15 .2 .2 S pecifi carea unei b aze de date

O d ata c e un d riv e r J D B C a fost ınre g istrat, ac esta p oate fi folosit la stab ilireaune i cone x iuni cu o b az a d e d ate . A v and ın v e d e re fap tul ca p ot e x ista m aim ulte d riv e re ınc arcate ın m e m orie , tre b uie sa av e m p osib ilitea d e a sp e c ificap e lang a un id entificator al b az e i d e d ate si d riv e rul c e tre b uie folosit. A c eastase realiz eaz a p rin interm e d iul une i ad rese sp e c ific e , num ita JD B C U R L , c eare urm atorul form at:

jdb c:sub -protocol:identifi cator

Cam p ul su b-p ro toco l d enum e ste tip ul d e d riv e r c e tre b uie folosit p entrurealizarea conex iunii si p oate fi od bc, o ra cle, sy ba se, d b2 si asa m ai d e p arte .

Id en tifi ca to ru l ba zei d e d a te e ste un ind icator sp e c ific fie c arui d riv e r core -sp unz ator b az e i d e d ate cu care ap licatia d ore ste sa interac tione z e . In func tied e tip ul d riv e r-ului ac est id entificator p oate inc lud e num e le une i m asinig az d a, un num ar d e p ort, num e le unui fisie r sau al unui d ire c tor, e tc ., caın e x e m p le le d e m ai jos:

jdbc:odbc:test

jdbc:oracle:[email protected]:1521:test

jdbc:sybase:test

jdbc:db2:test

S ub p rotocolul od b c e ste un caz sp e c ical, ın sensul c a p e rm ite sp e c ificareaın cad rul U R L -ului a unor atrib ute c e v or fi realizate la crearea une i conex i-uni. S intax a com p le ta sub p rotocolului od b c e ste :

jd b c :od b c :id entificator[;atrib ut=valoare ]*

jdbc:odbc:test

jdbc:odbc:test;CacheSize=20;ExtensionCase=LOWER

jdbc:odbc:test;UID=duke;PWD=java

L a p rim irea unui J D B C U R L , DriverManager-ul v a p arcurg e lista d riv e re lorınre g istrate ın m e m orie , p ana c and unul d intre e le v a re cunoaste U R L -ul re -sp e c tiv . D ac a nu ex ista nic i unul p otriv it, atunc i v a fi lansata o e x c e p tie d etip ul SQLException, cu m esajul "no suitable driver".

Page 429: Cristian Frasinaru-Curs Practic de Java.pdf

428 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

15 .2 .3 T ipuri de drivere

T ip urile d e d riv e re e x istente c e p ot fi folosite p entru realizarea une i conex iunip rin interm e d iul J D B C se ım p art ın urm atoare le cate g orii:

T ip 1. J D B C -OD B C B rid ge

A c e st tip d e d riv e r p e rm ite cone ctarea la o b az a d e d ate care a fostınre g istrata ın p realab il ın OD B C. OD B C (Op en D atab ase Conectiv ity )re p re z inta o m od alitate d e a uniform iza ac c esul la b az e d e d ate , asoc iindac estora un id entificator D S N (D ata S ourc e N am e ) si d iv e rsi p aram etri ne c e -sari conectarii. Conectarea e fe c tiv a la b aza d e d ate se v a fac e p rin interm e d iulac estui id entificator, d riv e r-ul OD B C efe c tuand com unicarea cu d riv e rul na-tiv al b az e i d e d ate .

D e si sim p lu d e utilizat, solutia J D B C-OD B C nu este p ortab ila si com uni-carea cu b aza d e d ate sufera la niv e lul v ite z e i d e e x e cutie d atorita m ultip le lorre d ire c tari ıntre d riv e re . D e ase m enea, atat OD B C-ul c at si d riv e r-ul nativtre b uie sa e x iste p e m asina p e care ruleaz a ap licatia.

Clasa J av a care d e sc rie ac est tip d e d riv e r J D B C este :

sun.jdb c.odb c.Jdb cO db cD river

si e ste inc lusa ın d istrib utia stand ard J 2S D K . S p e c ificarea b az e i d e d ate sefac e p rintr-un U R L d e form a:

jdb c:odb c:identifi cator

und e id entif icator e ste p rofilul (D S N ) c reat b az e i d e d ate ın OD B C.

T ip 2 . D river J D B C - D river n a tiv

Page 430: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E 429

A c est tip d e d riv e r transform a c e re rile J D B C d ire c t ın ap e luri c atred riv e rul nativ al b az e i d e d ate , care tre b uie instalat ın p realab il. Clase J av acare im p le m enteaz a astfe l d e d riv e re p ot fi p rocurate d e la p rod uc atorii d eS G B D -uri, d istrib utia stand ard J 2S D K ne inc luz and nic i unul.

T ip 3 . D river J D B C - S erver

A c e st tip d e d riv e r transform a c e re rile J D B C folosind un p rotocol d e re teaind e p end ent, ac estea fiind ap oi transorm ate folosind o ap licatie se rv e r ıntr-unp rotocol sp e cfic b az e i d e d ate . Introd uc erea serv e rului ca niv e l interm e d iarad uc e fl e x ib ilitate m ax im a ın sensul c a v or p utea fi realizate conex iuni cud ife rite tip uri d e b az e , fara nic i o m od ificare la niv e lul c lientului. P rotocolulfolosit este sp e c ific fie c arui p rod uc ator.

T ip 4 . D river J D B C n a tiv

Page 431: Cristian Frasinaru-Curs Practic de Java.pdf

430 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

A c e st tip d e d riv e r transform a c e re rile J D B C d ire c t ın c e re ri c atre b azad e d ate folosind p rotocolul d e re tea al ac este ia. A c easta solutie e ste c ea m airap id a, fiind p re fe rata la d e z v oltarea ap licatiilor care m anev reaz a v olum em ari d e d ate si v ite za d e e x e cutie e ste c ritic a. D riv e re d e ac est tip p ot fip rocurate d e la d iv e rsi p rod uc atori d e S G B D -uri.

15 .2 .4 R ealizarea unei conex iuni

M e tod a folosita p entru realizarea une i conex iuni este g etConnection d inc lasa DriverManager si p oate av ea m ai m ulte form e :

Connection c = DriverManager.getConnection(url);

Connection c = DriverManager.getConnection(url, username, password);

Connection c = DriverManager.getConnection(url, dbproperties);

S tab ilirea unei conex iuni folosind driverul JD B C-O D B C

String url = "jdbc:odbc:test" ;

// sau url = "jdbc:odbc:test;UID=duke;PWD=java" ;

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

} catch(ClassNotFoundException e) {

System.err.print("ClassNotFoundException: " + e) ;

return ;

}

Connection con ;

try {

con = DriverManager.getConnection(url, "duke", "java");

} catch(SQLException e) {

System.err.println("SQLException: " + e);

Page 432: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 431

} finally {

try{

con.close ;

} catch(SQLException e) {

System.err.println(SQLException: " + e) ;

}

}

S tab ilirea unei conex iuni folosind un driver M y S q lFolosirea d ife rite lor tip uri d e d riv e re im p lic a d oar sch im b area num e lui c lase ic e re p re z inta d riv e rul si a m od alitatii d e sp e c ificare a b az e i d e d ate .

String url = "jdbc:mysql://localhost/test" ;

// sau url = "jdbc:mysql://localhost/test?user=duke&password=java";

try {

Class.forName("com.mysql.jdbc.Driver") ;

} catch(ClassNotFoundException e) {

...

O conex iune v a fi folosita p entru:

• Crearea d e se c v ente S Q L utilizate p entru interog area sau actualizareab az e i.

• A fl area unor inform atii le g ate d e b aza d e d ate (m e ta-d ate).

D e ase m enea, c lasa Connection asig ura fac ilitati p entru controlul tranzac tiilord in m e m orie c atre b aza d e d ate p rin m etod e le com m it, rollb ack , setA u-toCom m it.

Inch id e rea une i conex iuni se realiz eaz a p rin m etod a close.

15 .3 E fectuarea de secvente S Q L

O d ata facuta conectarea cu m etod a DriverManager.getConection, se p oatefolosi ob ie c tul Connection re zultat p entru a se crea ob ie c te d e tip S tate-m ent,P reparedS tatem ent sau Callab leS tatem ent cu ajutorul c arorap ute m trim ite se c v ente S Q L c atre b aza d e d ate . Cele m ai uzuale com enz iS Q L sunt c e le folosite p entru:

• Interog area b az e i d e d ate : SELECT

Page 433: Cristian Frasinaru-Curs Practic de Java.pdf

432 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

• A c tualizarea d ate lor: INSERT, UPDATE, DELETE

• A c tualizarea structurii: CREATE, ALTER, DROP - ac estea m ai sunt nu-m ite instruc tiuni D D L (D ata D efinition L ang uag e)

• A p e larea une i p roc e d uri stocate : CALL

D up a cum v om v e d ea, ob tinerea si p re lucrarea re zultate lor une i interog arie ste realizata p rin interm e d iul ob ie c te lor d e tip R esultS et.

15 .3 .1 Interfata S tatem ent

Interfata Statement ofera m e tod e le d e b az a p entru trim ite rea d e se c v enteS Q L c atre b aza d e d ate si ob tinerea re zultate lor, c e le lalte d oua interfe te :PreparedStatement si CallableStatement fiind d e riv ate d in ac easta.

Crearea unui ob ie c t Statement se realiz eaz a p rin interm e d iul m e tod e icreateS tatem ent a clase i Connection, fara nic i un arg um ent:

Connection con = DriverManager.getConnection(url);

Statement stmt = con.createStatement();

E x ecutia une i se c v ente S Q L p oate fi realizata p rin interm e d iul a tre im e tod e :

1. ex ecuteQ ueryE ste folosita p entru realizarea d e interog ari d e tip SELECT. M e tod a returneaz aun ob ie c t d e tip ResultSet c e v a contine sub o form a tab e lara re zultatulinterog arii.

String sql = "SELECT * FROM persoane";

ResultSet rs = stmt.executeQuery(sql);

2 . ex ecuteU pdateE ste folosita p entru actualizarea d ate lor (INSERT, UPDATE, DELETE) saua structurii b az e i d e d ate (CREATE, ALTER, DROP). M e tod a v a returna unıntre g c e se m nific a num arul d e linii afe c tate d e op eratiunea d e actualizare ad ate lor, sau 0 ın cazul une i instruc tiuni D D L .

Page 434: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 433

String sql = "DELETE FROM persoane WHERE cod > 100";

int linii = stmt.executeUpdate(sql);

// Nr de articole care au fost afectate (sterse)

sql = "DROP TABLE temp";

stmt.executeUpdate(sql); // returneaza 0

3 . ex ecuteA c easta m e tod a v a fi folosita d oar d ac a e ste p osib il ca re zultatul une i in-terog ari sa fie form at d in d oua sau m ai m ulte ob ie c te d e tip ResultSet saure zultatul une i actualiz ari sa fie form at d in m ai m ule v alori, sau o com b inatieıntre ac este cazuri. A c easta situatie , d e si m ai rara, e ste p osib ila atunc i c andsunt e x e cutate p roc e d uri stocate sau se c v ente S Q L cunoscute ab ia la m om en-tul e x e cutie i, p rog ram atorul ne stiind d e c i d ac a v a fi v orb a d e o actualizarea d ate lor sau a structurii. M e tod a ıntoarc e true d ac a re zultatul ob tinuteste form at d in ob ie c te d e tip ResultSet si false d ac a e form at d in ıntre g i.In func tie d e ac easta, p ot fi ap e late m e tod e le : g etR esultS et sau g etU p-dateCount p entru a afl a e fe c tiv re zultatul com enz ii S Q L . P entru a p re luatoate re zultate le v a fi ap e lata m e tod a g etM oreR esults, d up a care v or fiap e late d in nou m etod e le am intite , p ana la ob tinerea v alorii nu ll, re sp e c tiv−1. S e c v enta com p le ta d e tratare a m etod e i execute e ste p re z entata m aijos:

String sql = "comanda SQL necunoscuta";

stmt.execute(sql);

while(true) {

int rowCount = stmt.getUpdateCount();

if(rowCount > 0) {

// Este o actualizare datelor

System.out.println("Linii afectate = " + rowCount);

stmt.getMoreResults();

continue;

}

if(rowCount = 0) {

// Comanda DDL sau nici o linie afectata

System.out.println("Comanda DDL sau 0 actualizari");

Page 435: Cristian Frasinaru-Curs Practic de Java.pdf

434 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

stmt.getMoreResults();

continue;

}

// rowCount este -1

// Avem unul sau mai multe ResultSet-uri

ResultSet rs = stmt.getResultSet();

if(rs != null) {

// Proceseaza rezultatul

...

stmt.getMoreResults();

continue;

}

// Nu mai avem nici un rezultat

break;

}

Folosind c lasa Statement, ın cazul ın care d orim sa introd uc e m v alorileunor v ariab ile ıntr-o se c v enta S Q L , nu av e m alta solutie d e c at sa c re am unsir d e caractere com p us d in instruc tiuni S Q L si v alorile v ariab ile lor:

int cod = 100;

String nume = "Popescu";

String sql = "SELECT * FROM persoane WHERE cod=" + cod +

" OR nume=’" + nume + "’";

ResultSet rs = stmt.executeQuery(sql);

15 .3 .2 Interfata P reparedS tatem ent

Interfata P re p are d S tate m ent este d e riv ata d in Statement, fiind d ife rita d eac easta ın urm atoare le p riv inte :

• Instante le d e tip PreparedStatement contin se c v ente S Q L care au fostd e ja com p ilate (sunt ” p re g atite ” ).

• O sec v enta S Q L sp e c ificata unui ob ie c t PreparedStatement p oate saaib a unul sau m ai m ulti p aram etri d e intrare , care v or fi sp e c ificatip rin interm e d iul unui se m n d e ıntre b are (” ? ” ) ın locul fie c aruia d intre

Page 436: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 435

e i. Inainte ca se c v enta S Q L sa p oata fi e x e cutata fie c arui p aram etrud e intrare tre b uie sa i se atrib uie o v aloare , folosind m e tod e sp e c ific eac este i c lase .

E x e cutia re p e tata a ac e le iasi se c v ente S Q L , d ar cu p aram etri d ife riti, v afi ın g eneral m ai rap id a d ac a folosim PreparedStatement, d eoare c e nu m aitre b uie sa c re am c ate un ob ie c t d e tip Statement p entru fiecare ap e l S Q L , c ire folosim o sing ura instanta p re com p ilata furniz and u-i d oar alte arg um ente .

Crearea unui ob ie c t d e tip PreparedStatement se realiz eaz a p rin inter-m e d iul m e tod e i prepareS tatem ent a clase i Connection, sp e c ific an ca ar-g um ent o se c v enta S Q L c e contine c ate un se m n d e ıntre b are p entru fiecarep aram etru d e intrare :

Connection con = DriverManager.getConnection(url);

String sql = "UPDATE persoane SET nume=? WHERE cod=?";

Statement pstmt = con.prepareStatement(sql);

Ob ie c tul v a p stm t contine o com and a S Q L p re com p ilata care e ste trim isaim e d iat c atre b aza d e d ate , und e v a aste p ta p aram etri d e intrare p entru ap utea fi e x e cutata.

T rim iterea param etrilor se realiz eaz a p rin m etod e d e tip setX X X ,und e XXX e ste tip ul coresp unz ator p aram etrului, iar arg um ente le m e tod e isunt n u m a ru l d e o rd in e al p aram etrului d e intrare (al se m nului d e ıntre b are)si va loa rea p e care d orim sa o atrib uim .

pstmt.setString(1, "Ionescu");

pstmt.setInt(2, 100);

D up a stab ilirea p aram etrilor d e intrare se c v enta S Q L p oate fi e x e cutata.P ute m ap oi stab ili alte v alori d e intrare si re folosi ob ie c tul PreparedStatementp entru e x e cutii re p e tate ale com enz ii S Q L . E ste ınsa p osib il ca S G B D -ulfolosit sa nu sup orte ac est tip d e op e ratiune si sa nu re tina ob ie c tul p re -com p ilat p entru e x e cutii ulterioare . In ac easta situatie folosirea interfe te iPreparedStatement ın loc d e Statement nu va ım b unatati ın nic i un fe lp e rform anta cod ului, d in p unctul d e v e d e re al v ite z e i d e e x e cutie a ac estuia.

E x ecutia une i se c v ente S Q L folosind un ob ie c t PreparedStatement serealiz eaz a p rintr-una d in m etod e le ex ecuteQ uery , ex ecuteU pdate sauex ecute, se m nificatiile lor fiind ac e leasi ca si ın cazul ob ie c te lor d e tipStatement, cu sing ura d eose b ire c a ın cazul d e fata e le nu au nic i un ar-g um ent.

Page 437: Cristian Frasinaru-Curs Practic de Java.pdf

436 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

String sql = "UPDATE persoane SET nume=? WHERE cod=?";

Statement pstmt = con.prepareStatement(sql);

pstmt.setString(1, "Ionescu");

pstmt.setInt(2, 100);

pstmt.executeUpdate();

pstmt.setString(1, "Popescu");

pstmt.setInt(2, 200);

pstmt.executeUpdate();

sql = "SELECT * from persoane WHERE cod >= ?";

pstmt = con.prepareStatement(sql);

pstmt.setInt(1, 100);

ResultSet rs = pstmt.executeQuery();

Fie c arui tip J av a ıi coresp und e un tip g eneric S Q L . E ste resp onsab ilitateap rog ram atorului sa se asig ure c a folose ste m e tod a ad e c v ata d e tip setXXX lastab ilirea v alorii unui p aram etru d e intrare . L ista tuturor tip urilor g eneric ed isp onib ile , num ite si tip u ri J D B C , e ste d efinita d e c lasa T y pes, p rin con-stante lor d e c larate d e ac easta. M e tod a setO b ject p e rm ite sp e c ificarea unorv alori p entru p aram etrii d e intrare , atunc i c and d orim sa folosim m ap areaim p lic ita ıntre tip urile J av a si c e le J D B C sau atunc i c and d orim sa p re c iz ame x p lic it un tip J D B C.

pstmt.setObject(1, "Ionescu", Types.CHAR);

pstmt.setObject(2, 100, Types.INTEGER); // sau doar

pstmt.setObject(2, 100);

Folosind m e tod a setN ull p ute m sa atrib uim unui p aram etru d e intrarev aloare S Q L NULL, tre b uind ınsa sa sp e c ific am si tip ul d e d ate al coloane i ıncare v om scrie ac easta v aloare . A c e lasi lucru p oate fi realizat cu m etod e d etip ul setXXX d ac a arg um entul folosit are v aloarea null.

pstmt.setNull(1, Types.CHAR);

pstmt.setInt(2, null);

Cu ajutorul m e tod e lor setB y tes sau setS tring av e m p osib ilitatea d e asp e c ifica d ate d e oric e d im ensiuni ca v alori p entru anum ite articole d in b azad e d ate . E x ista ınsa situatii c and este d e p re fe rat ca d ate le d e m ari d im ensi-uni sa fie transferate p e ” b uc ati” d e o anum ita d im ensiune . P entru a realiza

Page 438: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 437

acest lucru A P I-ul J D B C p une la d isp oz itie m e tod e le setB inary S tream ,setA sciiS tream si setU nicodeS tream care ataseaz a un fl ux d e intrare p eocte ti, caractere A S CII, re sp e c tiv U N ICOD E , unui p aram etru d e intrare . P em asura c e sunt c itite d ate d e p e fl ux , e le v or fi atrib uite p aram etrului. E x e m -p lul d e m ai jos ilustreaz a ac e st lucru, atrib uind coloane i continu t continutulunui anum it fisie r:

File file = new File("date.txt");

int fileLength = file.length();

InputStream fin = new FileInputStream(file);

java.sql.PreparedStatement pstmt = con.prepareStatement(

"UPDATE fisiere SET continut = ? WHERE nume = ’date.txt’");

pstmt.setUnicodeStream (1, fin, fileLength);

pstmt.executeUpdate();

L a e x e cutia se c v ente i, fl ux ul d e intrare v a fi ap e lat re p e tat p entru afurniza d ate le c e v or fi scrise ın coloana continu t a articolului sp e c ificat.Ob serv ati c a e ste ne c esar ına sa stim d inainte d im ensiunea d ate lor c e v or fiscrise , ac est lucru fiind solic itat d e unele tip uri d e b az e d e d ate .

15 .3 .3 Interfata Callab leS tatem ent

Interfata CallableStatement e ste d e riv ata d in PreparedStatement, instante led e ac e st tip ofe rind o m od alitate d e a ap e la o p roc e d ura stocata ıntr-o b az ad e d ate , ıntr-o m aniera stand ar p entru toate S G B D -urile .

Crearea unui ob ie c t CallableStatement se realiz eaz a p rin m e tod a pre-pareCall a clase i Connection:

Connection con = DriverManager.getConnection(url);

CallableStatement cstmt = con.prepareCall(

"{call proceduraStocata(?, ?)}");

T rim iterea param etrilor d e intrare se realiz eaz a ıntoc m ai ca la PreparedStatement,cu m etod e d e tip setX X X . D ac a p roc e d ura are si p aram etri d e ie sire (v alorire turnate), ac e stia v or tre b ui ınre g istrati cu m etod a reg isterO utP aram e-ter ınainte d e e x e cutia p roc e d urii. Ob tinerea v alorilor re zultate ın p aram etriid e ie sie se v a fac e cu m etod e d e tip g etX X X .

CallableStatement cstmt = con.prepareCall(

Page 439: Cristian Frasinaru-Curs Practic de Java.pdf

438 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

"{call calculMedie(?)}");

cstmt.registerOutParameter(1, java.sql.Types.FLOAT);

cstmt.executeQuery();

float medie = cstmt.getDouble(1);

E ste p osib il ca un p aram etru d e intrare sa fie si p aram etru d e ie sire . Inac est caz e l tre b uie sa p rim easc a o v aloare cu setXXX si, d e ase m enea, v a fiınre g istrat cu registerOutParameter, tip urile d e d ate sp e c ificate tre b uindsa coinc id a.

15 .3 .4 O b tinerea si prelucrarea rezultatelor

15 .3 .5 Interfata R esultS et

In urm a e x e cutie une i interog ari S Q L re zultatul v a fi re p re z entat p rintr-unob ie c t d e tip R esultS et, c e v a contine toate liniile c e satisfac cond itiileim p use d e com and a S Q L . Form a g enerala a unui ResultSet e ste tab e lara,av and un num ar d e coloane si d e linii, func tie d e se c v enta e x e cutata. D ease m enea, ob ie c tul v a contine si m e ta-d ate le interog arii cum ar fi d enum ire lecoloanelor se le c tate , num arul lor, e tc .

Statement stmt = con.createStatement();

String sql = "SELECT cod, nume FROM persoane";

ResultSet rs = stmt.executeQuery(sql);

R e zultatul interog arii d e m ai sus v a fi ob ie c tul r s cu urm atoarea structura:

cod num e100 Ionescu200 P op escu

P entru a ex trag e inform atiile d in ac easta structura v a tre b ui sa p arcurg e mtab e lul linie cu linie si d in fiecare sa e x trag e m v alorile d e p e coloane . P entruacest lucru v om folosi m e tod e d e tip g etX X X , und e XXX e ste tip ul d ed ata al une i coloane iar arg um entul p rim it ind ic a fie num arul d e ord ine d incad rul tab e lului, fie num e le ac estuia. Coloanele sunt num erotate d e la stang ala d reap ta, ınc e p and cu 1. In g eneral, folosirea ind e x ului coloane i ın loc d enum e le sau v a fi m ai efic ienta. D e ase m enea, p entru m ax im a p ortab ilitatese re com and a c itirea coloanelor ın ord ine d e la stang a la d reap ta si fie carec itire sa se fac a o sing ura d ata.

Page 440: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 439

U n ob ie c t ResultSet folose ste un cursor p entru a p arcurg e articole lere zultate ın urm a une i interog ari. Initial ac est cursor este p oz itionat ınainteap rim e i linii, fie care ap e l al m e tod e i nex t d e te rm inand tre c e rea la urm atoarealinie . D eoare c e next returneaz a false c and nu m ai sunt linii d e ad us, uzualv a fi folosita o b uc la while-loop p e tru a itera p rin articole le tab e lului:

String sql = "SELECT cod, nume FROM persoane";

ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {

int cod = r.getInt("cod");

String nume = r.getString("nume");

/* echivalent:

int cod = r.getInt(1);

String nume = r.getString(2);

*/

System.out.println(cod + ", " + nume);

}

Im p lic it, un tab e l d e tip ResultSet nu p oate fi m od ificat iar cursorulasoc iat nu se d e p laseaz a d e c at ınainte , linie cu linie . A sad ar, p ute m ite rap rin re zultatul une i interog ari o sing ura d ata si num ai d e la p rim a la ultim alinie . E ste ınsa p osib il sa c re am ResultSet-uri care sa p e rm ita m od ificareasau d e p lasarea ın am b e le sensuri. E x e m p lul urm ator v a folosi un cursor careeste m od ificab il si nu v a re fl e c ta sch im b arile p rod use d e alti utilizatori d up ac rearea sa:

Statement stmt = con.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_UPDATABLE);

String sql = "SELECT cod, nume FROM persoane";

ResultSet rs = stmt.executeQuery(sql);

D ac a un ResultSet folose ste un cursor m od ificab il si care p oate nav ig aın am b e le sensuri, atunc i are la d isp oz itie o serie d e m e tod e c e se b az eaz a p eac est sup ort:

• ab solute - D e p laseaz a cursorul la o anum ita linie sp e c ificata ab solut;

• updateX X X - A c tualiz eaz a v aloarea une i coloane d in linia curenta,und e XXX e ste un tip d e d ate .

Page 441: Cristian Frasinaru-Curs Practic de Java.pdf

440 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

• updateR ow - T ransfera actualiz arile facute linie i ın b aza d e d ate .

• m oveT oInsertR ow - d e p laseaz a cursorul la o linie sp c e iala, num italin ie n o u a , utilizate a p entru a introd uc e noi articole ın b aza d e d ate .L inia curenta anterioara a cursorului v a fi m e m orata p entru a se p uteare v eni la ea.

• insertR ow - insereaz a articolul d in zona lin ie n o u a ın b aza d e d ate ;cursorul tre b uie sa fie p oz itionat le linia noua la e x e cutia ac este i op e ratiuni.

• m oveT oCurrentR ow - re v ine la linia curenta d in tab e l.

• deleteR ow - ste rg e linia curenta d in tab e l si d in b aza d e d ate ; nup oate fi ap e lata c and cursorul este ın m od ul lin ie n o u a .

N u toate siste m e le d e g e stiune a b az e lor d e d ate ofera sup ort p entrufolosirea cursoare lor care p ot fi m od ificate . P entru a d eterm ina d ac a b aza d ed ate p e rm ite ac est lucru p ot fi utilizate m e tod e le supportsP ositionedU p-date si supportsP ositionedD elete ale c lase i DatabaseMetaData. In cazulın care ac est lucru este p e rm is, e ste re sp onsab ilitatea d riv e r-ului b az e i d ed ate sa asig ure re zolv area p rob le m e lor le g ate d e actualizarea concurenta aunui cursor, astfe l ınc at sa nu ap ara anom alii.

15 .3 .6 E x em plu sim plu

In continuare v om d a un ex e m p lul sim p lu d e utilizare a c lase lor d e b az am entionate anterior. P rog ram ul v a folosi o b az a d e d ate M y S q l, c e contineun tab e l num it p er soane, av and coloanele : cod , nu m e si salar iu . S c rip tulS Q L d e c reare a b az e i e ste :

create table persoane(cod integer, nume char(50), salariu double);

A p licatia v a g oli tab e lul cu p ersoane , d up a care v a ad aug a aleator unnum ar d e articole , v a e fe c tua afisarea lor si calculul m e d ie i salariilor.

L isting 15.1: E x e m p lu sim p lu d e utilzare J D B C

import java.sql .*;

public class TestJdbc {

public static void main (String [] args) {

Page 442: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 441

String url = "jdbc:mysql :// localhost/test" ;

try{

Class.forName("com.mysql.jdbc.Driver");

} catch(ClassNotFoundException e) {

System.out.println("Eroare incarcare driver !\n" + e);

return;

}

try{

Connection con = DriverManager.getConnection(url);

// Golim tabelul persoane

String sql = "DELETE FROM persoane";

Statement stmt = con.createStatement ();

stmt.executeUpdate(sql);

// Adaugam un numar de persoane generate aleator

// Tabelul persoane are coloanele (cod , nume , salariu)

int n = 10;

sql = "INSERT INTO persoane VALUES (?, ?, ?)";

PreparedStatement pstmt = con.prepareStatement(sql);

for(int i=0; i<n; i++) {

int cod = i;

String nume = "Persoana" + i;

double salariu = 100 + Math.round(Math.random () *

900);

// salariul va fi intre 100 si 1000

pstmt.setInt(1, cod);

pstmt.setString(2, nume);

pstmt.setDouble(3, salariu);

pstmt.executeUpdate ();

}

// Afisam persoanele ordonate dupa salariu

sql = "SELECT * FROM persoane ORDER BY salariu";

ResultSet rs = stmt.executeQuery(sql);

while (rs.next())

System.out.println(rs.getInt("cod") + ", " +

rs.getString("nume") + ", " +

rs.getDouble("salariu"));

// Calculam salariul mediu

sql = "SELECT avg(salariu) FROM persoane";

rs = stmt.executeQuery(sql);

rs.next();

Page 443: Cristian Frasinaru-Curs Practic de Java.pdf

442 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

System.out.println("Media: " + rs.getDouble (1));

// Inchidem conexiunea

con.close();

} catch(SQLException e) {

e.printStackTrace ();

}

}

}

15 .4 L ucrul cu m eta-date

15 .4 .1 Interfata D atab aseM etaD ata

D up a realizarea unui conex iuni la o b az a d e d ate , p ute m ap e la m etod a g et-M etaD ata p entru a afl a d iv e rse inform atii le g ate d e b aza resp e c tiv a, asanum ite le m eta -d a te (” d ate d e sp re d ate ” ); Ca re zult al ap e lului m e tod e i, v omob tine un ob ie c t d e tip D atab aseM etaD ata c e ofe ra m e tod e p entru d eter-m inarea tab e le lor, p roc e d urilor stocate , cap ab ilitatilor conex iunii, g ram atic iiS Q L sup ortate , e tc . ale b az e i d e d ate .

P rog ram ul urm ator afiseaz a num e le tuturor tab e le lor d intr-o b az a d e d atınre g istrata ın OD B C.

L isting 15.2: Folosirea interfe te i D atab ase M e taD ata

import java.sql .*;

public class TestMetaData {

public static void main (String [] args) {

String url = "jdbc:odbc:test";

try{

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

} catch(ClassNotFoundException e) {

System.out.println("Eroare incarcare driver !\n" + e);

return;

}

try{

Connection con = DriverManager.getConnection(url);

DatabaseMetaData dbmd = con.getMetaData ();

ResultSet rs = dbmd.getTables(null , null , null , null);

Page 444: Cristian Frasinaru-Curs Practic de Java.pdf

1 5 .4 . L UCRUL CU M E T A-D AT E 443

while (rs.next())

System.out.println(rs.getString("TABLE_NAME"));

con.close();

} catch(SQLException e) {

e.printStackTrace ();

}

}

}

15 .4 .2 Interfata R esultS etM etaD ata

M eta-datele unui ResultSet re p re z inta inform atiile d e sp re re zultatul continutın ac e l ob ie c t cum ar fi num arul coloanelor, tip ul si d enum irile lor, e tc . A c e s-tea sunt ob tinute ap e land m e tod a g etM etaD ata p entru ResultSet-ul re -sp e c tiv , care v a returna un ob ie c t d e tip R esultS etM etaD ata c e p oate fiap oi folosit p entru e x trag e rea inform atiilor d orite .

ResultSet rs = stmt.executeQuery("SELECT * FROM tabel");

ResultSetMetaData rsmd = rs.getMetaData();

// Aflam numarul de coloane

int n = rsmd.getColumnCount();

// Aflam numele coloanelor

Sring nume[] = new String[n+1];

for(int i=1; i<=n; i++)

nume[i] = rsmd.getColumnName(i);

Page 445: Cristian Frasinaru-Curs Practic de Java.pdf

444 CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

Page 446: Cristian Frasinaru-Curs Practic de Java.pdf

Capitolul 16

L ucrul dinam ic cu clase

16 .1 Incarcarea claselor ın m em orie

D up a cum stim e x e cutia une i ap licatii J av a este realizata d e c atre m asinav irtuala J av a (J V M ), ac easta fiind resp onsab ila cu interp re tarea cod ului d eocte ti re zultat ın urm a com p ilarii. S p re d eose b ire d e alte lim b aje d e p rog ra-m are cum ar fi C sau C+ + , un p rog ram J av a com p ilat nu este d e sc ris d e unfisie r e x e cutab il c i d e o m ultim e d e fisie re cu e x tensia .class coresp unz atoarefie c are i c lase a p rog ram ului. In p lus, ac este c lase nu sunt ınarcate toate ınm e m orie la p ornirea ap licatie i, c i sunt ınarcate p e p arcursul e x e cutie ac este iaatunc i c and este ne v oie d e e le , m om entul e fe c tiv ın care se realiz eaz a ac estlucru d e p inz and d e im p le m entarea m asinii v irtuale .

Cic lul d e v iata al une i c lase are asad ar urm atoare le e tap e :

1. In c a rca rea - E ste p roc esul re g asirii re p re z entarii b inare a une i c lase(fisie rul .c lass) p e b aza num e lui com p le t al ac estuia si ınc arcarea ac es-te ia ın m e m orie . In urm a ac estui p roc es, v a fi instantiat un ob ie c t d etip java.lang .Class, coresp unz ator c lase i re sp e c tiv e . Op eratiunea d eınc arcare a une i c lase este realizata la un m om ent c e p re c e d e p rim autilizare e fe c tiv a a sa.

2. E d ita rea d e leg a tu ri - S p e c ific a incorp orarea noului tip d e d ate ın J V Mp entru a p utea fi utlizat.

3. In itia liza rea - Consta ın e x e cutia b locurilor static e d e initializare siinitializarea v ariab ile lor d e c lasa.

445

Page 447: Cristian Frasinaru-Curs Practic de Java.pdf

446 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

4. D esc a rca rea - A tunc i c and nu m ai e x ista nic i o re fe rinta d e tip ul c lase ire sp e c tiv e , ob ie c tul d e tip Class c reat v a fi m arcat p entru a fi elim inatd in m e m orie d e c atre ga rba ge co llecto r.

Inc arcarea c lase lor une i ap licatii J av a ın m e m orie e ste realizata p rin in-term e d iul unor ob ie c te p e care le v om num i g eneric cla ss loa d er. A c e steasunt d e d oua tip uri:

1. C la ss loa d er-u l p rim o rd ia l (en g. boo tstra p ) - R e p re z inta o p arte inte -g ranta a m asinii v irtuale , fiind resp onsab il cu ınc arcarea c lase lor stan-d ard d in d istrib utia J av a.

2. C la ss loa d er-e p ro p rii - A c e stea nu fac p arte intrinse c a d in J V M sisunt instante ale c lase i java.lang .ClassL oader. A c easta este o c lasaab stracta, tip ul e fe c tiv al ob ie c tului fiind asad ar d e riv at d in ac easta.

D up a cum v om v e d ea, la e x e cutia unui p rog ram J av a v or fi create im p lic itd oua ob ie c te d e tip ClassLoader p entru ınc arcarea ın m e m ore i a c lase lorp rop rii ale ap licatie i. E x ista ınsa p osib ilitarea d e a crea noi tip uri d e riv ate d inClassLoader sp e c ializate p entru ınc arcarea c lase lor conform unor sp e c ificatiianum e care sa realiz e z e d iv e rse op tim iz ari. A stfe l, ınc arcarea une i c lase p oated e te rm ina ınc arcarea unor altor c lase care sig ur v or fi folosite ım p reuna cup rim a, sau a unor resurse c e sunt nec esare func tionarii ac este ia, e tc .

Inc e p and cu v ersiunea 1.2 d e J av a, a fost introd us un m od e l d e tip d elega t,ın care c lass load er-e le sunt d isp use ie rarh ic ıntr-un arb ore , rad ac ina ac estuiafiind c lass load er-ul p rim ord ial. Fie care instanta d e tip ClassLoader v a av eaasad ar un p a rin te (e v id ent, m ai p utin rad ac ina), ac esta fiind sp e c ificat lacrearea sa. In m om entul c and este solic itata ınc arcarea une i c lase , un class-load er p oate d e le g a ın p rim ul rand op e ratiunea d e ınc arcare p arinte lui saucare v a d e le g a la rand ul sau c ere rea m ai d e p arte p ana la c lass load er-ulp rim ord ial sau p ana unul d in ac e stia reuse ste sa o ıncarc e . A b ia ın cazul ıncare nic i unul d in ac e stia nu a reusit, v a ınc erca sa e x e cute op eratiunea d eınc arcare a c lase i. D ac a nic i ea nu v a reusi, v a fi aruncata o e x c e p tie d e tip ulClassN otF oundE x ception. D e si ac e st com p ortam ent nu este ob lig atoriu,ın m ulte situatii e l e ste d e p re fe rat, p entru a m inim iza ınc arcarea ac e le iasic lase d e m ai m ulte ori, folosind c lass load er-e d ife rite .

Page 448: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .1 . INCARCARE A CL ASE L O R IN M E M O RIE 447

Im p lic it, J av a 2 J V M ofera tre i c lass load er-e , unul p rim ord ial si d ouap rop rii, cunoscute sub num e le d e :

• B oo stra p C la ss L oa d er - Class load er-ul p rim ord ial. A c e sta este re -sp onsab il cu ınc arcarea c lase lor d in d istrib utia J av a stand ard (c e le d inp ach e te le java.*, javax.*, e tc .).

• E xten sio n C la ss L oa d er - U tilizat p entru ınc arcarea c lase lor d in d ire c -toare le e x tensiilor J R E .

• S y stem C la ss L oa d er - A c e sta este resp onsab il cu ınc arcarea c lase lorp rop rii ap licatiilor J av a (c e le d in CL A S S P A T H ). T ip ul ac estuia estejava.lang .U R L ClassL oader.

Intruc at tip urile d e d ate J av a p ot fi ınc arcate folosind d iv e rse instanted e tip ClassLoader, fie care ob ie c t Class v a re tine c lass load er-ul care afost folosit p entru ınc arcare , ac esta p utand fi ob tinut cu m etod a g etClass-L oader.

Inc arcarea d in a m ic a a une i c lase ın m e m orie se re fe ra la fap tul c a nucunoaste m tip ul ac este ia d e c at la e x e cutia p reog ram ului, m om ent ın carep ute m solic ita ınc arcarea sa, sp e c ific and num e le sau com p le t p rin interm e d iulunui sir d e caractere . A c e st lucru p oate fi realizat p rin m ai m ulte m od alitati,c e le m ai com une m etod e fiind :

Page 449: Cristian Frasinaru-Curs Practic de Java.pdf

448 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

• loadClass ap e lata p entru un ob ie c t d e tip ClassLoader

ClassLoader loader = new MyClassLoader();

loader.loadClass("NumeCompletClasa");

• Class.forN am eA c easta m e tod a v a ınc arca resp e c tiv a c lasa folosind c lass load er-ulob ie c tului curent (care o ap e leaz a):

Class c = Class.forName("NumeCompletClasa");

// echivalent cu

ClassLoader loader = this.getClass().getClassLoader();

loader.loadClass("ClasaNecunoscuta");

// Clasele standard pot fi si ele incarcate astfel

Class t = Class.forName("java.lang.Thread");

D ac a d orim sa instantie m un ob ie c t d intr-o c lasa ınc arcata d inam ic p ute mfolosi m e tod a new Instance, cu cond itia sa e x iste constructorul fara arg u-m ente p entru c lasa resp e c tiv a. D up a cum v om v e d ea ın se c tiunea urm atoare ,m ai e x ista si alte p osib ilitati d e a instantia astfe l d e ob ie c te .

Class c = Class.forName("java.awt.Button");

Button b = (Button) c.newInstance();

Folosirea interfe te lor sau a clase lor ab stracte ım p reuna cu ınc arcarea d i-nam ic a a c lase lor ofera un m e canism e x tre m d e p uternic d e lucru ın J av a.V om d e talia ac est lucru p rin interm e d iul unui e x e p m p lu. S a p re sup unemc a d orim sa c re am o ap licatie care sa g enere z e aleator un v e ctor d e num ered up a care sa ap lic e o anum ita func tie ac estui v e c tor. N um e le func tie i caretre b uie ap e lata v a fi introd us d e la tastatura, iar im p le m entarea e i v a ficontinuta ıntr-o c lasa a d ire c torului curent. T oate func tiile v or e x tind e c lasaab stracta Functie. In fe lul ac esta, ap licatia p oate fi e x tinsa cu noi func tiifara a sch im b a cod ul e i, tot c e tre b uie sa fac e m fiind sa sc rie m noi c lase caree x tind Functie si sa im p le m entam m e tod a executa. A c easta v a returna 0d ac a m e tod a s-a e x e cutat core c t, −1 ın caz contrar.

Page 450: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .1 . INCARCARE A CL ASE L O R IN M E M O RIE 449

L isting 16.1: E x e m p lu d e ınc arcare d inam ic a a c lase lor

import java.util .*;

import java.io.*;

public class TestFunctii {

public static void main(String args []) throws IOException {

// Generam un vector aleator

int n = 10;

int v[] = new int[n];

Random rand = new Random ();

for(int i=0; i<n; i++)

v[i] = rand.nextInt (100);

// Citim numele unei functii

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

String numeFunctie = "";

while (! numeFunctie.equals("gata")) {

System.out.print("\nFunctie:");

numeFunctie = stdin.readLine ();

try {

// Incarcam clasa

Class c = Class.forName(numeFunctie);

// Cream un obiect de tip Functie

Functie f = (Functie) c.newInstance ();

// Setam vectorul

f.setVector(v); // sau f.v = v;

// Executam functia

int ret = f.executa ();

System.out.println("\nCod returnat: " + ret);

} catch (ClassNotFoundException e) {

System.err.println("Functie inexistenta !");

} catch (InstantiationException e) {

System.err.println("Functia nu poate fi instantiata !

");

} catch (IllegalAccessException e) {

System.err.println("Functia nu poate fi accesata !");

Page 451: Cristian Frasinaru-Curs Practic de Java.pdf

450 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

}

}

}

}

L isting 16.2: Clasa ab stracta c e d e sc rie func tia

public abstract class Functie {

public int v[] = null;

public void setVector(int[] v) {

this.v = v;

}

public abstract int executa ();

}

L isting 16.3: U n e x e m p lu d e func tie

import java.util .*;

public class Sort extends Functie {

public int executa () {

if (v == null)

return -1;

Arrays.sort(v);

for(int i=0; i<v.length; i++)

System.out.print(v[i] + " ");

return 0;

}

}

L isting 16.4: A lt e x e m p lu d e func tie

public class Max extends Functie {

public int executa () {

if (v == null)

return -1;

int max = v[0];

for(int i=1; i<v.length; i++)

if (max < v[i])

max = v[i];

System.out.print(max);

return 0;

Page 452: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .1 . INCARCARE A CL ASE L O R IN M E M O RIE 451

}

}

U n ob ie c t d e tip URLClassLoader m entine o lista d e ad rese U R L d e und ev a ınc erca sa ıncarc e ın m e m orie c lasa al c are i num e ıl sp e c ific am ca arg u-m ent al m e tod e lor d e m ai sus. Im p lic it, la crearea c lass load er-ului ac eastalista e ste com p le tata cu inform atiile d in v ariab ila siste m CLASSPATH sau cuce le sp e c ificate p rin op tiunea -classpath la lansarea ap licatie i. Folosindm e tod a g etU R L s p ute m afl a ac este ad rese , iar cu addU R L p ute m ad aug ao noua ad resa d e c autare a c lase lor. B ine ınte le s, ad rese le U R L p ot sp e c ificasi d ire c toare ale siste m ului d e fisie re local. S a p re sup unem c a ın d ire c torulc:\clase\demo e x ista c lasa cu num e le Test, afl ata ın p ach e tul demo si d orimsa o ınc arc am d inam ic ın m e m orie :

// Obtinem class loaderul curent

URLClassLoader urlLoader =

(URLClassLoader) this.getClass().getClassLoader();

// Adaugam directorul sub forma unui URL

urlLoader.addURL(new File("c:\\clase").toURL());

// Incarcam clasa

urlLoader.loadClass("demo.Test");

D up a c e o c lasa a fost ınc arcata folosind un class load er, ea nu v a m aip utea fi d esc arcata e x p lic it d in m e m orie . In cazul ın care d orim sa av e m p osi-b ilitatea d e a o re ınc arca, d eoare c e a fost m od ificata si re com p ilata, tre b uie safolosim c lass-load ere p rop rii si sa instantie m noi ob ie c te d e tip ClassLoader,ori d e c ate ori d orim sa fortam re ınc arcarea c lase lor. Crearea unui c lassload er p rop riu se fac e uzual p rin e x tind erea c lase i URLClassLoader, o v ari-anta sim p lista fiind p re z entata m ai jos:

public class MyClassLoader extends URLClassLoader{

public MyClassLoader(URL[] urls){

super(urls);

}

}

Inc arcarea c lase lor folosind c lasa nou creata se v a fac e astfe l:

Page 453: Cristian Frasinaru-Curs Practic de Java.pdf

452 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

// La initializare

URLClassLoader systemLoader =

(URLClassLoader) this.getClass().getClassLoader();

URL[] urls = systemLoader.getURLs();

// Cream class loaderul propriu

MyClassLoader myLoader = new MyClassLoader(urls);

myLoader.loadClass("Clasa");

...

// Dorim sa reincarcam clasa

myLoader.loadClass("Clasa"); // nu functioneaza !

// Cream alt class loader

MyClassLoader myLoader = new MyClassLoader(urls);

myLoader.loadClass("Clasa"); // reincarca clasa

16 .2 M ecanism ul refl ectarii

M e canism ul p rin care o c lasa, interfata sau ob ie c t ” re fl e c ta” la m om entule x e cutie i structura lor interna se num e ste refl ecta re (eng . re fl e c tion), ac estap unand la d isp oz itie m e tod e p entru:

• D e te rm inarea c lase i unui ob ie c t.

• A fl area unor inform atii d e sp re o c lasa (m od ificatori, sup erc lasa, con-structori, m e tod e).

• Instantie rea unor c lase al c aror num e este stiut ab ia la e x e cutie .

• S e tarea sau afl area atrib ute lor unui ob ie c t, ch iar d ac a num e le ac estoraeste stiut ab ia la e x e cutie .

• Inv ocarea m e tod e lor unui ob ie c t al c aror num e este stiut ab ia la e x e cutie .

• Crearea unor v e c tori a c aror d im ensiune si tip nu este stiut d e c at lae x e cutie .

S up ortul p entru re fl e c tare este inc lus ın d istrib utia stand ard J av a, fiindcunoscut sub num e le d e R efl ectio n AP I si contine urm atoare le c lase :

Page 454: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .2 . M E CANISM UL RE F L E CT ARII 453

• java.lang.Class

• java.lang.Object

• Clase le d in p ach e tul java.lang .refl ect si anum e :

– Array

– Constructor

– Field

– Method

– Modifier

16 .2 .1 E x am inarea claselor si interfetelor

E x am inarea c lase lor si interfe te lor se realiz eaz a cu m etod e ale c lase i java.lang.Class,un ob ie c t d e ac est tip p utand sa re p re z inte atat o c lasa c at si o interfata,d ife rentie rea ac estora fac and u-se p rin interm e d iul m e tod e i isInterface.

R efl ectio n AP I p une la d isp oz itie m e tod e p entru ob tinerea urm atoare lorinform atii:

A fl area instantei Class coresp unz ator unui anum it ob ie c t sau tip d ed ate :

Class c = obiect.getClass();

Class c = java.awt.Button.class;

Class c = Class.forName("NumeClasa");

T ip urile p rim itiv e sunt d esc rise si e le d e instante d e tip Class av and form aT ip P rim itiv.class: int.class, double.class, e tc ., d ife rentie rea lor fac and u-se cu ajutorul m e tod e i isPrimitive.

A fl area num elui unei clase - S e realiz eaz a cu m etod a getName:

Class clasa = obiect.getClass();

String nume = clasa.getName();

Page 455: Cristian Frasinaru-Curs Practic de Java.pdf

454 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

A fl area m odifi catorilor unei clase - S e realiz eaz a cu m e tod a getModifiers,ac easta returnand un num ar ıntre g c e cod ific a toti m od ificatorii c lase i. P en-tru a d eterm ina usor p re z enta unui anum it m od ificator se folosesc m e tod e lestatic e ale c lase i Modifier isPublic, isAbstract si isFinal:

Class clasa = obiect.getClass();

int m = clasa.getModifiers();

String modif = "";

if (Modifier.isPublic(m))

modif += "public ";

if (Modifier.isAbstract(m))

modif += "abstract ";

if (Modifier.isFinal(m))

modif += "final ";

System.out.println(modif + "class" + c.getName());

A fl area superclasei - S e realiz eaz a cu m etod a getSuperclass c e re -turneaz a o instanta d e tip Class, coresp unz atoare tip ului d e d ate al sup er-c lase i sau null p entru c lasa Object.

Class c = java.awt.Frame.class;

Class s = c.getSuperclass();

System.out.println(s); // java.awt.Window

Class c = java.awt.Object.class;

Class s = c.getSuperclass(); // null

A fl area interfetelor im p le m entate d e o c lasa sau ex tinse d e o interfata- S e realiz eaz a cu m etod a getInterfaces, c e re turneaz a un v e c tor d e tipClass[].

public void interfete(Class c) {

Class[] interf = c.getInterfaces();

for (int i = 0; i < interf.length; i++) {

String nume = interf[i].getName();

System.out.print(nume + " ");

Page 456: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .2 . M E CANISM UL RE F L E CT ARII 455

}

}

...

interfete(java.util.HashSet.class);

// Va afisa interfetele implementate de HashSet:

// Cloneable, Collection, Serializable, Set

interfete(java.util.Set);

// Va afisa interfetele extinse de Set:

// Collection

A fl area variab ilelor m em b re - S e realiz eaz a cu una d in m etod e legetFields sau getDeclaredFields, c e re turne z a un v e c tor d e tip Field[],d ife renta ıntre c e le d oua constand ın fap tul c a p rim a returneaz a toa te v ari-ab ile le m e m b re , inc lusiv c e le m ostenite , ın tim p c e a d oua le returnez a d oarp e c e le d e c larate ın cad rul c lase i. L a rand ul e i, c lasa Field p une la d isp oz itiem e tod e le getName, getType si getModifiers p entru a ob tine num e le , tip ul,re sp e c tiv m od ificatorii une i v ariab ile m e m b ru.

Cu ajutorul m e tod e i getField e ste p osib ila ob tinerea une i re fe rinte la ov ariab ila m e b ra cu un anum it num e sp e c ificat.

A fl area constructorilor - S e realiz eaz a cu m etod e le getConstructors

sau getDeclaredConstructors, c e re turneaz a un v e c tor d e tip Constructor[].Clasa Constructor p une la d isp oz itie m e tod e le getName, getParameterTypes,getModifiers, getExceptionTypes p entru a ob tine toate inform atiile le g ated e re sp e c tiv ul constructor.

Cu ajutorul m e tod e i getConstructor e ste p osib ila ob tinerea une i re fe rintela constructor cu o sig natura sp e c ificata.

A fl area m etodelor - S e realiz eaz a cu m etod e le getMethods saugetDeclaredMethods, c e re turneaz a un v e c tor d e tip Method[]. Clasa Methodp une la d isp oz itie m e tod e le getName, getParameterTypes, getModifiers,getExceptionTypes, getReturnType p entru a ob tine toate inform atiile le g ate

Page 457: Cristian Frasinaru-Curs Practic de Java.pdf

456 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

d e re sp e c tiv a m e tod a.Cu ajutorul m e tod e i getMethod e ste p osib ila ob tinerea une i re fe rinte la

o m etod a cu o sig natura sp e c ificata.

A fl area claselor im b ricate - S e realiz eaz a cu m etod e le getClasses saugetDeclaredClasses, c e re turnez a un v e c tor d e tip Class[].

A fl area clasei de acoperire - S e realiz eaz a cu m e tod a getDeclaringClass.A c easta m e tod a o re g asim si ın c lase le Field, Constructor, Method, p entruacestea returnand c lasa c are i ıi ap artine v ariab ila, constructorul sau m etod aresp e c tiv a.

16 .2 .2 M anipularea ob iectelor

P e lang a p osib ilitatea d e a e x am ina structura une i anum ite c lase la m om entule x e cutie i, folosind R efl ectio n AP I av e m p osib ilitatea d e a lucra d inam ic cuob ie c te , b az and u-ne p e inform atii p e care le ob tine m ab ia la e x e cutie .

Crearea ob iectelorD up a cum stim , c rearea ob ie c te lor se realiz eaz a cu op eratorul new urm at d eun ap e l la un constructor al c lase i p e care o instantie m . In cazul ın carenum e le c lase i nu este cunoscut d e c at la m om entul e x e cutie i nu m ai p ute mfolosi ac easta m e tod a d e instantie re . In sch im b , av e m la d isp oz itie alte d ouav ariante :

• M e tod a new Instance d in c lasa java.lang .ClassA c easta p erm ite instantie rea unui ob ie c t folosind constructorul fara ar-g um ente al ac estuia. D ac a nu ex ista un astfe l d e constructor sau nu esteac c e sib il v or fi g enerate e x c e p tii d e tip ul InstantiationException, re -sp e c tiv IllegalAccessException.

Class c = Class.forName("NumeClasa");

Object o = c.newInstance();

// Daca stim tipul obiectului

Page 458: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .2 . M E CANISM UL RE F L E CT ARII 457

Class c = java.awt.Point.class;

Point p = (Point) c.newInstance();

• M e tod a new Instance d in c lasa ConstructorA c easta p erm ite instantie rea unui ob ie c t folosind un anum it construc -tor, c e l p entru care se fac e ap e lul. E v id ent, ac easta solutie p re sup uneın p rim ul rand ob tinerea unui ob ie c t d e tip Constructor cu o anum itasig natura, ap oi sp e c ificarea arg um ente lor la ap e larea sa. S a re sc rie me x e m p lul d e m ai sus, ap e land constructorul cu d oua arg um ente al c lase iPoint.

Class clasa = java.awt.Point.class;

// Obtinem constructorul dorit

Class[] signatura = new Class[] {int.class, int.class};

Constructor ctor = clasa.getConstructor(signatura);

// Pregatim argumentele

// Ele trebuie sa fie de tipul referinta corespunzator

Integer x = new Integer(10);

Integer y = new Integer(20);

Object[] arg = new Object[] {x, y};

// Instantiem

Point p = (Point) ctor.newInstance(arg);

E x c e p tii g enerate d e m e tod a newInstance sunt: InstantiationException,IllegalAccessException, IllegalArgumentException siInvocationTargetException. M e tod a getConstructor p oate p rov oca e x c e p tiid e tip ul NoSuchMethodException.

Invocarea m etodelorInv ocarea une i m e tod e al c are i num e ıl cunoaste m ab ia la m om entul e x e cutie ise realiz eaz a cu m etod a invok e a clase i M eth od. Ca si ın cazul construc -torilor, tre b uie sa ob tine m ıntai o re fe rinta la m e tod a cu sig natura core -sp unz atoare si ap oi sa sp e c ific am arg um ente le . In p lus, m ai p ute m ob tinev aloarea returnata. S a p re sup unem c a d orim sa ap e lam m e tod a contains

Page 459: Cristian Frasinaru-Curs Practic de Java.pdf

458 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

a clase i Rectangle care d e te rm ina d ac a un anum it p unct se g ase ste ın inte -riorul d re p ung h iului. M e tod a contains are m ai m ulte v ariante , noi o v omap e la p e c ea care ac c e p ta un arg um ent d e tip Point.

Class clasa = java.awt.Rectangle.class;

Rectangle obiect = new Rectangle(0, 0, 100, 100);

// Obtinem metoda dorita

Class[] signatura = new Class[] {Point.class};

Method metoda = clasa.getMethod("contains", signatura);

// Pregatim argumentele

Point p = new Point(10, 20);

Object[] arg = new Object[] {p};

// Apelam metoda

metoda.invoke(obiect, arg);

D ac a num arul arg um ente lor m e tod e i e ste 0, atunc i p ute m folosi v al-oarea null ın locul v e c torilor c e re p re z inta sig natura, resp e c tiv p aram etrid e ap e lare ai m e tod e i.

E x c e p tiile g enerate d e m e tod a invoke sunt: IllegalAccessException

si InvocationTargetException. M e tod a getMethod p oate p rov oca e x c e p tiid e tip ul NoSuchMethodException.

S etarea si afl area variab ilelor m em b reP entur setarea si afl area v alorilor v ariab ile lor m e m b re sunt folosite m e tod e leset si g et ale c lase i F ield. S a p re sup unem c a d orim sa se tam v ariab ila x aunui ob ie c t d e tip Point si sa ob tine m v aloarea v ariab ile i y a ace luiasi ob ie c t:

Class clasa = java.awt.Point.class;

Point obiect = new Point(0, 20);

// Obtinem variabilele membre

Field x, y;

x = clasa.getField("x");

y = clasa.getField("y");

Page 460: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .2 . M E CANISM UL RE F L E CT ARII 459

// Setam valoarea lui x

x.set(obiect, new Integer(10));

// Obtinem valoarea lui y

Integer val = y.get(obiect);

E x c e p tiile g enerate d e m e tod e le get, set sunt: IllegalAccessExceptionsi IllegalArgumentException. M e tod a getField p oate p rov oca e x c e p tii d etip ul NoSuchFieldException.

R e v enind la e x e m p lul d in se c tiunea anterioara cu ap e larea d inam ic a aunor func tii p entru un v e c tor, sa p re sup unem c a e x ista d e ja un num ar ınse m natd e c lase care d e sc riu d ife rite func tii d ar ac estea nu ex tind c lasa ab stractaFunctie. D in ac est m otiv , solutia anterioara nu m ai e ste v iab ila si tre b uiesa folosim ap e larea m etod e i executa ıntr-un m od d inam ic .

L isting 16.5: L ucru d inam ic cu m etod e si v ariab ile

import java.lang.reflect .*;

import java.util .*;

import java.io.*;

public class TestFunctii2 {

public static void main(String args []) throws IOException {

// Generam un vector aleator

int n = 10;

int v[] = new int[n];

Random rand = new Random ();

for(int i=0; i<n; i++)

v[i] = rand.nextInt (100);

// Citim numele unei functii

BufferedReader stdin = new BufferedReader(

new InputStreamReader(System.in));

String numeFunctie = "";

while (! numeFunctie.equals("gata")) {

System.out.print("\nFunctie:");

numeFunctie = stdin.readLine ();

Page 461: Cristian Frasinaru-Curs Practic de Java.pdf

460 CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

try {

// Incarcam clasa

Class c = Class.forName(numeFunctie);

// Cream un obiect de tip Functie

Object f = c.newInstance ();

// Setam vectorul (setam direct variabila v)

Field vector = c.getField("v");

vector.set(f, v);

// Apelam metoda ’executa ’

// Folosim null pentru ca nu avem argumente

Method m = c.getMethod("executa", null);

Integer ret = (Integer) m.invoke(f, null);

System.out.println("\nCod returnat: " + ret);

} catch (Exception e) {

System.err.println("Eroare la apelarea functiei !");

}

}

}

}

16 .2 .3 L ucrul dinam ic cu vectori

V e c torii sunt re p re z entati ca tip d e d ate tot p rin interm e d iul c lase i java.lang.Class,d ife rentie rea fac and u-se p rin interm e d iul m e tod e i isArray.

T ip ul d e d ate al e le m ente lor d in care e ste form at v e c torul v a fi ob tinut cuajutorul m e tod e i getComponentType, c e ıntoarc e o re fe rinta d e tip Class.

Point []vector = new Point[10];

Class c = vector.getClass();

System.out.println(c.getComponentType());

// Va afisa: class java.awt.Point

L ucrul d inam ic cu ob ie c te c e re p re z inta v e c tori se realiz eaz a p rin inter-m e d iul c lase i A rray . A c easta contine o serie d e m e tod e static e c e p e rm it:

• Crearea d e noi v e c tori: newInstance

• A fl area num arului d e e le m ente : getLength

Page 462: Cristian Frasinaru-Curs Practic de Java.pdf

1 6 .2 . M E CANISM UL RE F L E CT ARII 461

• S e tarea / afl area e le m ente lor: set, get

E x e m p lul d e m ai jos cre eaz a un v e c tor c e contine num ere le ıntre g i d e la0 la 9:

Object a = Array.newInstance(int.class, 10);

for (int i=0; i < Array.getLength(a); i++)

Array.set(a, i, new Integer(i));

for (int i=0; i < Array.getLength(a); i++)

System.out.print(Array.get(a, i) + " ");


Recommended