Sunteți pe pagina 1din 462

Curs practic de Java

Cristian Frsinaru a

Cuprins
1 Introducere Java n 1.1 Ce e ste J av a ? . . . . . . . . . . . . . . . . . . 1.1.1 L im b ajul d e p rog ram are J av a . . . . . 1.1.2 P latform e d e luc ru J av a . . . . . . . . 1.1.3 J av a: un lim b aj c om p ilat i inte rp re tat s 1.2 P rim ul p rog ram . . . . . . . . . . . . . . . . . 1.3 S truc tura le x ic al a lim b ajului J av a . . . . . . a 1.3.1 S e tul d e c arac te re . . . . . . . . . . . . 1.3.2 Cuv inte ch e ie . . . . . . . . . . . . . . 1.3.3 Id e ntic atori . . . . . . . . . . . . . . . 1.3.4 L ite rali . . . . . . . . . . . . . . . . . . 1.3.5 S e p aratori . . . . . . . . . . . . . . . . 1.3.6 Op e ratori . . . . . . . . . . . . . . . . 1.3.7 Com e ntarii . . . . . . . . . . . . . . . 1.4 T ip uri d e d ate i v ariab ile . . . . . . . . . . . s 1.4.1 T ip uri d e d ate . . . . . . . . . . . . . . 1.4.2 V ariab ile . . . . . . . . . . . . . . . . . 1.5 Controlul e x e c utie i . . . . . . . . . . . . . . . 1.5.1 Instruc iuni d e d e c iz ie . . . . . . . . . t 1.5.2 Instruc iuni d e salt . . . . . . . . . . . t 1.5.3 Instruc iuni p e ntru tratare a e x c e p iilor t t 1.5.4 A lte instruc iuni . . . . . . . . . . . . t 1.6 V e c tori . . . . . . . . . . . . . . . . . . . . . . 1.6.1 Cre are a unui v e c tor . . . . . . . . . . . 1.6.2 T ab louri m ultid im e nsionale . . . . . . 1.6.3 D im e nsiune a unui v e c tor . . . . . . . . 1.6.4 Cop ie re a v e c torilor . . . . . . . . . . . 1 11 11 11 12 13 14 16 16 16 17 17 19 19 20 21 21 22 24 24 25 26 26 26 26 28 28 29

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . .

2 1.6.5 S ortare a v e c torilor - c lasa Arrays . . . . . . 1.6.6 V e c tori c u d im e nsiune v ariab il i e te rog e ni as S iruri d e c arac te re . . . . . . . . . . . . . . . . . . Folosire a arg um e nte lor d e la linia d e c om and . . . a 1.8.1 T ransm ite re a arg um e nte lor . . . . . . . . . . 1.8.2 P rim ire a arg um e nte lor . . . . . . . . . . . . 1.8.3 A rg um e nte num e ric e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 30 30 31 31 32 34 35 35 35 37 38 39 39 40 41 42 46 49 50 50 52 53 56 57 58 59 59 61 62 63 64 64 66 66 67 67

1.7 1.8

O b iecte i clase s 2.1 Cic lul d e v iat al unui ob ie c t . . . . . . . . . . . . . a 2.1.1 Cre are a ob ie c te lor . . . . . . . . . . . . . . . 2.1.2 Folosire a ob ie c te lor . . . . . . . . . . . . . . 2.1.3 D istrug e re a ob ie c te lor . . . . . . . . . . . . 2.2 Cre are a c lase lor . . . . . . . . . . . . . . . . . . . . 2.2.1 D e c larare a c lase lor . . . . . . . . . . . . . . 2.2.2 E x tind e re a c lase lor . . . . . . . . . . . . . . 2.2.3 Corp ul une i c lase . . . . . . . . . . . . . . . 2.2.4 Construc torii une i c lase . . . . . . . . . . . . 2.2.5 D e c larare a v ariab ile lor . . . . . . . . . . . . 2.2.6 th is i sup e r . . . . . . . . . . . . . . . . . . s 2.3 Im p le m e ntare a m e tod e lor . . . . . . . . . . . . . . 2.3.1 D e c larare a m e tod e lor . . . . . . . . . . . . . 2.3.2 T ip ul re turnat d e o m e tod . . . . . . . . . a 2.3.3 T rim ite re a p aram e trilor c tre o m e tod . . . a a 2.3.4 M e tod e c u num r v ariab il d e arg um e nte . . a 2.3.5 S up ra rc are a i sup rad e nire a m e tod e lor nc a s 2.4 M od ic atori d e ac c e s . . . . . . . . . . . . . . . . . 2.5 M e m b ri d e instant i m e m b ri d e c las . . . . . . . a s a 2.5.1 V ariab ile d e instant i d e c las . . . . . . . a s a 2.5.2 M e tod e d e instant i d e c las . . . . . . . . a s a 2.5.3 U tilitate a m e m b rilor d e c las . . . . . . . . a 2.5.4 B loc uri static e d e initializ are . . . . . . . . . 2.6 Clase im b ric ate . . . . . . . . . . . . . . . . . . . . 2.6.1 D e nire a c lase lor im b ric ate . . . . . . . . . . 2.6.2 Clase inte rne . . . . . . . . . . . . . . . . . 2.6.3 Id e ntic are c lase lor im b ric ate . . . . . . . . 2.6.4 Clase anonim e . . . . . . . . . . . . . . . . . 2.7 Clase i m e tod e ab strac te . . . . . . . . . . . . . . s

CUPRINS 2.7.1 D e c larare a une i c lase ab strac te 2.7.2 M e tod e ab strac te . . . . . . . 2.8 Clasa Ob je c t . . . . . . . . . . . . . 2.8.1 Oric e c las are o sup e rc las . a a 2.8.2 Clasa Ob je c t . . . . . . . . . 2.9 Conv e rsii autom ate ntre tip uri . . . 2.10 T ip ul d e d ate e num e rare . . . . . . . 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 68 68 71 71 71 74 75 77 77 78 82 85 85 87 89 90 91 92 95 95 95 96 97 98 99 99 100 101 103 105 107 108 109 110 110 111

. . . . . .

E x ceptii 3.1 Ce sunt e x c e p iile ? . . . . . . . . . . . . t 3.2 P rind e re a i tratare a e x c e p iilor . . . . s t 3.3 A runc are a e x c e p iilor . . . . . . . . . . t 3.4 A v antaje le tratrii e x c e p iilor . . . . . . a t 3.4.1 S e p arare a c od ului p e ntru tratare a 3.4.2 P rop ag are a e rorilor . . . . . . . . 3.4.3 G rup are a e rorilor d up tip ul lor . a 3.5 Ie rarh ia c lase lor c e d e sc riu e x c e p ii . . . t 3.6 E x c e p ii la e x e c utie . . . . . . . . . . . . t 3.7 Cre are a p rop riilor e x c e p ii . . . . . . . . t

. . . . . . . . . . . . . . . . . . . . e rorilor . . . . . . . . . . . . . . . . . . . . . . . . .

Intr ri i ie iri a s s 4.1 Introd uc e re . . . . . . . . . . . . . . . . . . . . . . . . 4.1.1 Ce sunt ux urile ? . . . . . . . . . . . . . . . . . 4.1.2 Clasic are a ux urilor . . . . . . . . . . . . . . . 4.1.3 Ie rarh ia c lase lor p e ntru luc rul c u ux uri . . . . 4.1.4 M e tod e c om une ux urilor . . . . . . . . . . . . 4.2 Folosire a ux urilor . . . . . . . . . . . . . . . . . . . . 4.2.1 Flux uri p rim itiv e . . . . . . . . . . . . . . . . . 4.2.2 Flux uri d e p roc e sare . . . . . . . . . . . . . . . 4.2.3 Cre are a unui ux . . . . . . . . . . . . . . . . . 4.2.4 Flux uri p e ntru luc rul c u ie re . . . . . . . . . . s 4.2.5 Citire a i sc rie re a c u b u e r . . . . . . . . . . . . s 4.2.6 Conc ate nare a ux urilor . . . . . . . . . . . . . . 4.2.7 Flux uri p e ntru ltrare a d ate lor . . . . . . . . . 4.2.8 Clase le DataInputStream i DataOutputStream s 4.3 Intrri i ie iri form atate . . . . . . . . . . . . . . . . . a s s 4.3.1 Intrri form atate . . . . . . . . . . . . . . . . . a 4.3.2 Ie iri form atate . . . . . . . . . . . . . . . . . . s

4 4.4

CUPRINS Flux uri stand ard d e intrare i ie ire . . . . . . . . . . . . . s s 4.4.1 A sare a inform atiilor p e e c ran . . . . . . . . . . . . 4.4.2 Citire a d ate lor d e la tastatur . . . . . . . . . . . . a 4.4.3 R e d ire c tare a ux urilor stand ard . . . . . . . . . . . 4.4.4 A naliz a le x ic al p e ux uri (c lasa StreamTokenizer) a Clasa RandomAccesFile ( ie re c u ac c e s d ire c t) . . . . . . s Clasa File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 112 112 113 115 117 119

4.5 4.6 5

Interfete 5.1 Introd uc e re . . . . . . . . . . . . . . . . . . 5.1.1 Ce e ste o inte rfat ? . . . . . . . . . a 5.2 Folosire a inte rfe e lor . . . . . . . . . . . . . t 5.2.1 D e nire a une i inte rfe e . . . . . . . . t 5.2.2 Im p le m e ntare a une i inte rfe e . . . . . t 5.2.3 E x e m p lu: im p le m e ntare a une i stiv e . 5.3 Inte rfe e i c lase ab strac te . . . . . . . . . . t s 5.4 M o te nire m ultip l p rin inte rfe e . . . . . . s a t 5.5 U tilitate a inte rfe e lor . . . . . . . . . . . . . t 5.5.1 Cre are a g rup urilor d e c onstante . . . 5.5.2 T ransm ite re a m e tod e lor c a p aram e tri 5.6 Inte rfata FilenameFilter . . . . . . . . . . 5.6.1 Folosire a c lase lor anonim e . . . . . . 5.7 Com p arare a ob ie c te lor . . . . . . . . . . . . 5.7.1 Inte rfata Comparable . . . . . . . . . 5.7.2 Inte rfata Comparator . . . . . . . . . 5.8 A d ap tori . . . . . . . . . . . . . . . . . . . . O rg aniz area claselor 6.1 P ach e te . . . . . . . . . . . . . . . . . . 6.1.1 P ach e te le stand ard (J 2S D K ) . . . 6.1.2 Folosire a m e m b rilor unui p ach e t . 6.1.3 Im p ortul une i c lase sau inte rfe e . t 6.1.4 Im p ortul la c e re re d intr-un p ach e t 6.1.5 Im p ortul static . . . . . . . . . . 6.1.6 Cre are a unui p ach e t . . . . . . . 6.1.7 D e num ire a unui p ach e t . . . . . . 6.2 Org aniz are a ie re lor . . . . . . . . . . . s 6.2.1 Org aniz are a ie re lor surs . . . . s a . . . . . . . . . . . . . . . . . . . .

12 1 . 121 . 121 . 122 . 122 . 123 . 124 . 129 . 130 . 132 . 132 . 133 . 134 . 137 . 138 . 139 . 141 . 142 . . . . . . . . . . 14 5 145 145 146 147 148 149 150 151 152 152

CUPRINS 6.2.2 6.2.3 6.2.4 A rh iv e 6.3.1 6.3.2 Org aniz are a unit ilor d e c om p ilare (.class) at N e c e sitate a org aniz rii ie re lor . . . . . . . . a s S e tare a c ii d e c utare (CL A S S P A T H ) . . . . a a JA R . . . . . . . . . . . . . . . . . . . . . . . Folosire a utilitarului jar . . . . . . . . . . . . E x e c utare a ap lic atiilor arh iv ate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 154 155 156 157 158 159

6.3

Colectii 7.1 Introd uc e re . . . . . . . . . . 7.2 Inte rfe e c e d e sc riu c ole c ii . . t t 7.3 Im p le m e ntri ale c ole c iilor . . a t 7.4 Folosire a e c ie nt a c ole c iilor a t 7.5 A lg oritm i p olim orc i . . . . . 7.6 T ip uri g e ne ric e . . . . . . . . 7.7 Ite ratori i e num e rri . . . . . s a

16 1 . 161 . 162 . 166 . 168 . 170 . 171 . 172 . . . . . . . . . . . . . 17 7 177 179 180 180 181 183 183 184 187 188 193 194 196

S erializ area ob iectelor 8.1 Folosire a se rializ rii . . . . . . . . . . . . . . . a 8.1.1 S e rializ are a tip urilor p rim itiv e . . . . . 8.1.2 S e rializ are a ob ie c te lor . . . . . . . . . . 8.1.3 Clasa Ob je c tOutp utS tre am . . . . . . 8.1.4 Clasa Ob je c tInp utS tre am . . . . . . . 8.2 Ob ie c te se rializ ab ile . . . . . . . . . . . . . . . 8.2.1 Im p le m e ntare a inte rfe e i S e rializ ab le . t 8.2.2 Controlul se rializ rii . . . . . . . . . . a 8.3 P e rsonaliz are a se rializ rii ob ie c te lor . . . . . . a 8.3.1 Controlul v e rsiunilor c lase lor . . . . . . 8.3.2 S e c uriz are a d ate lor . . . . . . . . . . . 8.3.3 Im p le m e ntare a inte rfe e i E x te rnaliz ab le t 8.4 Clonare a ob ie c te lor . . . . . . . . . . . . . . . Interfata g ra c cu utiliz atorul a 9.1 Introd uc e re . . . . . . . . . . . . . . . . . . . 9.2 M od e lul A W T . . . . . . . . . . . . . . . . . . 9.2.1 Com p one nte le A W T . . . . . . . . . . 9.2.2 S up rafe e d e a are (Clasa Containe r) t s 9.3 G e stionare a p oz itionrii . . . . . . . . . . . . a 9.3.1 Folosire a g e stionarilor d e p oz itionare .

19 9 . 199 . 200 . 202 . 204 . 206 . 207

6 9.3.2 G e stionarul Flow L ay out . . . . . . . . . . . 9.3.3 G e stionarul B ord e rL ay out . . . . . . . . . . 9.3.4 G e stionarul G rid L ay out . . . . . . . . . . . 9.3.5 G e stionarul Card L ay out . . . . . . . . . . . 9.3.6 G e stionarul G rid B ag L ay out . . . . . . . . . 9.3.7 G rup are a c om p one nte lor (Clasa P ane l) . . . T ratare a e v e nim e nte lor . . . . . . . . . . . . . . . . 9.4.1 E x e m p lu d e tratare a e v e nim e nte lor . . . . . 9.4.2 T ip uri d e e v e nim e nte . . . . . . . . . . . . . 9.4.3 Folosire a ad ap torilor i a c lase lor anonim e . s Folosire a fe re stre lor . . . . . . . . . . . . . . . . . . 9.5.1 Clasa W ind ow . . . . . . . . . . . . . . . . . 9.5.2 Clasa Fram e . . . . . . . . . . . . . . . . . . 9.5.3 Clasa D ialog . . . . . . . . . . . . . . . . . . 9.5.4 Clasa File D ialog . . . . . . . . . . . . . . . Folosire a m e niurilor . . . . . . . . . . . . . . . . . . 9.6.1 Ie rarh ia c lase lor c e d e sc riu m e niuri . . . . . 9.6.2 T ratare a e v e nim e nte lor g e ne rate d e m e niuri 9.6.3 M e niuri d e c onte x t (p op up ) . . . . . . . . . 9.6.4 A c c e le ratori (Clasa M e nuS h ortc ut) . . . . . Folosire a c om p one nte lor A W T . . . . . . . . . . . . 9.7.1 Clasa L ab e l . . . . . . . . . . . . . . . . . . 9.7.2 Clasa B utton . . . . . . . . . . . . . . . . . 9.7.3 Clasa Ch e ck b ox . . . . . . . . . . . . . . . . 9.7.4 Clasa Ch e ck b ox G roup . . . . . . . . . . . . 9.7.5 Clasa Ch oic e . . . . . . . . . . . . . . . . . 9.7.6 Clasa L ist . . . . . . . . . . . . . . . . . . . 9.7.7 Clasa S c rollB ar . . . . . . . . . . . . . . . . 9.7.8 Clasa S c rollP ane . . . . . . . . . . . . . . . 9.7.9 Clasa T e x tFie ld . . . . . . . . . . . . . . . . 9.7.10 Clasa T e x tA re a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 210 211 212 214 218 219 221 224 227 232 232 233 236 239 242 243 246 247 250 250 251 252 253 255 257 259 261 262 263 265

9.4

9.5

9.6

9.7

10 D esenarea 10.1 Conc e p tul d e d e se nare . . . . . . . . . . . . 10.1.1 M e tod a p aint . . . . . . . . . . . . . 10.1.2 S up rafe e d e d e se nare - c lasa Canv as t 10.2 Conte x tul g rac d e d e se nare . . . . . . . . . 10.2.1 P rop rie t ile c onte x tului g rac . . . . at

269 . 269 . 270 . 271 . 274 . 275

CUPRINS 10.2.2 P rim itiv e g rac e . . . . . . . . . . Folosire a fonturilor . . . . . . . . . . . . . 10.3.1 Clasa Font . . . . . . . . . . . . . . 10.3.2 Clasa FontM e tric s . . . . . . . . . . Folosire a c ulorilor . . . . . . . . . . . . . . Folosire a im ag inilor . . . . . . . . . . . . . 10.5.1 A are a im ag inilor . . . . . . . . . s 10.5.2 M onitoriz are a rc rii im ag inilor nc a a 10.5.3 M e c anism ul d e d oub le -b u e ring . 10.5.4 S alv are a d e se ne lor form at J P E G n 10.5.5 Cre are a im ag inilor m e m orie . . n T ip rire a . . . . . . . . . . . . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 275 276 277 279 282 286 287 289 291 291 292 293 299 299 299 300 301 304 305 307 310 310 314 316 316 316 319 324 329 332 335 336 336 338 340

10.3

10.4 10.5

10.6

11 S w ing 11.1 Introd uc e re . . . . . . . . . . . . . . . . . 11.1.1 J FC . . . . . . . . . . . . . . . . . 11.1.2 S w ing A P I . . . . . . . . . . . . . . 11.1.3 A se m nri i d e ose b iri c u A W T . . a a s 11.2 Folosire a fe re stre lor . . . . . . . . . . . . . 11.2.1 Fe re stre inte rne . . . . . . . . . . . 11.3 Clasa J Com p one nt . . . . . . . . . . . . . 11.4 A rh ite c tura m od e lului S w ing . . . . . . . . 11.5 Folosire a m od e le lor . . . . . . . . . . . . . 11.5.1 T ratare a e v e nim e nte lor . . . . . . . 11.6 Folosire a c om p one nte lor . . . . . . . . . . 11.6.1 Com p one nte atom ic e . . . . . . . . 11.6.2 Com p one nte p e ntru e d itare d e te x t 11.6.3 Com p one nte p e ntru se le c tare a unor 11.6.4 T ab e le . . . . . . . . . . . . . . . . 11.6.5 A rb ori . . . . . . . . . . . . . . . . 11.6.6 Containe re . . . . . . . . . . . . . . 11.6.7 D ialog uri . . . . . . . . . . . . . . 11.7 D e se nare a . . . . . . . . . . . . . . . . . . 11.7.1 M e tod e sp e c ic e . . . . . . . . . . 11.7.2 Consid e ratii g e ne rale . . . . . . . . 11.8 L ook and Fe e l . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e le m e nte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . .

8 12 F ire de ex ecutie 12.1 Introd uc e re . . . . . . . . . . . . . . . . . 12.2 Cre are a unui r d e e x e c utie . . . . . . . . 12.2.1 E x tind e re a c lase i T h re ad . . . . . . 12.2.2 Im p le m e ntare a inte rfe e i R unnab le t 12.3 Cic lul d e v iat al unui r d e e x e c utie . . . a 12.3.1 T e rm inare a unui r d e e x e c utie . . 12.3.2 Fire d e e x e c utie d e tip d ae m on . 12.3.3 S tab ilire a p riorit ilor d e e x e c utie . at 12.3.4 S inc roniz are a re lor d e e x e c utie . . 12.3.5 S c e nariul p rod uc tor / c onsum ator a 12.3.6 M onitoare . . . . . . . . . . . . . . 12.3.7 S e m afoare . . . . . . . . . . . . . . 12.3.8 P rob le m e le g ate d e sinc roniz are . . 12.4 G rup are a re lor d e e x e c utie . . . . . . . . 12.5 Com unic are a p rin ux uri d e tip p ip e . . 12.6 Clase le T im e r i T im e rT ask . . . . . . . . s

CUPRINS 343 . 343 . 344 . 345 . 347 . 352 . 355 . 357 . 358 . 362 . 362 . 367 . 369 . 371 . 373 . 376 . 378 383 . 383 . 385 . 387 . 388 . 393 . 397 401 . 401 . 402 . 404 . 406 . 408 . 410 . 412 . 416 . 420 . 421 . 421

. . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

13 P rog ram are retea n 13.1 Introd uc e re . . . . . . . . . . . . . . . . . . 13.2 L uc rul c u U R L -uri . . . . . . . . . . . . . . 13.3 S ock e t-uri . . . . . . . . . . . . . . . . . . . 13.4 Com unic are a p rin c one x iuni . . . . . . . . . 13.5 Com unic are a p rin d atag ram e . . . . . . . . . 13.6 T rim ite re a d e m e saje c tre m ai m ulti c lie nti a 14 A ppleturi 14.1 Introd uc e re . . . . . . . . . . . . . . . 14.2 Cre are a unui ap p le t sim p lu . . . . . . . 14.3 Cic lul d e v iat al unui ap p le t . . . . . a 14.4 Inte rfata g rac c u utiliz atorul . . . . . a 14.5 D e nire a i folosire a p aram e trilor . . . s 14.6 T ag -ul A P P L E T . . . . . . . . . . . . 14.7 Folosire a re lor d e e x e c utie ap p le turi n 14.8 A lte m e tod e ofe rite d e c lasa A p p le t . . 14.9 A rh iv are a ap p le turilor . . . . . . . . . 14.10R e stric ii d e se c uritate . . . . . . . . . t 14.11A p p le turi c are sunt i ap lic atii . . . . . s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CUPRINS 15 L ucrul cu b az e de date 15.1 Introd uc e re . . . . . . . . . . . . . . . . . . 15.1.1 G e ne ralit i d e sp re b az e d e d ate . . . at 15.1.2 J D B C . . . . . . . . . . . . . . . . . 15.2 Cone c tare a la o b az d e d ate . . . . . . . . . a 15.2.1 Inre g istrare a unui d riv e r . . . . . . . 15.2.2 S p e c ic are a une i b az e d e d ate . . . . 15.2.3 T ip uri d e d riv e re . . . . . . . . . . . 15.2.4 R e aliz are a une i c one x iuni . . . . . . 15.3 E fe c tuare a d e se c v e nte S Q L . . . . . . . . . 15.3.1 Inte rfata S tate m e nt . . . . . . . . . . 15.3.2 Inte rfata P re p are d S tate m e nt . . . . . 15.3.3 Inte rfata Callab le S tate m e nt . . . . . 15.3.4 Ob ine re a i p re luc rare a re z ultate lor t s 15.3.5 Inte rfata R e sultS e t . . . . . . . . . . 15.3.6 E x e m p lu sim p lu . . . . . . . . . . . . 15.4 L uc rul c u m e ta-d ate . . . . . . . . . . . . . 15.4.1 Inte rfata D atab ase M e taD ata . . . . . 15.4.2 Inte rfata R e sultS e tM e taD ata . . . . 16 L ucrul dinam ic cu clase 16.1 Inc rc are a c lase lor m e m orie . . . . . . a n 16.2 M e c anism ul re e c trii . . . . . . . . . . a 16.2.1 E x am inare a c lase lor i inte rfe e lor s t 16.2.2 M anip ulare a ob ie c te lor . . . . . . 16.2.3 L uc rul d inam ic c u v e c tori . . . . . . . . . . . . . .

9 423 . 423 . 423 . 424 . 425 . 426 . 427 . 428 . 430 . 431 . 432 . 434 . 437 . 438 . 438 . 440 . 442 . 442 . 443 445 . 445 . 452 . 453 . 456 . 460

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

10

CUPRINS

Capitolul 1 Introducere Java n


1.1 Ce este Java ?

J av a e ste o te h nolog ie inov atoare lansat d e c om p ania S un M ic rosy ste m s a n 1995, c are a av ut un im p ac t re m arc ab il asup ra ntre g ii c om unit i a d e z at v oltatorilor d e softw are , im p un nd u-se p rin c alit i d e ose b ite c um ar sim a at p litate , rob uste e i nu ultim ul r nd p ortab ilitate . D e num it initial OAK, t s n a a te h nolog ia J av a e ste form at d intr-un lim b aj d e p rog ram are d e niv e l a nalt p e b az a c ruia sunt c onstruite o se rie d e p latform e d e stinate im p le m e ntrii d e a a ap lic atii p e ntru toate se g m e nte 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 e nta d e taliu asp e c te le te h nic e ale lim b ajului J av a, s am n a intim c arac te ristic ile sale p rinc ip ale , c are l-au transform at ntr-un inte rv al d e tim p at t d e sc urt a ntr-una d in c e le m ai p up ulare op iuni p e ntru d e z v oltare a t d e ap lic atii, ind ife re nt d e d om e niu sau d e c om p le x itate a lor. S im plitate - e lim in sup ra rc are a op e ratorilor, m o te nire a m ultip l a nc a s a i toate fac ilit ile c e p ot p rov oc a sc rie re a unui c od c onfuz . s at U urint c re are a d e ap lic atii c om p le x e c e folose sc p rog ram are a s a n n re e a, re d e e x e c utie , inte rfat g rac , b az e d e d ate , e tc . t a a R ob ustete - e lim in surse le fre c v e nte d e e rori c e ap ar p rog ram are a n p rin re nuntare a la p ointe ri, ad m inistrare a autom at a m e m orie i i e lim a s 11

12

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN inare a p ie rd e rilor d e m e m orie p rintr-o p roc e d ur d e c ole c tare a ob ie c te lor a c are nu m ai sunt re fe rite , c e rule az fund al ( g arb ag e c olle c tor ). a n Com plet orientat pe ob iecte - e lim in c om p le t stilul d e p rog ram are a p roc e d ural. S ecuritate - e ste un lim b aj d e p rog ram are foarte sig ur, furniz nd a m e c anism e stric te d e se c uritate a p rog ram e lor c onc re tiz ate p rin: v e ric are a d inam ic a c od ului p e ntru d e te c tare a se c v e nte lor p e ric uloase , a im p une re a unor re g uli stric te p e ntru rulare a p roc e se lor la d istant, e tc . a N eutralitate arh itectural - c om p ortam e ntul une i ap lic atii J av a nu a d e p ind e d e arh ite c tura z ic a m a inii p e c are rule az . a s a P ortab ililtate - J av a e ste un lim b aj ind e p e nd e nt d e p latform a d e luc ru, ac e e a i ap lic atie rul nd fr nic i o m od ic are i fr a ne c e sita re s a aa s aa c om p ilare a e i p e siste m e d e op e rare d ife rite c um ar W ind ow s, L inux , M ac OS , S olaris, e tc . luc ru c are ad uc e e c onom ii sub stantiale rm e lor d e z v oltatoare d e ap lic atii. E ste com pilat i interpretat, ac e asta ind solutia e c ie nt p e ntru s a ob ine re a p ortab ilit ii. t at P erform ant - d e i m ai le nt d e c t lim b aje le d e p rog ram are c are g e ne re az a s a a e x e c utab ile nativ e p e ntru o anum it p latform d e luc ru, c om p ilatorul a a J av a asig ur o p e rform ant rid ic at a c od ului d e oc te i, astfe l t a a a t nc a v ite z a d e luc ru p utin m ai sc z ut nu v a un im p e d im e nt d e z v oltare a a a n d e ap lic atii oric t d e c om p le x e , inc lusiv g rac 3D , anim atie , e tc . a a E ste m odelat dup C i C++, tre c e re a d e la C, C+ + la J av a a s fc nd u-se foarte u or. a a s

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 oltare a unor te h nolog ii d e d ic ate re z olv rii unor p rob le m e d in c e le m ai d iv e rse d om e nii. A c e ste te h nolog ii a au fost g rup ate a a num ite le p la tfo rm e d e lu cru , c e re p re z int se turi d e n s a lib rrii sc rise lim b ajul J av a, p re c um i d iv e rse p rog ram e utilitare , folosite a n s p e ntru d e z v oltare a d e ap lic atii sau c om p one nte d e stinate une i anum e c ate g orii d e utiliz atori.

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 luc ru c e ofe r sup ort p e ntru c re are a d e a ap lic atii ind e p e nd e nte i ap p le turi. s D e ase m e ne a, aic i e ste inc lus i te h nolog ia Java W eb S tart c e furniz e az as a o m od alitate e x tre m d e fac il p e ntru lansare a i instalare a loc al a p roa s a g ram e lor sc rise J av a d ire c t d e p e W e b , ofe rind c e a m ai c om od solutie n a p e ntru d istrib utia i ac tualiz are a ap lic atiilor J av a. s J2 M E (M ic ro E d ition) Folosind J av a, p rog ram are a d isp oz itiv e lor m ob ile e ste e x tre m d e sim p l, a p latform a d e luc ru J 2M E ofe rind sup ortul ne c e sar sc rie rii d e p rog ram e d e d ic ate ac e stui sc op . J2 E E (E nte rp rise E d ition) A c e ast p latform ofe r A P I-ul ne c e sar d e z v oltrii d e ap lic atii c om a a a a p le x e , form ate d in c om p one nte c e tre b uie s rule z e siste m e e te rog e ne , a n c u inform atiile m e m orate b az e d e d ate d istrib uite , e tc . n T ot aic i g sim i sup ortul ne c e sar p e ntru c re are a d e aplicatii i servicii a s s W eb , b az ate p e c om p one nte c um ar se rv le turi, p ag ini J S P , e tc . T oate d istrib utiile J av a sunt ofe rite g ratuit i p ot d e sc rc ate d e p e s a Inte rne t d e la ad re sa h ttp :/ / jav a.sun.c om . In c ontinuare , v om folosi te rm e nul J 2S D K p e ntru a ne re fe ri la d istrib utia stand ard J 2S E 1.5 S D K (T ig e r).

1.1.3

Java: un lim b aj com pilat i interpretat s

In func ie d e m od ul d e e x e c utie a ap lic atiilor, lim b aje le d e p rog ram are se t p art d ou c ate g orii: m n a Interpretate: instruc iunile sunt c itite linie c u linie d e un p rog ram t num it in terp reto r i trad use instruc iuni m a in. A v antajul ac e ss n t s a te i solutii e ste sim p litate a i fap tul c ind inte rp re tat d ire c t sursa s a a p rog ram ului ob ine m p ortab ilitate a. D e z av antajul e v id e nt e ste v ite z a t d e e x e c utie re d us. P rob ab il c e l m ai c unosc ute lim b aj inte rp re tat e ste a lim b ajul B asic . Com pilate: c od ul surs al p rog ram e lor e ste transform at d e co m p ia la to r ntr-un c od c e p oate e x e c utat d ire c t d e p roc e sor, num it co d

14

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN m a in . A v antajul e ste e x e c utia e x tre m d e rap id , d e z av antajul ind s a a lip sa p ortab ilit ii, c od ul c om p ilat at ntr-un form at d e niv e l sc z ut nu a p oate rulat d e c t p e p latform a d e luc ru p e c are a fost c om p ilat. a

L im b ajul J av a c om b in solutiile am intite m ai sus, p rog ram e le J av a ind a at t inte rp re tate c t i c om p ilate . A ad ar v om av e a la d isp oz itie un c om p ia a s s lator re sp onsab il c u transform are a surse lor p rog ram ului a a num itul co d n s d e o cteti, p re c um i un inte rp re tor c e v a e x e c uta re sp e c tiv ul c od d e oc te i. s t Cod ul d e oc te i e ste d ife rit d e c od ul m a in. Cod ul m a in e ste re p re z e nt s a s a tat d e o suc c e siune d e instruc iuni sp e c ic e unui anum it p roc e sor i une i ant s um ite p latform e d e luc ru re p re z e ntate form at b inar astfe l t s p oat n nc a a a e x e c utate fr a m ai ne c e sita nic i o p re luc rare . aa Cod urile d e oc te i sunt se turi d e instruc iuni c are se am n c u c od ul sc ris t t a a lim b aj d e asam b lare i sunt g e ne rate d e c om p ilator ind e p e nd e nt d e m e d iul n s d e luc ru. In tim p c e c od ul m a in e ste e x e c utat d ire c t d e c tre p roc e sor i s a a s p oate folosit num ai p e p latform a p e c are a fost c re at, c od ul d e oc te i e ste t inte rp re tat d e m e d iul J av a i d e ac e e a p oate rulat p e oric e p latform p e s a c are e ste instalat m e d iul d e e x e c utie J av a. a P rin m a in a virtu a l J a va (J V M ) v om e le g e m e d iul d e e x e c utie al s a nt ap lic atiilor J av a. P e ntru c a un c od d e oc te i s p oat e x e c utat p e un t a a anum it c alc ulator, p e ac e sta tre b uie s e instalat o m a in v irtual J av a. a a s a a A c e st luc ru e ste re aliz at autom at d e c tre d istrib utia J 2S D K . a

1.2

P rim ul prog ram

Cre are a oric re i ap lic atii J av a p re sup une e fe c tuare a urm torilor p a i: a a s

1. S criererea codului surs a

class FirstApp { public static void main( String args[]) { System.out.println("Hello world!"); } }

1 .2 . PRIM UL PRO G RAM

15

T oate ap lic atiile J av a c ontin o c las p rinc ip al(p rim ar) c are tre b uie a a a n s se g ase asc m e tod a main. Clase le ap lic atie i se p ot g asi e a a ntr-un sing ur ie r, e m ai m ulte . s n

2 . S alvarea ierelor surs s a S e v a fac e ie re c are au ob lig atoriu e x te nsia java, nic i o alt e x te nn s a sie ne ind ac c e p tat. E ste re c om and at c a ie rul c are c ontine c od ul surs a s a al c lase i p rim are s aib ac e la i num e c u c e l al c lase i, d e i ac e st luc ru nu a a s s e ste ob lig atoriu. S p re sup une m c am salv at e x e m p lul d e m ai sus ie rul a a n s C:\intro\FirstApp.java.

3 . Com pilarea aplicatiei P e ntru c om p ilare v om folosi c om p ilatorul javac d in d istrib utia J 2S D K . A p e lul c om p ilatorului se fac e p e ntru ie rul c e c ontine c lasa p rinc ip al a s a ap lic atie i sau p e ntru oric e ie r/ ie re c u e x te nsia java. Com p ilatorul c re e az s s a c te un ie r se p arat p e ntru e c are c las a p rog ram ului. A c e ste a au e x te nsia a s a .class i im p lic it sunt p lasate ac e la i d ire c tor c u ie re le surs. s n s s a javac FirstApp.java In c az ul c are c om p ilare a a re u it v a g e ne rat ie rul FirstApp.class. n s s

4 . R ularea aplicatiei S e fac e c u inte rp re torul java, ap e lat p e ntru unitate a d e c om p ilare c ore sp unz toare c lase i p rinc ip ale . D e oare c e inte rp re torul are c a arg um e nt d e a intrare num e le c lase i p rinc ip ale i nu num e le unui ie r, ne v om p oz itiona s s d ire c torul c e c ontine ie rul FirstApp.class i v om ap e la inte rp re torul n s s astfe l: java FirstApp R ulare a une i ap lic atii c are nu folose te inte rfat g rac , se v a fac e s a a ntr-o fe re astr siste m . a

16

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

A tentie U n ap e l d e g e nul java c:\intro\FirstApp.class e ste g re it! s

1.3
1.3 .1

S tructura lex ical a lim b ajului Java a


S etul de caractere

L im b ajului J av a luc re az m od nativ folosind se tul d e c arac te re U nic od e . a n A c e sta e ste un stand ard inte rnational c are nloc uie te v e ch iul se t d e c arac te re s A S CII i c are folose te p e ntru re p re z e ntare a c arac te re lor 2 oc te i, c e e a c e s s t am n c se p ot re p re z e nta 65536 d e se m ne , sp re d e ose b ire d e A S CII, und e nse a a e ra p osib il re p re z e ntare a a d oar 256 d e c arac te re . P rim e le 256 c arac te re a U nic od e c ore sp und c e lor A S CII, re fe rire a la c e le lalte fc nd u-se p rin \uxxxx, a a und e xxxx re p re z int c od ul c arac te rului. a O alt c arac te ristic a se tului d e c arac te re U nic od e e ste fap tul c a a a ntre g inte rv alul d e re p re z e ntare a sim b olurilor e ste d iv iz at sub inte rv ale num ite n b locuri, c te v a e x e m p le d e b loc uri ind : B asic L atin, G re e k , A rab ic , G oth ic , a Curre nc y , M ath e m atic al, A rrow s, M usic al, e tc . M ai jos sunt ofe rite c te v a e x e m p le d e c arac te re U nic od e . a \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 ti s \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 one z , Core e an) M ai m ulte inform atii le g ate d e re p re z e ntare a U nic od e p ot ob inute la t ad re sa h ttp :/ / w w w .unic od e .org .

1.3 .2

Cuvinte ch eie

Cuv inte le re z e rv ate J av a sunt, c u c te v a e x c e p ii, c e le d in C+ + i au fost n a t s e num e rate tab e lul d e m ai jos. A c e ste a nu p ot folosite c a num e d e c lase , n

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

17

inte rfe e , v ariab ile sau m e tod e . true, false, null nu sunt c uv inte ch e ie , t d ar nu p ot nic i e le folosite c a num e ap lic atii. Cuv inte le m arc ate p rin n sunt re z e rv ate , d ar nu sunt folosite . abstract boolean break byte case catch char class const* continue default do double else extends final finally float for goto* if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while

Inc e p nd c u v e rsiune a 1.5, m ai e x ist i c uv ntul ch e ie enum. a as a

1.3 .3

Identi catori

S unt se c v e nte ne lim itate d e lite re i c ifre U nic od e , e p nd c u o lite r. D up s nc a a a c um am m ai sp us, id e ntic atorii nu au v oie s e id e ntic i c u c uv inte le re z e ra v ate .

1.3 .4

L iterali

L ite ralii p ot d e urm toare le tip uri: a Intreg i S unt ac c e p tate 3 b az e d e num e ratie : b az a 10, b az a 16 ( e p c u c ar nc ac te re le 0x ) i b az a 8 ( e p c u c ifra 0) i p ot d e d ou tip uri: s nc s a norm ali - se re p re z int p e 4 oc te i (32 b iti) a t lung i - se re p re z int p e 8 oc te i (64 b iti) i se te rm in c u c arac te rul a t s a L (sau l).

18

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN F lotanti P e ntru c a un lite ral s e c onsid e rat otant e l tre b uie s aib c e l p utin o a a a z e c im al d up v irg ul, s e notatie e x p one ntial sau s aib sux ul a a a a n a a a F sau f p e ntru v alorile norm ale - re p re z e ntate p e 32 b iti, re sp e c tiv D sau d p e ntru v alorile d ub le - re p re z e ntate p e 64 b iti. E x e m p le : 1.0, 2e2, 3f , 4D. L og ici S unt re p re z e ntati d e true - v aloare a log ic d e ad e v r, re sp e c tiv false a a - v aloare a log ic d e fals. a

A tentie S p re d e ose b ire d e C+ + , lite ralii ntre g i 1 i 0 nu m ai au se m nic atia s d e ad e v rat, re sp e c tiv fals. a

Caracter U n lite ral d e tip c arac te r e ste utiliz at p e ntru a e x p rim a c arac te re le c od ului U nic od e . R e p re z e ntare a se fac e e folosind o lite r, e o se c v e nt a a esca p e sc ris a ntre ap ostrofuri. S e c v e nte le e sc ap e p e rm it sp e c ic are a c arac te re lor c are nu au re p re z e ntare g rac i re p re z e ntare a unor c aras ac te re sp e c iale p re c um b ack slash , ap ostrof, e tc . S e c v e nte le e sc ap e p re d e nite J av a sunt: n \b : B ack sp ac e (B S ) \t : T ab oriz ontal (H T ) \n : L inie nou (L F) a \f : P ag in nou (FF) a a \r : Inc e p ut d e r nd (CR ) a \" : G h ilim e le \ : A p ostrof \\ : B ack slash

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

19

S iruri de caractere U n lite ral ir d e c arac te re e ste form at d in z e ro sau m ai m ulte c arac te re s ntre g h ilim e le . Carac te re le c are form e az irul p ot c arac te re g rac e as sau se c v e nte e sc ap e . D ac irul e ste p re a lung e l p oate sc ris c a o c onc ate nare d e sub iruri as s d e d im e nsiune m ai m ic , c onc ate nare a irurilor re aliz nd u-se c u op e ra s a atorul +, c a e x e m p lul: "Ana " + " are " + " mere ". S irul v id n e ste "". D up c um v om v e d e a, oric e ir e ste d e fap t o instant a c lase i String, a s a d e nit p ach e tul java.lang. a n

1.3 .5

S eparatori

U n se p arator e ste un c arac te r c are ind ic sf r itul une i unit i le x ic ale i a as at s nc e p utul alte ia. In J av a se p aratorii sunt urm torii: ( ) a [ ] ; , . . Instruc iunile unui p rog ram se se p ar c u p unc t i v irg ul. t a s a

1.3 .6

O peratori

Op e ratorii J av a sunt, c u m ic i d e ose b iri, c e i d in C+ + : atrib uire a: = op e ratori m ate m atic i: +, -, *, /, %, ++, -- . E ste p e rm is notatia p re sc urtat d e form a lval op= rval: x += 2 n a a -= 3 E x ist op e ratori p e ntru autoinc re m e ntare i autod e c re m e ntare (p ost i a s s p re ): x++, ++x, n--, --n E v aluare a e x p re siilor log ic e se fac e p rin m e tod a scu rtcircu itu lu i: e v aluare a se op re te m om e ntul c are v aloare a d e ad e v r a e x p re sie i e ste s n n a sig ur d e te rm inat. a op e ratori log ic i: &&(and), ||(or), !(not) op e ratori re lationali: <, <=, >, <=, ==, != op e ratori p e b iti: &(and), |(or), ^ (xor), ~ (not) op e ratori d e translatie : <<, >>, >>> (shift la dreapta fr semn) a a

20

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN op e ratorul if-else : expresie-logica ? val-true : val-false

op e ratorul , (v irg ul) folosit p e ntru e v aluare a se c v e ntial a op e ratiilor: a a int x=0, y=1, z=2; op e ratorul + p e ntru c onc ate nare a irurilor: s String s1="Ana"; String s2="mere"; int x=10; System.out.println(s1 + " are " + x + " " + s2); op e ratori p e ntru c onv e rsii (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 ist tre i fe luri d e c om e ntarii: a Com e ntarii p e m ai m ulte linii, nch ise ntre / * i * / . s Com e ntarii p e m ai m ulte linii c are in d e d oc um e ntatie , t nch ise ntre / * * i * / . T e x tul d intre c e le d ou se c v e nte e ste autom at m utat s a n d oc um e ntatia ap lic atie i d e c tre g e ne ratorul autom at d e d oc um e ntatie a javadoc. Com e ntarii p e o sing ur linie , c are inc e p c u //. a Ob se rv atii: N u p ute m sc rie c om e ntarii inte riorul altor c om e ntarii. n N u p ute m introd uc e c om e ntarii inte riorul lite ralilor c arac te r sau ir n s d e c arac te re . S e c v e nte le /* i */ p ot s ap ar p e o linie d up se c v e nta // d ar si s a a a p ie rd se m nic atia. L a fe l se ntam p l c u se c v e nta // c om e ntarii c are a n inc e p c u /* sau */.

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

21

1.4
1.4 .1

T ipuri de date i variab ile s


T ipuri de date

In J av a tip urile d e d ate se im p art d ou c ate g orii: tipuri prim itive i n a s tipuri referint . J av a p orne te d e la p re m iz a c oric e e ste un ob ie c t , a s a p rin urm are tip urile d e d ate ar tre b ui s e d e fap t d e nite d e c lase i toate a s v ariab ile le ar tre b ui s m e m ore z e instante ale ac e stor c lase (ob ie c te ). In a p rinc ip iu ac e st luc ru e ste ad e v rat, a, p e ntru usurinta p rog ram rii, m ai a ns a e x ist i a a num ite le tip urile p rim itiv e d e d ate , c are sunt c e le uz uale : as s aritm etice ntreg i: byte (1 oc te t), short (2), int (4), long (8) reale: float (4 oc te ti), double (8) caracter: char (2 oc te i) t log ic: boolean (true i false) s In alte lim b aje d e p rog ram are form atul i d im e nsiune a tip urilor p rim itiv e d e s d ate p ot d e p ind e d e p latform a p e c are rule az p rog ram ul. In J av a ac e st luc ru a nu m ai e ste v alab il, oric e d e p e nd e nt d e o anum it p latform sp e c ic ind a a a a e lim inat. a

V e c torii, c lase le i inte rfe e le sunt tip uri re fe rint. V aloare a une i v ariab ile s t a d e ac e st tip e ste , sp re d e ose b ire d e tip urile p rim itiv e , o re fe rint (ad re s d e a a m e m orie ) c tre v aloare a sau m ultim e a d e v alori re p re z e ntat d e v ariab ila a a re sp e c tiv . a

E x ist tre i tip uri d e d ate d in lim b ajul C c are nu sunt sup ortate d e lim a b ajul J av a. A c e ste a sunt: pointer, struct i union. P ointe rii au fost s e lim inati d in c auz c e rau o surs c onstant d e e rori, loc ul lor ind luat d e a a a a tip ul re fe rint, iar struct i union nu si m ai au rostul at t tim p c t tip urile a s a a c om p use d e d ate sunt form ate J av a p rin inte rm e d iul c lase lor. n

22

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

1.4 .2

V ariab ile

V ariab ile le p ot d e tip p rim itiv sau re fe rinte la ob ie c te (tip re fe rint). In a d ife re nt d e tip ul lor, p e ntru a p ute a folosite v ariab ile le tre b uie d e c larate i, s e v e ntual, initializ ate . D e c larare a v ariab ile lor: Tip numeVariabila; Initializ are a v ariab ile lor: Tip numeVariabila = valoare; D e c larare a c onstante lor: final Tip numeVariabila; E v id e nt, e x ist p osib ilitate a d e a d e c lara i initializ a m ai m ulte v ariab ile a s sau c onstante d e ac e la i tip s ntr-o sing ur instruc iune astfe l: a t Tip variabila1[=valoare1], variabila2[=valoare2],...; Conv e ntia d e num ire a v ariab ile lor J av a inc lud e , p rintre alte le , urm toare le n a c rite rii: v ariab ile le nale (c onstante ) se sc riu c u m ajusc ule ; v ariab ile le c are nu sunt c onstante se sc riu astfe l: p rim a lite r m ic iar a a d ac num e le v ariab ile i e ste form at d in m ai m ulti atom i le x ic ali, atunc i a p rim e le lite re ale c e lorlalti atom i se sc riu c u m ajusc ule . 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 ie d e loc ul c are sunt d e c larate v ariab ile le se p art urm toate le t n m n a c ate g orii: a. V ariab ile m e m b re , d e c larate inte riorul une i c lase , v iz ib ile p e ntru n toate m e tod e le c lase i re sp e c tiv e c t i p e ntru alte c lase func ie d e a s n t niv e lul lor d e ac c e s (v e z i D e c larare a v ariab ile lor m e m b re ).

1 .4 . T IPURI D E D AT E SI V ARIAB IL E b . P aram e tri m e tod e lor, v iz ib ili d oar m e tod a re sp e c tiv . n a

23

c . V ariab ile loc ale , d e c larate ntr-o m e tod , v iz ib ile d oar m e tod a re a n sp e c tiv . a d . V ariab ile loc ale , d e c larate ntr-un b loc d e c od , v iz ib ile d oar b loc ul n re sp e c tiv . e . P aram e trii d e la tratare a e x c e p iilor (v e z i T ratare a e x c e p iilor ). t t 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 se rv atii: V ariab ile le d e c larate ntr-un for, rm n loc ale c orp ului c ic lului: a a for(int i=0; i<100; i++) { //domeniul de vizibilitate al lui i } i = 101;//incorect N u e ste p e rm is asc und e re a une i v ariab ile : a

24

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN int x=1; { int x=2; //incorect }

1.5

Controlul ex ecutiei

Instruc iunile J av a p e ntru c ontrolul e x e c utie i sunt foarte ase m ntoare c e lor t a a d in lim b ajul C i p ot p rtite urm toare le c ate g orii: s m a n a Instruc iuni d e d e c iz ie : if-else, switch-case t Instruc iuni d e salt: for, while, do-while t Instruc iuni p e ntru tratare a e x c e p iilor: try-catch-finally, throw t t A lte instruc iuni: break, continue, return, la bel: t

1.5 .1
if-else

Instructiuni de deciz ie

if (expresie-logica) { ... } if (expresie-logica) { ... } else { ... } sw itch -case switch (variabila) { case valoare1: ... break; case valoare2:

1 .5 . CO NT RO L UL E X E CUT IE I ... break; ... default: ... }

25

V ariab ile le c are p ot te state folosind instruc iune a switch nu p ot d e c t t a d e tip uri p rim itiv e .

1.5 .2
for

Instructiuni de salt

for(initializare; expresie-logica; pas-iteratie) { //Corpul buclei } for(int i=0, j=100 ; i < 100 && j > 0; i++, j--) { ... } A t t la initializ are c t i p asul d e ite ratie p ot m ai m ulte instruc iuni a a s n t d e sp rtite p rin v irg ul. a a

w h ile while (expresie-logica) { ... }

do-w h ile do { ... } while (expresie-logica);

26

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

1.5 .3

Instructiuni pentru tratarea ex ceptiilor

Instruc iunile p e ntru tratare a e x c e p iilor sunt try-catch-finally, re sp e c tiv t t throw i v or tratate c ap itolul E x c e p ii . s n t

1.5 .4

A lte instructiuni

break: p rse te fortat c orp ul une i struc turi re p e titiv e . aa s continue: te rm ina fortat ite ratia c ure nt a unui c ic lu i tre c e la urm toare a a s a ite ratie . return [valoare]: te rm in o m e tod i, e v e ntual, re turne az o v aloa as a rare . n u m eE tich eta : : D e ne te o e tich e t. s a D e i J av a nu e x ist goto, se p ot d e ni totu i e tich e te folosite e x p re sii s n a s n d e g e nul: break numeEticheata sau continue numeEticheta, utile p e ntru a c ontrola p unc tul d e ie ire d intr-o struc tur re p e titiv , c a x e m p lul d e s a a ne m 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
1.6 .1

V ectori
Crearea unui vector

Cre are a unui v e c tor p re sup une re aliz are a urm toare lor e tap e : a

1 .6 . V E CT O RI

27

D eclararea v e c torului - P e ntru a p ute a utiliz a un v e c tor tre b uie , nainte d e toate , sa-l d e c larm . A c e st luc ru se fac e p rin e x p re sii d e form a: a Tip[] numeVector; sau Tip numeVector[]; c a e x e m p le le d e m ai jos: n int[] intregi; String adrese[]; Instantierea D e c larare a unui v e c tor nu im p lic i aloc are a m e m orie i ne c e sare p e ntru as re ine re a e le m e nte lor. Op e ratiune a d e aloc are a m e m orie i, num it i t a s instantie re a v e c torului, se re aliz e az a ntotd e auna p rin inte rm e d iul op e ratorului new. Instantie re a unui v e c tor se v a fac e p rintr-o e x p re sie d e g e nul: numeVector = new Tip[nrElemente]; und e n rE lem en te re p re z int num rul m ax im d e e le m e nte p e c are le a a p oate av e a v e c torul. In urm a instantie rii v or aloc ati: nr E lem ente d im ensiu ne(T ip ) oc te i ne c e sari m e m orrii e le m e nte lor d in v e c tor, und e t a p rin d im ensiu ne(T ip ) am notat num rul d e oc te i p e c are se re p re z int a t a tip ul re sp 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 larare a i instantie re a unui v e c tor p ot fc ute sim ultan astfe l: s a Tip[] numeVector = new Tip[nrElemente];

28

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN Initializ area (op ional) D up d e c larare a unui v e c tor, ac e sta p oate t a initializ at, ad ic e le m e nte le sale p ot p rim i ni te v alori initiale , e v id e nt a s d ac e ste c az ul p e ntru a a c e v a. In ac e st c az instantie re a nu m ai tre b uie a s fac ut e x p lic it, aloc are a m e m orie i fc nd u-se autom at func ie d e a a a n t num rul d e e le m e nte c u c are se initializ e az v e c torul. a a 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 e ste 0, d e c i p oz itiile unui v e c tor c u n e le m e nte v or c up rinse ntre 0 i n 1. N u sunt p e rm ise c onstruc ii d e g e nul s t Tip numeVector[nrElemente], aloc are a m e m orie i fc nd u-se d oar p rin ina a te rm e d iul op e aratorului new. int v[10]; int v[] = new int[10]; //ilegal //corect

1.6 .2

T ab louri m ultidim ensionale

In J av a tab lourile m ultid im e nsionale sunt d e fap t v e c tori d e v e c tori. D e e x e m p lu, c re are a i instantie re a une i m atric i v or re aliz ate astfe l: s Tip matrice[][] = new Tip[nrLinii][nrColoane]; matrice[i] e ste linia i a m atric ii i re p re z int un v e c tor c u nr Coloane s a e le m e nte iar matrice[i][j] e ste e le m e ntul d e p e linia i i c oloana j. s

1.6 .3

D im ensiunea unui vector

Cu ajutorul v ariab ile i leng th se p oate a a num rul d e e le m e nte al unui a v 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 e ntru a e le g e m od alitate a d e folosire a lui length tre b uie m e ntionat c nt a e c are v e c tor e ste d e fap t o instant a une i c lase iar length e ste o v ariab il a a p ub lic a ac e le i c lase , c are e ste re inut num rul m ax im d e e le m e nte al a n t a v e c torului.

1 .6 . V E CT O RI

29

1.6 .4

Copierea vectorilor

Cop ie re a e le m e nte lor unui v e c tor a ntr-un alt v e c tor b se p oate fac e , e e le m e nt c u e le m e nt, e c u ajutorul m e tod e i System.arraycopy, c a e x e m n p le le d e m ai jos. D up c um v om v e d e a, o atrib uire d e g e nul b = a are alt a a se m nic atie d e c t c op ie re a e le m e nte lor lui a b i nu p oate folosit a n s a n ac e st sc op . 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 ac c e nt d e ose b it p e im p le m e ntare a unor struc turi d e d ate i alg oritm i c are s sim p lic e p roc e se ul d e c re are a a unui alg oritm , p rog ram s a atorul tre b uind s se c onc e ntre z e p e asp e c te le sp e c ic e p rob le m e i ab ord ate . a Clasa java.util.Arrays ofe r d iv e rse m e tod e foarte utile luc rul c u v e c a n tori c um ar : sort - sorte az asc e nd e nt un v e c tor, folosind un alg oritm d e tip Q u icka S o rt p e rform ant, d e c om 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 utare a b inar a une i anum ite v alori a a ntr-un v e c tor sortat;

30

CAPIT O L UL 1 . INT RO D UCE RE J AV A IN eq uals - te stare a e g alit ii v alorilor a d oi v e c tori (au ac e le a i num r at s a d e e le m e nte i p e ntru e c are ind ic e v alorile c ore sp unz toare d in c e i d oi s a v e c tori sunt e g ale ) ll - atrib uie e c rui e le m e nt d in v e c tor o v aloare sp e c ic at. a a

1.6 .6

V ectori cu dim ensiune variab il i eterog eni as

Im p le m e ntri ale v e c torilor c u num r v ariab il d e e le m e nte sunt ofe rite d e a a c lase sp e c ializ ate c um ar 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 e ni, ale c ror e le m e nte au tip ul Object, a i v or stud iati c ap itolul Cole c ii . s n t

1.7

S iruri de caractere

In J av a, un ir d e c arac te re p oate re p re z e ntat p rintr-un v e c tor form at s d in e le m e nte d e tip char, un ob ie c t d e tip S tring sau un ob ie c t d e tip S tring B u er. D ac un ir d e c arac te re e ste c onstant (nu se d ore te sch im b are a c ontinutului a s s s p e p arc ursul e x e c utie i p rog ram ului) atunc i e l v a d e c larat d e tip ul String, a altfe l v a d e c larat d e tip StringBuffer. D ife re nta p rinc ip al a ntre ac e ste c lase e ste c StringBuffer p une la d isp oz itie m e tod e p e ntru m od ic are a a c ontinutului irului, c um ar : append, insert, delete, reverse. s U z ual, c e a m ai folosit m od alitate d e a luc ra c u iruri e ste p rin inte rm e d iul a s c lase i String, c are are i une le p artic ularit i fat d e re stul c lase lor m e nite s s at a a sim p lic e c t m ai m ult folosire a irurilor d e c arac te re . Clasa StringBuffer a s v a utiliz at p re d om inant ap lic atii d e d ic ate p roc e srii te x te lor c um ar a n a e d itoare le d e te x te . E x e m p le e ch iv ale nte d e d e c larare a unui ir: s String s = "abc"; String s = new String("abc"); char data[] = {a, b, c}; String s = new String(data); Ob se rv ati p rim a v ariant d e d e c larare a irului s d in e x e m p lul d e m ai sus a s - d e altfe l, c e a m ai folosit - c are p re z int o p artic ularitate a c lase i String a a fata d e re stul c lase lor J av a re fe ritoare la instantie re a ob ie c te lor sale .

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 Conc ate nare a irurilor d e c arac te re se fac e p rin inte rm e d iul op e ratorului s + sau, c az ul irurilor d e tip StringBuffer, folosind m e tod a append. n s String s1 = "abc" + "xyz"; String s2 = "123"; String s3 = s1 + s2; In J av a, op e ratorul d e c onc ate nare + e ste e x tre m d e e x ib il, se nsul c n a p e rm ite c onc ate nare a irurilor c u ob ie c te d e oric e tip c are au o re p re z e ntare s d e tip ir d e c arac te re . M ai jos, sunt c te v a e x e m p le : s a System.out.print("Vectorul v are" + v.length + " elemente"); String x = "a" + 1 + "b" P e ntru a lm uri p utin luc rurile , c e e a c e e x e c ut c om p ilatorul atunc i c nd a a a alne te o se c v e nt d e g e nul String x = "a" + 1 + "b" e ste : nt s a String x = new StringBuffer().append("a").append(1). append("b").toString() A te ntie a la ord ine a d e e fe c tuare a op e ratiilor. S irul s=1+2+"a"+1+2 ns v a av e a v aloare a "3a12", p rim ul + ind op e ratorul m ate m atic d e ad unare iar al d oile a + , c e l d e c onc ate nare a irurilor. s

1.8
1.8 .1

F olosirea arg um entelor de la linia de com and a


T ransm iterea arg um entelor

O ap lic atie J av a p oate p rim i oric te arg um e nte d e la linia d e c om and a a n m om e ntul lansrii e i. A c e ste arg um e nte sunt utile p e ntru a p e rm ite utiliz aa torului s sp e c ic e d iv e rse op iuni le g ate d e func ionare a ap lic atie i sau s a t t a furniz e z e anum ite d ate initiale p rog ram ului.

A tentie P rog ram e le c are folose sc arg um e nte d e la linia d e c om and nu sunt 100% a p ure J av a, d e oare c e une le siste m e d e op e rare , c um ar M ac OS , nu au n m od norm al linie d e c om and . a

32

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

A rg um e nte le d e la linia d e c om and sunt introd use la lansare a une i ap lic atii, a ind sp e c ic ate d up num e le ap lic atie i i se p arate p rin sp atiu. D e e x e m p lu, a s s p re sup une m c ap lic atia Sortare ord one az le x ic og rac (alfab e tic ) liniile a a a unui ie r i p rim e te c a arg um e nt d e intrare num e le ie rului p e c are s s s s s a sorte z e . P e ntru a ord ona ie rul "persoane.txt", ap lic atia v a lansat l s a astfe l: java Sortare persoane.txt A ad ar, form atul g e ne ral p e ntru lansare a une i ap lic atii c are p rim e te arg us s m e nte d e la linia d e c om and e ste : a java NumeAplicatie [arg0 arg1 . . . argn] In c az ul c are sunt m ai m ulte , arg um e nte le tre b uie se p arate p rin sp atii n iar d ac unul d intre arg um e nte c ontine sp atii, atunc i e l tre b uie p us a ntre g h ilim e le . E v id e nt, o ap lic atie p oate s nu p rim e asc nic i un arg um e nt sau a a p oate s ig nore arg um e nte le p rim ite d e la linia d e c om and . a a

1.8 .2

P rim irea arg um entelor

In m om e ntul lansrii une i ap lic atii inte rp re torul p arc urg e linia d e c om and c u a a c are a fost lansat ap lic attia i, c az ul c are e x ist, transm ite p rog ram ului a s n n a arg um e nte le sp e c ic ate sub form a unui v e c tor d e iruri. A c e sta e ste p rim it s d e ap lic atie c a p aram e tru al m e tod e i main. R e am intim c form atul m e tod e i a main d in c lasa p rinc ip al e ste : a public static void main (String args[]) V e c torul ar g s p rim it c a p aram e tru d e m e tod a main v a c ontine toate arg u m e nte le transm ise p rog ram ului d e la linia d e c om and . a In c az ul ap e lului java Sortare persoane.txt v e c torul ar g s v a c ontine un sing ur e le m e nt p e p rim a s p oz itie : args[0]="persoane.txt". a

V e c toru ar g s e ste instantiat c u un num r d e e le m e nte e g al c u num rul ar a a g um e nte lor p rim ite d e la linia d e c om and . A ad ar, p e ntru a a a num rul d e a s a arg um e nte p rim ite d e p rog ram e ste suc ie nt s a m d im e nsiune a v e c torului a a args p rin inte rm e d iul atrib utului length:

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 c az ul c are ap lic atia p re sup une e x iste nta unor arg um e nte d e la linia n d e c om and , a ac e ste a nu au fost transm ise p rog ram ului la lansare a sa, v or a ns ap re a e x c e p ii (e rori) d e tip ul ArrayIndexOutOfBoundsException. T ratare a a t ac e stor e x c e p ii e ste p re z e ntat c ap itolul E x c e p ii . t a n t D in ac e st m otiv , e ste ne c e sar s te stm d ac p rog ram ul a p rim it arg um e nte le a a a d e la linia d e c om and ne c e sare p e ntru func ionare a sa i, c az c ontrar, s a t s n a a e z e un m e saj d e av e rtiz are sau s folose asc ni te v alori im p lic ite , c a s a a s n e 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 e ose b ire d e lim b ajul C, v e c torul p rim it d e m e tod a main nu c ontine p e p rim a p oz itie num e le ap lic atie i, ntruc t J av a num e le ap lic atie i e ste a n ch iar num e le c lase i p rinc ip ale , ad ic a c lase i c are se g ase te m e tod a main. a n s S c onsid e r c ontinuare un e x e m p lu sim p lu c are se d ore te a are a a a n n s s p e e c ran a arg um e nte lor p rim ite d e la linia d e c om and : a public class Afisare { public static void main (String[] args) { for (int i = 0; i < args.length; i++) System.out.println(args[i]);

34 } }

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

U n ap e l d e g e nul java Afisare Hello Java v a p rod uc e urm torul re z ula tat (ap lic atia a p rim it 2 arg um e nte ): Hello Java A p e lul java Afisare "Hello Java" v a p rod uc e a alt re z ultat (ap lic atia ns a p rim it un sing ur arg um e nt): Hello Java

1.8 .3

A rg um ente num erice

A rg um e nte le d e la linia d e c om and sunt p rim ite sub form a unui v e c tor d e a iruri (ob ie c te d e tip String). In c az ul c are une le d intre ac e ste a re p re z int s n a v alori num e ric e e le v or tre b ui c onv e rtite d in iruri num e re . A c e st luc ru s n se re aliz e az c u m e tod e d e tip ul parseT ip N u m eric a ate c lasa c ore sp una n z atoare tip ului c are v re m s fac e m c onv e rsia: Integer, Float, Double, n a e tc . S c onsid e rm , d e e x e m p lu, c ap lic atia Power rid ic un num ar re al la o a a a a p ute re ntre ag , arg um e nte le ind trim ise d e la linia d e c om and sub form a: a a java Power "1.5" "2" //ridica 1.5 la puterea 2 Conv e rsia c e lor d ou arg um e nte num e re se v a fac e astfe l: a n 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 ii (e rori) d e tip ul t NumberFormatException c az ul c are irul p rim it c a p aram e tru nu re p re z int n n s a un num ar d e tip ul re sp e c tiv . T ratare a ac e stor e x c e p ii e ste p re z e ntat t a n c ap itolul E x c e p ii . t

Capitolul 2 O b iecte i clase s


2 .1
2 .1.1

Ciclul de viat al unui ob iect a


Crearea ob iectelor

In J av a, c a oric e lim b aj d e p rog ram are orie ntat-ob ie c t, c re are a ob ie c te lor n se re aliz e az p rin in sta n ierea une i c lase i im p lic urm toare le luc ruri: a t s a a D eclararea P re sup une sp e c ic are a tip ului ac e lui ob ie c t, c u alte c uv inte sp e c ic are a c lase i ac e stuia (v om v e d e a c tip ul unui ob ie c t p oate i o inte rfat). a s a NumeClasa numeObiect; Instantierea S e re aliz e az p rin inte rm e d iul op e ratorului new i are c a e fe c t c re are a a s e fe c tiv a ob ie c tului c u aloc are a sp atiului d e m e m orie c ore sp unz tor. a a numeObiect = new NumeClasa(); Initializ area S e re aliz e az p rin inte rm e d iul c onstruc torilor c lase i re sp e c tiv e . Initializ are a a e ste d e fap t p arte inte g rant a p roc e sului d e instantie re , se nsul c a n a im e d iat d up aloc are a m e m orie i c a e fe c t al op e ratorului new e ste ap e lat a c onstruc torul sp e c ic at. P arante z e le rotund e d e d up num e le c lase i ina d ic fap tul c ac olo e ste d e fap t un ap e l la unul d in c onstruc torii c lase i a a i nu sim p la sp e c ic are a num e lui c lase i. s M ai g e ne ral, instantie re a i initializ are a ap ar sub form a: s 35

36

CAPIT O L UL 2 . O B IE CT E SI CL ASE numeObiect = new NumeClasa([argumente constructor]);

S c onsid e rm urm torul e x e m p lu, c are d e c larm i instantie m d ou a a a n a s a ob ie c te d in c lasa Rectangle, c las c e d e sc rie sup rafe e g rac e re c tang ulare , a t d e nite d e c oord onate le c oltului st ng a sus (orig ine a) i l im e a, re sp e c tiv a s at altim e a. n Rectangle r1, r2; r1 = new Rectangle(); r2 = new Rectangle(0, 0, 100, 200); In p rim ul c az Rectangle() e ste un ap e l c tre c onstruc torul c lase i Rectangle a c are e ste re sp onsab il c u initializ are a ob ie c tului c u v alorile im p lic ite . D up a c um ob se rv m al d oile a c az , initializ are a se p oate fac e i c u anum iti p araa n s m e tri, c u c ond itia s e x iste un c onstruc tor al c lase i re sp e c tiv e c are s ac c e p te a a p aram e trii re sp e c tiv i. Fie c are c las are un se t d e c onstruc tori c are se oc up c u initializ are a a ob ie c te lor nou c re ate . D e e x e m p lu, c lasa Rectangle are urm torii c onstruc a tori: public public public public public public Rectangle() Rectangle(int latime, int inaltime) Rectangle(int x, int y, int latime, int inaltime) Rectangle(Point origine) Rectangle(Point origine, int latime, int inaltime) Rectangle(Point origine, Dimension dimensiune)

D e c larare a, instantie re a i initializ are a ob ie c tului p ot ap re a p e ac e e a i s a s linie (c az ul c e l m ai uz ual): Rectangle patrat = new Rectangle(0, 0, 100, 100); O b iecte anonim e E ste p osib il i c re are a unor ob ie c te anonim e c are se rv e sc d oar p e ntru a s initializ are a altor ob ie c te , c az c are e tap a d e d e c larare a re fe rinte i ob ie c tului n nu m ai e ste p re z e nt: a Rectangle patrat = new Rectangle(new Point(0,0), new Dimension(100, 100));

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-alocat D e c larare a unui ob ie c t nu im p lic sub nic i o form aloc are a d e sp atiu a a d e m e m orie p e ntru ac e l ob ie c t. A loc are a m e m orie i se fac e d oar la ap e lul op e ratorului new. Rectangle patrat; patrat.x = 10; //Eroare - lipseste instantierea

2 .1.2

F olosirea ob iectelor

Od at un ob ie c t c re at, e l p oate folosit urm toare le se nsuri: a are a unor a n a inform atii d e sp re ob ie c t, sch im b are a strii sale sau e x e c utare a unor ac iuni. a t A c e ste luc ruri se re aliz e az a p rin a are a sau sch im b are a v alorilor v ariab ile lor sale , re sp e c tiv p rin ap e lare a m e tod e lor sale . R e fe rire a 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 are a v alorilor ac e stor v ariab ile sau sch im b are a lor se fac e p rin c onstruc ii t d e g e nul: 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 c onform itate c u d re p turile d e n ac c e s p e c are le ofe r v ariab ile le re sp e c tiv e c e lorlalte c lase . (v e z i M od ic aa tori d e ac c e s p e ntru 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 se rv c v alorile v ariab ile lor p ot m od ic ate ind ire c t p rin inte ra a m e d iul m e tod e lor sale . P rog ram are a orie ntat ob ie c t d e sc uraje az folosire a a a d ire c t a v ariab ile lor unui ob ie c t d e oare c e ac e sta p oate ad us stri ina n a c onsiste nte (ire ale ). In sch im b , p e ntru e c are v ariab il c are d e sc rie stare a a

38

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

ob ie c tului tre b uie s e x iste m e tod e c are s p e rm it sch im b are a/ a are a v ala a a orilor v ariab ile lor sale . A c e ste a se num e sc m etod e d e a ccesa re, sau m e tod e setter - getter i au num e le d e form a setV a ria bila , re sp e c tiv getV a ria bila . s 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 c a p rog ram atorul s in e v id e nta ob ie c te lor at a c re ate i s le d istrug m od e x p lic it atunc i c nd nu m ai e ste ne v oie d e e le , s a a n a c u alte c uv inte s ad m inistre z e sing ur m e m oria oc up at d e ob ie c te le sale . a a P rac tic a a d e m onstrat c ac e ast te h nic e ste una d in p rinc ip ale le furniz oare a a a d e e rori c e d uc la func ionare a d e fe c tuoas a p rog ram e lor. t a In J av a p rog ram atorul nu m ai are re sp onsab ilitate a d istrug e rii ob ie c te lor sale ntruc t, m om e ntul rulrii unui p rog ram , sim ultan c u inte rp re torul a n a J av a, rule az i un p roc e s c are se oc up c u d istrug e re a ob ie c te lor c are nu a s a m ai sunt folosite . A c e st p roc e s p us la d isp oz itie d e p latform a J av a d e luc ru se num e te g arb ag e collector (c ole c tor d e g unoi), p re sc urtat g c. s U n ob ie c t e ste e lim inat d in m e m orie d e p roc e sul d e c ole c tare atunc i c nd a nu m ai e x ist nic i o re fe rint la ac e sta. R e fe rinte le (c are sunt d e fap t v aria a ab ile ) sunt d istruse d ou m od uri: a n a tu ra l, atunc i c nd v ariab ila re sp e c tiv ie se d in d om e niul su d e v iz a a a ib ilitate , d e e x e m p lu la te rm inare a m e tod e i c are e a a fost d e c larat; n a exp licit, d ac atrib uim v ariab ile i re sp e c tiv e v aloare null. a

Cum functioneaz colectorul de g unoaie ? a Cole c torul d e g unoaie e ste un p roc e s d e p rioritate sc az ut c are se e x e a c ut p e riod ic , sc ane az d inam ic m e m oria oc up at d e p rog ram ul J av a a at a a a e x e c utie i m arch e az ac e le ob ie c te c are au re fe rinte d ire c te sau ind ire c te . n s a D up c e toate ob ie c te le au fost p arc urse , c e le c are au rm as ne m arc ate sunt a a e lim inate autom at d in m e m orie .

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 e re az m a inii v irtuale J av a s a s a d e p un e forturi re c up e rare a m e m orie i oc up ate d e ob ie c te c are nu m ai a n sunt folosite , fr a forta a p ornire a p roc e sului. aa ns

F inaliz are Inainte c a un ob ie c t s e e lim inat d in m e m orie , p roc e sul g c d ac e lui a a ob ie c t p osib ilitate a s c ure e d up e l , ap e l nd m e tod a d e naliz are a ob ie c a t a a tului re sp e c tiv . U z ual, tim p ul naliz rii un ob ie c t si inch id e sie re le i n a s sock e t-urile folosite , d istrug e re fe rinte le c tre alte ob ie c te (p e ntru a u sura a s sarc ina c ole c torului d e g unoaie ), e tc . Cod ul p e ntru naliz are a unui ob ie c t tre b uie sc ris ntr-o m e tod sp e c ial a a num ita finalize a c lase i c e d e sc rie ob ie c tul re sp e c tiv . (v e z i Clasa Ob je c t )

A tentie N u c onfund ati m e tod a naliz e d in J av a c u d e struc torii d in C+ + . M e tod a naliz e nu are rolul d e a d istrug e ob ie c tul c i e ste ap e lat autom at a nainte d e e lim inare a ob ie c tului re sp e c tiv d in m e m orie .

2 .2
2 .2 .1

Crearea claselor
D eclararea claselor

Clase le re p re z int o m od alitate d e a introd uc e noi tip uri d e d ate a ntr-o ap lic atie J av a, c e alalt m od alitate ind p rin inte rm e d iul inte rfe e lor. D e c larare a a t une i c lase re sp e c t urm torul form at g e ne ral: a a [public][abstract][final]class NumeClasa [extends NumeSuperclasa] [implements Interfata1 [, Interfata2 ... ]] { // Corpul clasei } A ad ar, p rim a p arte a d e c laratie i o oc up m od ic atorii c lase i. A c e tia s a s sunt:

40

CAPIT O L UL 2 . O B IE CT E SI CL ASE pub lic Im p lic it, o c las p oate folosit d oar d e c lase le a ate ac e la i p aa a n s ch e t(lib rrie ) c u c lasa re sp e c tiv (d ac nu se sp e c ic un anum e p aa a a a ch e t, toate c lase le d in d ire c torul c ure nt sunt c onsid e rate a ac e la i n s p ach e t). O c las d e c larat c u public p oate folosit d in oric e alt a a a a c las, ind ife re nt d e p ach e tul c are se g se te . a n a s ab stract D e c lar o c las ab strac t ( ab lon). O c las ab strac t nu p oate a a a s a a instantiat, ind folosit d oar p e ntru a c re a un m od e l c om un p e ntru o a a se rie d e sub c lase . (v e z i Clase i m e tod e ab strac te ) s nal D e c lar c re sp e c tiv a c las nu p oate av e a sub c lase . D e c larare c lase lor a a a nale are d ou sc op uri: a secu rita te: une le m e tod e p ot a te p ta c a p aram e tru un ob ie c t al s une i anum ite c lase i nu al une i sub c lase , d ar tip ul e x ac t al unui s ob ie c t nu p oate a at c u e x ac titate d e c at m om e ntul e x e c utie i; n fe lul ac e sta nu s-ar m ai p ute a re aliz a ob ie c tiv ul lim b ajului J av a n c a un p rog ram c are a tre c ut c om p ilare a s nu m ai e susc e p tib il a d e nic i o e roare . p ro gra m a re n sp ririt o rien ta t-o biect: O c lasa p e rfe c t nu tre a b uie s m ai aib sub c lase . a a

D up num e le c lase i p ute m sp e c ic a, d ac e ste c az ul, fap tul c re sp e c tiv a a a a c las e ste sub c las a une i alte c lase c u num e le N u m eS u perc la sa sau/ i c a a s a im p le m e nte az una sau m ai m ulte inte rfe e , ale c ror num e tre b uie se p arate a t a p rin v irg ul. a

2 .2 .2

E x tinderea claselor

S p re d e ose b ire d e alte lim b aje d e p rog ram are orie ntate -ob ie c t, J av a p e rm ite d oar m o tenirea sim pl , c e e a c e am n c o c las p oate av e a un sing ur s a ne a a a p rinte (sup e rc las). E v id e nt, o c las p oate av e a oric ti m o te nitori (sub a a a a s c lase ), d e und e re z ult c m ultim e a tuturor c lase lor d e nite J av a p oate a a n v az ut c a un arb ore , rd c ina ac e stuia ind c lasa Object. A ad ar, Object a a a s e ste sing ura c las c are nu are p rinte , ind foarte im p ortant m od ul d e a a a n luc ru c u ob ie c te si struc turi d e d ate J av a. n

2 .2 . CRE ARE A CL ASE L O R E x tind e re a une i c lase se re aliz e az folosind c uv ntul ch e ie ex tends: a a class B extends A {...} // A este superclasa clasei B // B este o subclasa a clasei A

41

O sub c las m o te ne te d e la p rinte le su toate v ariab ile le i m e tod e le a s s a a s c are nu sunt p riv ate .

2 .2 .3

Corpul unei clase

Corp ul une i c lase urm e az im e d iat d up d e c larare a c lase i i e ste c up rins a a s ntre ac olad e . Continutul ac e stuia e ste form at d in: D e c larare a i, e v e ntual, initializ are a v ariab ile lor d e instant i d e c las s a s a (c unosc ute p re un c a va ria bile m em bre ). m a D e c larare a i im p le m e ntare a c onstruc torilor. s D e c larare a i im p le m e ntare a m e tod e lor d e instanta i d e c las (c unoss s a c ute p re un c a m eto d e m em bre). m a D e c larare a unor c lase im b ric ate (inte rne ). S p re d e ose b ire d e C+ + , nu e ste p e rm is d oar d e c larare a m e tod e i c orp ul a n c lase i, urm nd c a im p le m e ntare s e fac ut afara e i. Im p le m e ntare a a a a n m e tod e lor une i c lase tre b uie s se fac ob lig atoriu c orp ul c lase i. a a n // C++ class A { void metoda1(); int metoda2() { // Implementare } } A::metoda1() { // Implementare }

42 // Java class A { void metoda1(){ // Implementare } void metoda2(){ // Implementare } }

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

V ariab ile le une i c lase p ot av e a ac e la i num e c u m e tod e le c lase i, c are p oate s ch iar num e le c lase i, fr a e x ista p osib ilitate a ap aritie i v re une i am b ig uit i aa at d in p unc tul d e v e d e re al c om p ilatorului. A c e st luc ru e ste a total ne re ns c om and at d ac ne g nd im d in p e rsp e c tiv a liz ib ilit ii (c larit ii) c od ului, a a at at d ov e d ind un stil ine c ie nt d e p rog am are . class A { int A; void A() {}; // Corect pentru compilator // Nerecomandat ca stil de programare }

A tentie V ariab ile le i m e tod e le nu p ot av e a c a num e un c uv nt ch e ie J av a. s a

2 .2 .4

Constructorii unei clase

Construc torii une i c lase sunt m e tod e sp e c iale c are au ac e la i num e c u c e l s al c lase i, nu re turne az nic i o v aloare i sunt folositi p e ntru initializ are a a s ob ie c te lor ac e le i c lase m om e ntul instantie rii lor. n class NumeClasa { [modificatori] NumeClasa([argumente]) { // Constructor

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

43

O c las p oate av e a unul sau m ai m ulti c onstruc tori c are tre b uie a s a ns a d ife re p rin lista d e arg um e nte p rim ite . In fe lul ac e sta sunt p e rm ise d iv e rse tip uri d e initializ ri ale ob ie c te lor la c re are a lor, func ie d e num rul p ara a n t a m e trilor c u c are e ste ap e lat c onstruc torul. S c onsid e rm c a e x e m p lu d e c larare a une i c lase c are d e sc rie notiune a d e a a d re p tung h i i tre i p osib ili c onstruc tori p e ntru ac e asta c las. s a 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"); } } Construc torii sunt ap e lati autom at la instantie re a unui ob ie c t. In c az ul c are d orim s ap e lm e x p lic it c onstruc torul une i c lase folosim e x p re sia n a a this( argumente ), c are ap e le az c onstruc torul c ore sp unz tor (c a arg um e nte ) al c lase i re sp e c a a tiv e . A c e ast m e tod e ste folosit atunc i c nd sunt im p le m e ntati m ai m ulti a a a a c onstruc tori p e ntru o c las, p e ntru a nu re p e ta se c v e nte le d e c od sc rise d e ja a la c onstruc torii c u m ai m ulte arg um e nte (m ai g e ne rali). M ai e c ie nt, fr aa

44

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

a re p e ta ac e le a i se c v e nte d e c od toti c onstruc torii (c um ar a are a s n s m e sajului Instantie re d re p tung h i ), c lasa d e m ai sus p oate re sc ris astfe l: a 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 las p ute m ap e la e x p lic it c onstruc torii sup e rc lase i c u e x p re sia a super( argumente ). S p re sup une m c d orim s c re m c lasa Patrat, d e riv at d in c lasa Dreptunghi: a a a a a class Patrat extends Dreptunghi { Patrat(double x, double y, double d) { super(x, y, d, d); // Apelam constructorul superclasei } }

A tentie A p e lul e x p lc it al unui c onstruc tor nu p oate ap re a d e c t a a ntr-un alt c onstruc tor si tre b uie s e p rim a instruc iune d in c onstruc torul re sp e c tiv . a t

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

45

Constructorul im plicit Construc torii sunt ap e lati autom at la instantie re a unui ob ie c t. In c az ul c are sc rie m o c las c are nu are d e c larat nic i un c onstruc tor, siste m ul n a i c re e az autom at un c onstruc tor im p lic it, c are nu p rim e te nic i un arg um e nt a s i c are nu fac e nim ic . D e c i p re z e nta c onstruc torilor c orp ul une i c lase nu s n e ste ob lig atorie . D ac a sc rie m un c onstruc tor p e ntru o c las, c are are m ai a ns a m ult d e un arg um e nt, atunc i c onstruc torul im p lic it (fr nic i un arg um e nt) aa nu v a m ai furniz at im p lic it d e c tre siste m . S c onsid e rm , c a e x e m p lu, a a a urm toare le d e c laratii d e c lase : a 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 c onsid e rm ac um d ou instantie ri ale c lase lor d e m ai sus: a a a 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 c az ul m o te nirii une i c lase , instantie re a unui ob ie c t d in c lasa e x tins s a im p lic instantie re a unui ob ie c t d in c lasa p rinte . D in ac e st m otiv , e c are a a c onstruc tor al c lase i u v a tre b ui s aib un c onstruc tor c u ac e e a i sig natur a a s a p rinte sau s ap e le z e e x p lic it un c onstruc tor al c lase i e x tinse folosind n a a e x p re sia super([argumente]), c az c ontrar ind se m nalat o e roare la n a c om p ilare .

46 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;} }

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

Construc torii une i c lase p ot av e a urm torii m od ic atori d e ac c e s: a public, protected, private i c e l im p lic it. s pub lic In oric e alt c las se p ot c re a instante ale c lase i re sp e c tiv e . a a protected D oar sub c lase p ot c re ate ob ie c te d e tip ul c lase i re sp e c tiv e . n private In nic i o alt c las nu se p ot instantia ob ie c te ale ac e ste i c lase . O asta a fe l d e c las p oate c ontine m e tod e p ub lic e (num ite fac tory m e th od s ) a c are s e re sp onsab ile c u c re are a ob ie c te lor, c ontrol nd fe lul ac e sta a a n d iv e rse asp e c te le g ate d e instantie re a c lase i re sp e c tiv e . im plicit D oar c lase le d in ac e la i p ach e t se p ot c re a instante ale c lase i re sp e c n s 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 lar d e ob ic e i a nainte a m e tod e lor, d e i ac e st luc ru nu e ste im p us d e c tre c om p ilator. s a

2 .2 . CRE ARE A CL ASE L O R class NumeClasa { // Declararea variabilelor // Declararea metodelor }

47

V ariab ile le m e m b re ale une i c lase se d e c lar c orp ul c lase i i nu c orp ul a n s n une i m e tod e , ind v iz ib ile toate m e tod e le re sp e c tiv e i c lase . V ariab ile le n d e c larate c ad rul une i m e tod e sunt loc ale m e tod e i re sp e c tiv e . n D e c larare a une i v ariab ile p re sup une sp e c ic are a urm toare lor luc ruri: a num e le v ariab ile i tip ul d e d ate al ac e ste ia niv e lul d e ac c e s la ac e a v ariab ila d in alte c lase d ac e ste c onstant sau nu a a d ac e ste v ariab il d e instant sau d e c las a a a a alti m od ic atori G e ne ric , o v ariab il se d e c lar astfe l: a a [modificatori] Tip numeVariabila [ = valoareInitiala ]; und e un m od ic ator p oate : un m od ic ator d e ac c e s : public, protected, private (v e z i M od ic atori d e ac c e s p e ntru m e m b rii une i c lase ) unul d in c uv 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; }

48

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

S analiz m m od ic atorii c are p ot sp e c ic ati p e ntru o v ariab il, altii a a a d e c t c e i d e ac c e s c are sunt tratati a ntr-o se c iune se p arata: S p e c ic atori t d e ac c e s p e ntru m e m b rii une i c lase . static P re z e nta lui d e c lar c o v ariab il e ste v ariab il d e c las i nu d e a a a a a s instant. (v e z i M e m b ri d e instanta i m e m b ri d e c las ) a s a int variabilaInstanta ; static int variabilaClasa; nal Ind ic fap tul c v aloare a v ariab ile i nu m ai p oate sch im b at, c u alte a a a c uv inte e ste folosit p e ntru d e c larare a c onstante lor. final double PI = 3.14 ; ... PI = 3.141; // Eroare la compilare ! P rin c onv e ntie , num e le v ariab ile lor nale se sc riu c u lite re m ari. Folosire a lui final ad uc e o e x ib ilitate sp orit luc rul c u c onstante , se nsul a n n c v aloare a une i v ariab ile nu tre b uie sp e c ic at ne ap rat la d e c larare a a a a e i (c a e x e m p lul d e m ai sus), c i p oate sp e c ic at i ulte rior n as ntr-un c onstruc tor, d up c are e a nu v a m ai p ute a m od ic at. a a class Test { final int MAX; Test() { MAX = 100; // Corect MAX = 200; // Eroare la compilare ! } } transient E ste folosit la se rializ are a ob ie c te lor, p e ntru a sp e c ic a c e v ariab ile m e m b re ale unui ob ie c t nu p artic ip la se rializ are . (v e z i S e rializ are a a ob ie c te lor )

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

49

volatile E ste folosit p e ntru a se m nala c om p ilatorului s nu e x e c ute anum ite a op tim iz ri asup ra m e m b rilor une i c lase . E ste o fac ilitate av ansat a a a lim b ajului J av a.

2 .2 .6

th is i super s

S unt v ariab ile p re d e nite c are fac re fe rinta, c ad rul unui ob ie c t, la ob ie c tul n p rop riu-z is (this), re sp e c tiv la instanta p rinte lui (super). S unt folosite a g e ne ral p e ntru a re z olv a c on ic te d e num e p rin re fe rire a e x p lic it a une i n a v ariab ile sau m e tod e m e m b re . D up c um am v z ut, utiliz ate sub form d e a a a m e tod e au rolul d e a ap e la c onstruc torii c ore sp unz tori c a arg um e nte ai c lase i a c ure nte , re sp e c tiv ai sup e rc 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();

50 System.out.println(x); } }

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

2 .3
2 .3 .1

Im plem entarea m etodelor


D eclararea m etodelor

M e tod e le sunt re sp onsab ile c u d e sc rie re a c om p ortam e ntului unui ob ie c t. Intruc t J av a e ste un lim b aj d e p rog ram are c om p le t orie ntat-ob ie c t, m e tod e le a se p ot g si d oar c ad rul c lase lor. G e ne ric , o m e tod se d e c lar astfe l: a n a a [modificatori] TipReturnat numeMetoda ( [argumente] ) [throws TipExceptie1, TipExceptie2, ...] { // Corpul metodei } und e un m od ic ator p oate : un sp e c ic ator d e ac c e s : public, protected, private (v e z i S p e c ic atori d e ac c e s p e ntru m e m b rii une i c lase ) unul d in c uv inte le re z e rv ate : static, abstract, final, native, synchronized S analiz m m od ic atorii c are p ot sp e c ic ati p e ntru o m e tod , altii a a a d e c t c e i d e ac c e s c are sunt tratati a ntr-o se c iune se p arat. t a static P re z e nta lui d e c lar c o m e tod e ste d e c las i nu d e instant. (v e z i a a a as a M e m b ri d e instanta i m e m b ri d e c las ) s a void metodaInstanta(); static void metodaClasa(); ab stract P e rm ite d e c larare a m e tod e lor ab strac te . O m e tod ab strac t e ste o a a m e tod c are nu are im p le m e ntare i tre b uie ob lig atoriu s fac p arte a s a a d intr-o c las ab strac t. (v e z i Clase i m e tod e ab strac te ) a a s

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

51

nal S p e c ic fap tul c ac e a m e tod a nu m ai p oate sup rad e nit sub a a a n c lase le c lase i c are e a e ste d e nit c a ind nal. A c e st luc ru e ste n a a util d ac re sp e c tiv a m e tod are o im p le m e ntare c are nu tre b uie sch im a a b at sub nic i o form sub c lase le e i, ind c ritic p e ntru c onsiste nta a a n a strii unui ob ie c t. D e e x e m p lu, stud e ntilor une i univ e rsit i tre b uie s a at a li se c alc ule z e m e d ia nala, func ie d e note le ob inute la e x am e ne , n t t ac e e a i m anie r, ind ife re nt d e fac ultate a la c are sunt. n s a

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 !

native In c az ul c are av e m o lib rrie im p ortant d e func ii sc rise alt lim b aj n a a t n d e p rog ram are , c um ar C, C+ + i lim b ajul d e asam b lare , ac e ste a s p ot re folosite d in p rog ram e le J av a. T e h nolog ia c are p e rm ite ac e st luc ru se num e te J N I (J a va N a tive In terfa ce) i p e rm ite asoc ie re a d intre s s m e tod e J av a d e c larate c u native i m e tod e nativ e sc rise lim b aje le s n d e p rog ram are m e ntionate . sy nch roniz ed E ste folosit c az ul c are se luc re az c u m ai m ulte re d e e x e c utie iar n n a m e tod a re sp e c tiv g e stione az re surse c om une . A re c a e fe c t c onstruire a a a unui m onitor c are nu p e rm ite e x e c utare a m e tod e i, la un m om e nt d at, d e c t unui sing ur r d e e x e c utie . (v e z i Fire d e e x e c utie ) a

52

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

2 .3 .2

T ipul returnat de o m etod a

M e tod e le p ot sau nu s re turne z e o v aloare la te rm inare a lor. T ip ul re turnat a p oate at t un tip p rim itiv d e d ate sau o re fe rint la un ob ie c t al une i c lase . a a In c az ul c are o m e tod nu re turne az nim ic atunc i tre b uie ob lig atoriu n a a sp e c ic at c uv ntul ch e ie void c a tip re turnat: a public void afisareRezultat() { System.out.println("rezultat"); } private void deseneaza(Shape s) { ... return; } D ac o m e tod tre b uie s re turne z e o v aloare ac e st luc ru se re aliz e az p rin a a a a inte rm e d iul instruc iunii return, c are tre b uie s ap ar toate situatiile d e t a a n te rm inare a func ie i. t 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 c az ul c are d e c laratia func ie i tip ul re turnat e ste un tip p rim itiv d e n n t d ate , v aloare a re turnat la te rm inare a func ie i tre b uie s aib ob lig atoriu ac e l a t a a tip sau un sub tip al su, altfe l v a furniz at o e roare la c om p ilare . In g e ne ral, a a oric e atrib uire c are im p lic p ie rd e ri d e d ate e ste tratat d e c om p ilator c a a a e roare . int metoda() { return 1.2; // Eroare } int metoda() {

2 .3 . IM PL E M E NT ARE A M E T O D E L O R return (int)1.2; // Corect } double metoda() { return (float)1; // Corect }

53

D ac v aloare a re turnat e ste o re fe rint la un ob ie c t al une i c lase , atunc i a a a c lasa ob ie c tului re turnat tre b uie s c oinc id sau s e o sub c las a c lase i a a a a sp e c ic ate la d e c larare a m e tod e i. D e e x e m p lu, e c lasa Poligon i sub c lasa s ac e ste 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 c tre o m etod a a

S ig natura une i m e tod e e ste d at d e num arul i tip ul arg um e nte lor p rim ite a s d e ac e a m e tod . T ip ul d e d ate al unui arg um e nt p oate oric e tip v alid al a lim b ajului J av a, at t tip p rim itiv c t i tip re fe rint. a a s a TipReturnat metoda([Tip1 arg1, Tip2 arg2, ...]) E x e m p lu:

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 e ose b ire d e alte lim b aje , J av a nu p ot trim ise c a p aram e tri ai n une i m e tod e re fe rinte la alte m e tod e (func ii), a p ot trim ise re fe rinte la t ns ob ie c te c are s c ontin im p le m e ntare a ac e lor m e tod e , p e ntru a ap e late . a a P na la ap aritia v e rsiunii 1.5, J av a o m e tod nu p ute a p rim i un num r a n a a v ariab il d e arg um e nte , c e e a c e am na c ap e lul une i m e tod e tre b uia s se nse a a fac c u sp e c ic are a e x ac t a num arului i tip urilor arg um e nte lor. V om anala a s iz a ntr-o se c iune se p arat m od alitate d e sp e c ic are a unui num r v ariab il t a a d e arg um e nte p e ntru o m e tod . a N um e le arg um e nte lor p rim ite tre b uie s d ife re a ntre e le i nu tre b uie s c os a inc id c u num e le nic i une ia d in v ariab ile le loc ale ale m e tod e i. P ot a s a ns a c oinc id c u num e le v ariab ile lor m e m b re ale c lase i, c az c are d ife re ntie re a a n d intre e le se v a fac e p rin inte rm 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 e nte le sunt trim ise doar prin valoare (p ass-b y -v alue ). A c e st luc ru am n c m e tod a re c e p ione az d oar v alorile v ariab ile lor p rim nse a a t a ite c a p aram e tri. C nd arg um e ntul are tip p rim itiv d e d ate , m e tod a nu-i p oate sch im b a v ala oare a d e c t loc al ( c ad rul m e tod e i); la re v e nire a d in m e tod v ariab ila are a n a ac e e a i v aloare c a s nainte a ap e lului, m od ic rile fc ute c ad rul m e tod e i a a n ind p ie rd ute . C nd arg um e ntul e ste d e tip re fe rint, m e tod a nu p oate sch im b a v aloare a a a re fe rinte i ob ie c tului, a p oate ap e la m e tod e le ac e lui ob ie c t i p oate m od ic a ns s oric e v ariab il m e m b r ac c e sib il. a a a A ad ar, d ac d orim c a o m e tod s sch im b e stare a (v aloare a) unui arg us a a a m e nt p rim it, atunc i e l tre b uie s e ne ap arat d e tip re fe rint. a a

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, s c onsid e rm c lasa Cerc d e sc ris ante rior c are d orim s a a a n a im p le m e ntm o m e tod c are s re turne z e p aram e trii c e rc ului. a a a // 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 e ast m e tod nu v a re aliz a luc rul p rop us a a ntruc t e a p rim e te d oar a s v alorile v ariab ile lor valx, valy i valr i nu re fe rinte la e le (ad re se le lor s s d e m e m orie ), astfe l t s le p oat m od ic a v alorile . In c onc luz ie , m e tod a nc a a a nu re aliz e az nim ic p e ntru c nu p oate sch im b a v alorile v ariab ile lor p rim ite a a c a arg um e nte . P e ntru a re z olv a luc rul p rop us tre b uie s d e nim o c las sup lim e ntar a a a c are s d e sc rie p aram e trii p e c are d orim s-i a m : a a a // 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 e ntul param are tip re fe rint i, d e i nu sch im b m v aloare a (v ala s s i a oare a sa e ste ad re sa d e m e m orie la c are se g ase te i nu p oate sch im b at), s s a

56

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

p ute m sch im b a stare a ob ie c tului, ad ic inform atia p rop riu-z is c ontinut d e a a a ac e sta.

V arianta d e m ai sus a fost d at p e ntru a c laric a m od ul d e trim ite re a a arg um e nte lor une i m e tod e . P e ntru a a a a v alorile v ariab ile lor c are d e sc riu ns stare a unui ob ie c t se folose sc m e tod e d e tip getter ite d e m e tod e setter nsot c are s p e rm it sch im b are a strii ob ie c tului: a a a 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 r variab il de arg um ente a

Inc e p nd c u v e rsiune a 1.5 a lim b ajului J av a, e x ist p osib ilitate d e a d e c lara a a m e tod e c are s p rim e asc un num r v ariab il d e arg um e nte . N outate a c onst a a a a folosire a sim b olului ..., sintax a une i astfe l d e m e tod e ind : n [modificatori] TipReturnat metoda(TipArgumente ... args)

ar g s re p re z int un v e c tor av nd tip ul sp e c ic at i instantiat c u un num r a a s a v ariab il d e arg um e nte , func ie d e ap e lul m e tod e i. T ip ul arg um e nte lor n t p oate re fe rint sau p rim itiv . M e tod a d e m ai jos a e az arg um e nte le p rim a s a ite , c are p ot 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);

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 arcarea i suprade nirea m etodelor nc s

S up ra rc are a i sup rad e nire a m e tod e lor sunt d ou c onc e p te e x tre m d e nc a s a utile ale p rog ram rii orie ntate ob ie c t, c unosc ute i sub d e num ire a d e p o lim o ra s sm , i se re fe r la: s a su p ra n ca rca rea (o verlo a d in g) : c ad rul une i c lase p ot e x ista m e tod e n c u ac e la i num e c u c ond itia c a sig naturile lor s e d ife rite (lista d e s a arg um e nte p rim ite s d ife re e p rin num rul arg um e nte lor, e p rin a a tip ul lor) astfe l t la ap e lul func ie i c u ac e l num e s se p oat stab ili nc a t a a m od unic c are d intre e le se e x e c ut. n a su p ra d e n irea (o verrid in g): o sub c las p oate re sc rie o m e tod a c laa a se i p rinte p rin im p le m e ntare a une i m e tod e c u ac e la i num e i ac e e a i a s s s sig natur c a ale sup e rc lase i. a 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 e tod sup rad e nit p oate s: a a a ig nore c om p le t c od ul m e tod e i c ore sp unz toare d in sup e rc las (c az ul a a d e m ai sus): B b = new B(); b.metoda(); // Afiseaza "B: metoda fara parametru"

58

CAPIT O L UL 2 . O B IE CT E SI CL ASE ex tind c od ul m e tod e i p rinte , e x e c ut nd a a a nainte d e c od ul p rop riu i s func ia p rinte lui: t a 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 e tod nu p oate sup rad e ni o m e tod d e c larat nal c lasa p rinte . a a a a n a Oric e c las c are nu e ste ab strac t tre b uie ob lig atoriu s sup rad e ne asc a a a a m e tod e le ab strac te ale sup e rc lase i (d ac e ste c az ul). In c az ul c are o c las a n a nu sup rad e ne te toate m e tod e le ab strac te ale p rinte lui, e a a i e ste ab s a nss strac t i v a tre b ui d e c larat c a atare . as a In J av a nu e ste p osib il sup ra rc are a op e ratorilor. a nc a

2 .4

M odi catori de acces

M od ic atorii d e ac c e s sunt c uv inte re z e rv ate c e c ontrole az ac c e sul c e lora late c lase la m e m b rii une i c lase . S p e c ic atorii d e ac c e s p e ntru v ariab ile le i m e tod e le une i c lase sunt: pub lic, protected, private i c e l im p lic it (la s s niv e l d e p ach e t), iar niv e lul lor d e ac c e s e ste d at tab e lul d e m ai jos: n S p e c ic ator private protected public im p lic it Clasa X X X X S ub lasa X* X P ach e t X X X Oriund e

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

59

A ad ar, d ac nu e ste sp e c ic at nic i un m od ic ator d e ac c e s, im p lic it s a niv e lul d e ac c e s e ste la niv e lul p ach e tului. In c az ul c are d e c larm un n a m e m b ru p rote c te d atunc i ac c e sul la ac e l m e m b ru e ste p e rm is d in sub c lase le c lase i c are a fost d e c larat d ar d e p ind e i d e p ach e tul c are se g ase te n s n s sub c lasa: d ac sunt ac e la i p ach e t ac c e sul e ste p e rm is, d ac nu sunt a n s a n ac e la i p ach e t ac c e sul nu e ste p e rm is d e c t p e ntru ob ie c te d e tip ul sub c lase i. s a 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 instant i m em b ri de clas a s a

O c las J av a p oate c ontine d ou tip uri d e v ariab ile i m e tod e : a a s d e in sta n : d e c larate f r m od ic atorul static, sp e c ic e e c re i ta a a a instante c re ate d intr-o c las i as d e cla s : d e c larate cu m od ic atorul static, sp e c ic e c lase i. a

2 .5 .1

V ariab ile de instant i de clas a s a

C nd d e c larm o v ariab il m e m b r fr m od ic atorul static, c um ar x a a a a aa n e x e m p lul d e m ai jos: class Exemplu { int x ; //variabila de instanta } se d e c lar d e fap t o v ariab il d e instant, c e e a c e am n c la e c are c re are a a a nse a a a unui ob ie c t al c lase i Exemplu siste m ul aloc o z on d e m e m orie se p arat a a a p e ntru m e m orare a v alorii lui x . Exemplu o1 = new Exemplu(); o1.x = 100;

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 ad ar, e c are ob ie c t nou c re at v a p ute a m e m ora v alori d ife rite p e ntru s v ariab ile le sale d e instant. a P e ntru v ariab ile le d e c las (static e ) siste m ul aloc o sing ur z on d e m e m a a a a orie la c are au ac c e s toate instante le c lase i re sp e c tiv e , c e e a c e am n c nse a a d ac un ob ie c t m od ic v aloare a une i v ariab ile static e e a se v a m od ic a i a a s p e ntru toate c e le lalte ob ie c te . D e oare c e nu d e p ind d e o anum it instant a a a une i c lase , v ariab ile le static e p ot re fe rite i sub form a: s NumeClasa.numeVariabilaStatica class Exemplu { int x ; // Variabila de static long n; // Variabila de } . . . Exemplu o1 = new Exemplu(); Exemplu o2 = new Exemplu(); o1.n = 100; System.out.println(o2.n); o2.n = 200; System.out.println(o1.n); System.out.println(Exemplu.n); // o1.n, o2.n si Exemplu.n sunt

instanta clasa

// Afiseaza 100 // Afiseaza 200 // Afiseaza 200 referinte la aceeasi valoare

Initializ are a v ariab ile lor d e c las se fac e o sing ur d at, la rc are a a a a nc a n m e m orie a c lase i re sp e c tiv e , i e ste re aliz at p rin atrib uiri ob i nuite : s a s class Exemplu { static final double PI = 3.14; static long nrInstante = 0; static Point p = new Point(0,0); }

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 instant i de clas a s a

S im ilar c a la v ariab ile , m e tod e le d e c larate fr m od ic atorul static sunt aa m e tod e d e instant iar c e le d e c larate c u static sunt m e tod e d e c las (stata a ic e ). D ife re nta ntre c e le d ou tip uri d e m e tod e e ste urm toare a: a a m e tod e le d e instant op e re az at t p e v ariab ile le d e instant c t i p e a a a a a s c e le static e ale c lase i; m e tod e le d e c las op e re az d oar p e v ariab ile le static e ale c lase i. a a 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 c a i la v ariab ile le static e , s ntruc t m e tod e le d e c las nu d e p ind a a d e stare a ob ie c te lor c lase i re sp e c tiv e , ap e lul lor se p oate fac e i sub form a: s NumeClasa.numeMetodaStatica Exemplu.metodaStatica(); // Corect, echivalent cu Exemplu obj = new Exemplu(); obj.metodaStatica(); // Corect, de asemenea M e tod e le d e instant nu p ot ap e late d e c t p e ntru un ob ie c t al c lase i a a re sp e c tiv e : Exemplu.metodaDeInstanta(); // Eroare la compilare ! Exemplu obj = new Exemplu(); obj.metodaDeInstanta(); // Corect

62

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

2 .5 .3

U tilitatea m em b rilor de clas a

M e m b rii d e c las sunt folositi p e ntru a p une la d isp oz itie v alori i m e tod e a s ind e p e nd e nte d e stare a ob ie c te lor d intr-o anum ita c las. a

D eclararea e cient a constantelor a S c onsid e rm situatia c nd d orim s d e c larm o c onstant. a a a a a a class Exemplu { final double PI = 3.14; // Variabila finala de instanta } L a e c are instantie re a c lase i Exemplu v a re z e rv at o z on d e m e m orie a a p e ntru v ariab ile le nale ale ob ie c tului re sp e c tiv , c e e a c e e ste o risip a ntruc t a ac e ste c onstante au ac e le a i v alori p e ntru toate instante le c lase i. D e c larare a s c ore c t a c onstante lor tre b uie a ad ar fac ut c u m od ic atorii static i final, a s a s p e ntru a le re z e rv a o sing ur z on d e m e m orie , c om un tuturor ob ie c te lor: a a a class Exemplu { static final double PI = 3.14; // Variabila finala de clasa }

N um rarea ob iectelor unei clase a N um rare a ob ie c te lor une i c lase p oate fc ut e x tre m d e sim p lu folosind a a a o v ariab il static i e ste util situatiile c nd tre b uie s c ontrolm d iv e r i a as a n a a a s p aram e tri le g ati d e c re are a ob ie c te lor une i c lase . class Exemplu { static long nrInstante = 0; Exemplu() { // Constructorul este apelat la fiecare instantiere nrInstante ++; } }

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 ale S p re d e ose b ire d e lim b aje le d e p rog ram are p roc e d urale , J av a nu p ute m n av e a func ii g lob ale d e nite c a atare , t ntruc t oric e e ste un ob ie c t . D in a ac e st m otiv ch iar i m e tod e le c are au o func ionalitate g lob al tre b uie im s t a p le m e ntate c ad rul unor c lase . A c e st luc ru se v a fac e p rin inte rm e d iul n m e tod e lor d e c las (g lob ale ), d e oare c e ac e ste a nu d e p ind d e stare a p artic a ular a ob ie c te lor d in c lasa re sp e c tiv . D e e x e m p lu, s c onsid e rm func ia a a a a t sqrt c are e x trag e rad ic alul unui num r i c are se g se te c lasa Math. D ac a s a s n a nu ar fost func ie d e c las, ap e lul e i ar tre b uit fc ut astfe l (inc ore c t, d e t a a altfe l): // Incorect ! Math obj = new Math(); double rad = obj.sqrt(121); c e e a c e ar fost e x tre m d e ne p lc ut... Fiind a m e tod static e a p oate a ns a a ap e lat p rin: Math.sqrt(121) . a A ad ar, func iile g lob ale ne c e sare une i ap lic atii v or g rup ate c ore sp unz tor s t a d iv e rse c lase i im p le m e ntate c a m e tod e static e . n s

2 .5 .4

B locuri statice de initializ are

V ariab ile le static e ale une i c lase sunt initializ ate la un m om e nt c are p re c e d e p rim a utiliz are ac tiv a c lase i re sp e c tiv e . M om e ntul e fe c tiv d e p ind e d e im a p le m e ntare a m a inii v irtuale J av a i p oart num e le d e in itia liza rea cla sei. P e s s a l ng se tare a v alorilor v ariab ile lor static e , ac e ast e tap sunt e x e c utate i a a n a a s b loc urile static e d e initializ are ale c lase i. A c e ste a sunt se c v e nte d e c od d e form a: static { // Bloc static de initializare; ... } c are se c om p ort c a o m e tod static ap e lat autom at d e c tre m a ina v ira a a a a s tual. V ariab ile le re fe rite a ntr-un b loc static d e initializ are tre b uie s e a ob lig atoriu d e c las sau loc ale b loc ului: a public class Test { // Declaratii de variabile statice

64 static int x = 0, y, z;

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

// 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
2 .6 .1

Clase im b ricate
D e nirea claselor im b ricate

O cla s im brica t e ste , p rin d e nitie , o c las m e m b r a une i alte c lase , num it a a a a a i cla s d e a co perire . In func ie d e situatie , d e nire a une i c lase inte rne se s a t p oate fac e e c a m e m b ru al c lase i d e ac op e rire - c az c are e ste ac c e sib il n a tuturor m e tod e lor, e loc al c ad rul une i m e tod e . n class ClasaDeAcoperire{ class ClasaImbricata1 { // Clasa membru } void metoda() { class ClasaImbricata2 { // Clasa locala metodei } }

2 .6 . CL ASE IM B RICAT E }

65

Folosire a c lase lor im b ric ate se fac e atunc i c nd o c las are ne v oie im a a n p le m e ntare a e i d e o alt c las i nu e x ist nic i un m otiv p e ntru c are ac e asta a as a d in urm s e d e c larat d e sine stttoare (nu m ai e ste folosit nic ie ri). a a a aa a a O c las im b ric at are un p riv ile g iu sp e c ial fat d e c e le lalte c lase i anum e a a a s ac c e s ne re stric ionat la toate v ariab ile le c lase i d e ac op e rire , ch iar d ac ac e st a te a sunt p riv ate . O c las d e c larat loc al une i m e tod e v a av e a ac c e s i la a a a s v ariab ile le nale d e c larate m e tod a re sp e c tiv . n 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 c las im b ric at m e m b r (c are nu e ste loc al une i m e tod e ) p oate a a a a re fe rit d in e x te riorul c lase i d e ac op e rire folosind e x p re sia a ClasaDeAcoperire.ClasaImbricata A ad ar, c lase le m e m b ru p ot d e c larate c u m od ic atorii public, protected, s private p e ntru a c ontrola niv e lul lor d e ac c e s d in e x te rior, ntoc m ai c a oric e v ariab il sau m e tod m e b r a c lase i. P e ntru c lase le im b ric ate loc ale une i a a a m e tod e nu sunt p e rm i i ac e sti m od ic atori. s T oate c lase le im b ric ate p ot d e c larate folosind m od ic atorii abstract i s final, se m nic atia lor ind ac e e a i c a i c az ul c lase lor ob i nuite . s s n s

66

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

2 .6 .2

Clase interne

S p re d e ose b ire d e c lase le ob i nuite , o c las im b ric at p oate d e c larat static s a a a a sau nu. O c las im b ric at ne static se num e te cla sa in tern . a a a s a class ClasaDeAcoperire{ ... class ClasaInterna { ... } static class ClasaImbricataStatica { ... } } D ife re ntie re a ac e stor d e num iri se fac e d e oare c e : o c las im b ric at re e c t re latia sintac tic a d ou c lase : c od ul une i a a a a a c lase ap are inte riorul c od ului alte i c lase ; n o c las inte rn re e c t re latia d intre instante le a d ou c lase , se nsul a a a a n c o instanta a une i c lase inte rne nu p oate e x ista d e c at c ad rul une i a n instante a c lase i d e ac op e rire . In g e ne ral, c e le m ai folosite c lase im b ric ate sunt c e le inte rne . A ad ar, o c las inte rn e ste o c las im b ric at ale c are i instante nu p ot s a a a a e x ista d e c t c ad rul instante lor c lase i d e ac op e rire i c are are ac c e s d ire c t a n s la toti m e m b rii c lase i sale d e ac op e rire .

2 .6 .3

Identi care claselor im b ricate

D up c um tim oric e c las p rod uc e la c om p ilare a a num ite le unit i d e c om a s a s at p ilare , c are sunt ie re av nd num e le c lase i re sp e c tiv e i e x te nsia .class s a s i c are c ontin toate inform atiile d e sp re c lasa re sp e c tiv . P e ntru c lase le im s a b ric ate ac e ste unit i d e c om p ilare sunt d e num ite astfe l: num e le c lase i d e at ac op e rire , urm at d e sim b olul $ ap oi d e num e le c lase i im b ric ate . class ClasaDeAcoperire{ class ClasaInterna1 {} class ClasaInterna2 {} }

2 .7 . CL ASE SI M E T O D E AB ST RACT E P e ntru e x e m p lul d e m ai sus v or g e ne rate tre i ie re : s ClasaDeAcoperire.class ClasaDeAcoperire$ClasaInterna1.class ClasaDeAcoperire$ClasaInterna2.class

67

In c az ul c are c lase le im b ric ate au la r nd ul lor alte c lase im b ric ate n a (situatie m ai p utin uz ual) d e num ire a lor se fac e d up ac e e a i re g ul: ad ug are a a a s a a unui $ i ap oi num e le c lase i im b ric ate . s

2 .6 .4

Clase anonim e

E x ist p osib ilitate a d e nirii unor c lase im b ric ate loc ale , fr num e , utiliz ate a aa d oar p e ntru instantie re a unui ob ie c t d e un anum it tip . A stfe l d e c lase se num e sc cla se a n o n im e i sunt foarte utile situatii c um ar c re are a unor s n ob ie c te c e im p le m e nte az o anum it inte rfat sau e x tind o anum it c las a a a a a ab strac t. a E x e m p le d e folosire a c lase lor anonim e v or d ate c ap itolul Inte rfe e , n t p re c um i e x te nsiv c ap itolul Inte rfata g rac c u utiliz atorul . s n a Fi ie re le re z ultate urm a c om p ilrii c lase lor anonim e v or av e a num e le s n a d e form a ClasaAcoperire.$1,..., ClasaAcoperire.$n, und e n e ste num rul a d e c lase anonim e d e nite c lasa re sp e c tiv d e ac op e rire . n a

2 .7

Clase i m etode ab stracte s

U ne ori p roie c tare a une i ap lic atii e ste ne c e sar s re p re z e ntm c u ajutorul n a a c lase lor c onc e p te ab strac te c are s nu p oat instantiate i c are s folose asc a a s a a d oar la d e z v oltare a ulte rioar a unor c lase c e d e sc riu ob ie c te c onc re te . D e e x a e m p lu, p ach e tul java.lang e x ist c lasa ab strac t Number c are m od e le az n a a a c onc e p tul g e ne ric d e num r . Intr-un p rog ram nu av e m a ne v oie d e nua ns m e re g e ne ric e c i d e num e re d e un anum it tip : ntre g i, re ale , e tc . Clasa Number se rv e te c a sup e rc las p e ntru c lase le c onc re te Byte, Double, Float, Integer, s a Long i Short, c e im p le m e nte az ob ie c te p e ntru d e sc rie re a num e re lor d e un s a anum it tip . A ad ar, c lasa Number re p re z int un c onc e p t ab strac t i nu v om s a s p ute a instantia ob ie c te d e ac e st tip - v om folosi sch im b sub c lase le sale . n Number numar = new Number(); // Eroare Integer intreg = new Integer(10); // Corect

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 larare a une i c lase ab strac te se fac e folosind c uv ntul re z e rv at abstract: a [public] abstract class ClasaAbstracta [extends Superclasa] [implements Interfata1, Interfata2, ...] { // Declaratii uzuale // Declaratii de metode abstracte } O c las ab strac t p oate av e a m od ic atorul public, ac c e sul im p lic it ind a a la niv e l d e p ach e t, d ar nu p oate sp e c ic a m od ic atorul final, c om b inatia abstract final ind se m nalat c a e roare la c om p ilare - d e altfe l, o c las a a d e c larat astfe l nu ar av e a nic i o utilitate . a O c las ab strac t p oate c ontine ac e le a i e le m e nte m e m b re c a o c las a a s a ob i nuit, la c are se ad aug d e c laratii d e m e tod e ab strac te - fr nic i o im s a a aa p le m e ntare .

2 .7 .2

M etode ab stracte

S p re d e ose b ire d e c lase le ob i nuite c are tre b uie s furniz e z e im p le m e ntri s a a p e ntru toate m e tod e le d e c larate , o c las ab strac t p oate c ontine m e tod e fr a a aa nic i o im p le m e ntare . M e tod e le fara nic i o im p le m e ntare se num e sc m etod e a bstra cte i p ot ap re a d oar c lase ab strac te . In fata une i m e tod e ab strac te s a n tre b uie s ap ar ob lig atoriu c uv ntul ch e ie abstract, altfe l v a furniz at o a a a a e roare d e c om p ilare . abstract class ClasaAbstracta { abstract void metodaAbstracta(); // Corect void metoda(); // Eroare } In fe lul ac e sta, o c las ab strac t p oate p une la d isp oz itia sub c lase lor sale a a un m od e l c om p le t p e c are tre b uie s-l im p le m e nte z e , furniz nd ch iar im p le a a m e ntare a unor m e tod e c om une tuturor c lase lor i ls nd e x p lic itare a altora s aa

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

69

e c re i sub c lase p arte . a n U n e x e m p lu e loc v e nt d e folosire a c lase lor i m e tod e lor ab strac te e ste d e s sc rie re a ob ie c te lor g rac e ntr-o m anie r orie ntat-ob ie c t. a a Ob ie c te g rac e : linii, d re p tung h iuri, c e rc uri, c urb e B e z ie r, e tc S tri c om une : p oz itia(orig ine a), d im e nsiune a, c uloare a, e tc a Com p ortam e nt: m utare , re d im e nsionare , d e se nare , c olorare , e tc . P e ntru a folosi strile i c om p ortam e nte le c om une ac e stor ob ie c te av ana s n tajul nostru p ute m d e c lara o c las g e ne ric GraphicObject c are s e sua a a p e rc las p e ntru c e le lalte c lase . M e tod e le ab strac te v or folosite p e ntru im a p le m e ntare a c om p ortam e ntului sp e c ic e c rui ob ie c t, c um ar d e se nare a a iar c e le ob i nuite p e ntru c om p ortam e ntul c om un tuturor, c um ar sch im s b are a orig inii. Im p le m e ntare a c lase i ab strac te GraphicObject ar p ute a arta a astfe 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(); ... }

70

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

O sub c las c are nu e ste ab strac t a une i c lase ab strac te tre b uie s furniz e z e a a a ob lig atoriu im p le m e ntri ale m e tod e lor ab strac te d e nite sup e rc las. Im a n a p le m e ntare a c lase lor p e ntru ob ie c te g rac e ar : 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 strac te , m ai tre b uie m e ntionate urm toare le : a O c las ab strac t p oate s nu aib nic i o m e tod ab strac t. a a a a a a O m e tod ab strac t nu p oate ap re a d e c t a a a a ntr-o c las ab strac t. a a Oric e c las c are are o m e tod ab strac t tre b uie d e c larat c a ind ab a a a a strac t. a

In A P I-ul ofe rit d e p latform a d e luc ru J av a sunt num e roase e x e m p le d e ie rarh ii c are folose sc la niv e le le sup e rioare c lase ab strac te . D intre c e le m ai im p ortante am intim : Number: sup e rc lasa ab strac t a tip urilor re fe rint num e ric e a a Reader, Writer: sup e rc lase le ab strac te ale ux urilor d e intrare / ie ire s p e c arac te re InputStream, OutputStream: sup e rc lase le ab strac te ale ux urilor d e intrare / ie ire p e oc te i s t AbstractList, AbstractSet, AbstractMap: sup e rc lase ab strac te p e ntru struc turi d e d ate d e tip c ole c ie t

2 .8 . CL ASA O B J E CT

71

Component : sup e rc lasa ab strac t a c om p one nte lor folosite d e z a n v oltare a d e ap lic atii c u inte rfat g rac c u utiliz atorul (G U I), c um ar a a Frame, Button, Label, e tc . e tc .

2 .8
2 .8 .1

Clasa O b ject
O rice clas are o superclas a a

D up c um am v z ut se c iune a d e d ic at m od alit ii d e c re are a une i c lase , a a n t a at c lauz a e x te nd s sp e c ic fap tul c ac e a c las e x tind e (m o te ne te ) o alt a a a s s a c las, num it sup e rc las. O c las p oate av e a o sing ur sup e rc las (J av a nu a a a a a a sup ort m o te nire a m ultip l) i ch iar d ac nu sp e c ic m c lauz a e x te nd s la a s a s a a c re are a une i c lase e a totu i v a av e a o sup e rc las. Cu alte c uv inte , J av a s a n oric e c las are o sup e rc las i num ai una. E v id e nt, tre b uie s e x iste o e x c e p ie a as a t d e la ac e ast re g ul i anum e c lasa c are re p re z int rd c ina ie rarh ie i form at a as a a a a d e re latiile d e m o te nire d intre c lase . A c e asta e ste c lasa O b ject. s Clasa Object e ste i sup e rc lasa im p lic it a c lase lor c are nu sp e c ic o s a a anum it sup e rc las. D e c laratiile d e m ai jos sunt e ch iv ale nte : a a class Exemplu {} class Exemplu extends Object {}

2 .8 .2

Clasa O b ject

Clasa Object e ste c e a m ai g e ne ral d intre c lase , oric e ob ie c t ind , d ire c t a sau ind ire c t, d e sc e nd e nt al ac e ste i c lase . Fiind p rinte le tuturor, Object a d e ne te i im p le m e nte az c om p ortam e ntul c om un al tuturor c e lorlalte c lase s s a J av a, c um ar : p osib ilitate a te strii e g alit ii v alorilor ob ie c te lor, a at sp e c ic are a une i re p re z e ntri c a ir d e c arac te re a unui ob ie c t , a s re turnare a c lase i d in c are fac e p arte un ob ie c t, notic are a altor ob ie c te c o v ariab il d e c ond itie s-a sch im b at, e tc . a a

72

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

Fiind sub c las a lui Object, oric e c las p oate sup rad e ni m e tod e le a a i c are nu sunt nale . M e tod e le c e l m ai uz ual sup rad e nite sunt: clone, equals/hashCode, finalize, toString. clone A c e ast m e tod e ste folosit p e ntru d up lic are a ob ie c te lor (c re are a unor a a a c lone ). Clonare a unui ob ie c t p re sup une c re are a unui nou ob ie c t d e ac e la i tip i c are s aib ac e e a i stare (ac e le a i v alori p e ntru v ariab ile le s s a a s s sale ). eq uals, h ash Code A c e ste a sunt, d e ob ic e i, sup rad e nite p re un. In m e tod a equals e ste m a sc ris c od ul p e ntru c om p arare a e g alit ii c ontinutului a d ou ob ie c te . at a Im p lic it (im p le m e ntare a d in c lasa Object), ac e ast m e tod c om p ar a a a re fe rinte le ob ie c te lor. U z ual e ste re d e nit p e ntru a te sta d ac strile a a a ob ie c te lor c oinc id sau d ac d oar o p arte d in v ariab ile le lor c oinc id . a M e tod a hashCode re turne az a un c od ntre g p e ntru e c are ob ie c t, p e ntru a te sta c onsiste nta ob ie c te lor: ac e la i ob ie c t tre b uie s re turne z e s a ac e la i c od p e d urata e x e c utie i p rog ram ului. s D ac d ou ob ie c te sunt e g ale c onform m e tod e i equals, atunc i ap e lul a a m e tod e i hashCode p e ntru e c are d in c e le d ou ob ie c te ar tre b ui s a a re turne z e ac e la i intre g . s naliz e In ac e ast m e tod se sc rie c od ul c are c ur d up un ob ie c t a a ata a nainte d e a e lim inat d in m e m orie d e c ole c torul d e g unoaie . (v e z i D istrug e re a ob ie c te lor ) toS tring E ste folosit p e ntru a re turna o re p re z e ntare c a ir d e c arac te re a unui a s ob ie c t. E ste util p e ntru c onc ate nare a irurilor c u d iv e rse ob ie c te a s n v e d e re a a rii, ind ap e lat autom at atunc i c nd e ste ne c e sar transsa a a a form are a unui ob ie c t ir d e c arac te re . n s Exemplu obj = new Exemplu(); System.out.println("Obiect=" + obj); //echivalent cu System.out.println("Obiect=" + obj.toString());

2 .8 . CL ASA O B J E CT

73

S c onsid e rm urm torul e x e m p lu, c are im p le m e ntm p artial c lasa a a a n a num e re lor c om p le x e , i c are v om sup rad e ni m e tod e ale c lase i Object. s n D e ase m e ne a, v om sc rie un m ic p rog ram TestComplex c are v om te sta n m e tod e le c lase i d e nite . L isting 2.1: Clasa num e re lor c om 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 ; } }

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 ) ) ; System . out . println ( c1 . equals ( c2 ) ) ; System . out . println ( c1 . equals ( c3 ) ) ; } }

// 3.0 + 5.0 i // false // true

2 .9

Conversii autom ate ntre tipuri

D up c um v z ut tip urile J av a d e d ate p ot p rtie p rim itive i re ferin . a a m a n s ta P e ntru e c are tip p rim itiv e x ist o c las c ore sp unz toare c are p e rm ie luc rul a a a orie ntat ob ie c t c u tip ul re sp e c tiv . byte short int long float double char boolean Byte Short Integer Long Float Double Character Boolean

Fie c are d in ac e ste c lase are un c onstruc tor c e p e rm ite initializ are a unui ob ie c t av nd o anum it v aloare p rim itiv i m e tod e sp e c ializ ate p e ntru c ona a as v e rsia unui ob ie c t tip ul p rim itiv c ore sp unz tor, d e g e nul tip P rim itiv Value: n a Integer obi = new Integer(1); int i = obi.intValue(); Boolean obb = new Boolean(true); boolean b = obb.booleanValue(); Inc e p nd c u v e rsiune a 1.5 a lim b ajului J av a, atrib uirile e x p lic ite a ntre tip uri p rim itv e i re fe rint sunt p osib ile , ac e st m e c anism p urt nd num e le d e s a a a u to bo xin g , re sp e c tiv a u to -u n bo xin g . Conv e rsia e x p lic it v a fac ut d e c tre a a a c om p ilator.

2 .1 0 . T IPUL D E D AT E E NUM E RARE // Doar de la versiunea 1.5 ! Integer obi = 1; int i = obi; Boolean obb = true; boolean b = obb;

75

2 .10

T ipul de date enum erare

Inc e p nd c u v e rsiune a 1.5 a lim b ajului J av a, e x ist p osib ilitate a d e a d e ni a a tip uri d e d ate e num e rare p rin folosire a c uv ntului ch e ie enum . A c e st a a solutie sim p lic m ane v rare a g rup urilor d e c onstante , d up c um re ie se d in a a urm torul e x e m p lu: a 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 re sc ris astfe l: a public enum CuloriSemafor { ROSU, GALBEN, VERDE }; ... // Utilizarea structurii se face la fel ... if (semafor.culoare = CuloriSemafor.ROSU) semafor.culoare = CuloriSemafor.GALBEN); ... Com p ilatorul e ste re sp onsab il c u transform are a une i astfe l d e struc turi ntr-o c las c ore sp unz toare . a a

76

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

Capitolul 3 E x ceptii
3 .1 Ce sunt ex ceptiile ?

T e rm e nul excep ie e ste o p re sc urtare p e ntru e v e nim e nt e x c e p ional i p oate t t s d e nit c a un e v e nim e nt c e se p rod uc e tim p ul e x e c utie i unui p rog ram i n s c are p rov oac a ntre rup e re a c ursului norm al al e x e c utie i ac e stuia. E x c e p iile p ot ap re a d in d iv e rse c auz e i p ot av e a niv e le d ife rite d e g rav t a s itate : d e la e rori fatale c auz ate d e e ch ip am e ntul h ard w are p n la e rori c e a a in stric t d e c od ul p rog ram ului, c um ar ac c e sare a unui e le m e nt d in afara t sp atiului aloc at unui v e c tor. In m om e ntul c nd o ase m e ne a e roare se p rod uc e tim p ul e x e c utie i v a a n g e ne rat un ob ie c t d e tip e x c e p ie c e c ontine : t inform atii d e sp re e x c e p ia re sp e c tiv ; t a stare a p rog ram ului m om e ntul p rod uc e rii ac e le i e x c e p ii. n t 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 rulare a p rog ram ului v a g e ne rat o e x c e p ie , p rog ram ul se v a op ri a t la instruc iune a c are a c auz at e x c e p ia i se v a a a un m e saj d e e roare d e t t s s g e nul: 77

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)"

Cre are a unui ob ie c t d e tip e x c e p ie se num e te a ru n ca rea u n ei ex cep ii t s t ( th row ing an e x c e p tion ). In m om e ntul c are o m e tod g e ne re az (arunc ) n a a a o e x c e p ie siste m ul d e e x e c utie e ste re sp onsab il c u g sire a une i se c v e nte d e t a c od d intr-o m e tod c are s o trate z e . Cutare a se fac e re c ursiv , e p nd c u a a a nc a m e tod a c are a g e ne rat e x c e p ia i m e rg nd t s a nap oi p e linia ap e lurilor c tre a ac e a m e tod . a S e c v e nta d e c od d intr-o m e tod c are trate az o anum it e x c e p ie se a a a t num e te a n a lizo r d e excep ie ( e x c e p tion h and le r ) iar inte rc e p tare a i tratare a s t s e i se num e te p rin d erea excep iei ( c atch th e e x c e p tion ). s t Cu alte c uv inte , la ap aritia une i e rori e ste arunc at o e x c e p ie iar c ine v a a t tre b uie s o p rind p e ntru a o trata. D ac siste m ul nu g ase te nic i un a a a s analiz or p e ntru o anum it e x c e p ie , atunc i p rog ram ul J av a se op re te c u un a t s m e saj d e e roare ( c az ul e x e m p lului d e m ai sus m e sajul A ic i nu se m ai n ajung e ... nu v a a at). s

A tentie In J av a tratare a e rorilor nu m ai e ste o op iune c i o c onstr ng e re . In t a ap roap e toate situatile , o se c v e nt d e c od c are p oate p rov oc a e x c e p ii tre b uie a t s sp e c ic e m od alitate a d e tratare a ac e stora. a

3 .2

P rinderea i tratarea ex ceptiilor s

T ratare a e x c e p iilor se re aliz e az p rin inte rm e d iul b loc urilor d e instruc iuni t a t try, catch i finally. O se c v e nt d e c od c are trate az anum ite e x c e p ii s a a t tre b uie s arate astfe l: a try { // Instructiuni care pot genera exceptii } catch (TipExceptie1 variabila) { // Tratarea exceptiilor de tipul 1

3 .2 . PRIND E RE A SI T RAT ARE A E X CE PT IIL O R } catch (TipExceptie2 variabila) { // Tratarea exceptiilor de tipul 2 } . . . finally { // Cod care se executa indiferent // daca apar sau nu exceptii }

79

S c onsid e rm urm torul e x e m p lu: c itire a unui ie r oc te t c u oc te t i a a a s s asare a lui p e e c ran. Fr a folosi tratare a e x c e p iilor m e tod a re sp onsab il aa t a c u c itire a ie rului ar arta astfe l: s a 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 e ast se c v e nt d e c od v a furniz a e rori la c om p ilare d e oare c e J av a a a n tratare a e rorilor e ste ob lig atorie . Folosind m e c anism ul e x c e p iilor m e tod a t citeste si p oate trata sing ur e rorile c are p ot surv e ni p e p arc ursul e x e c utie i a sale . M ai jos e ste c od ul c om p lte i c ore c t al unui p rog ram c e a e az p e e c ran s s a c ontinutul unui ie r al c rui num e e ste p rim it c a arg um e nt d e la linia d e s a c om and . T ratare a e x c e p iilor e ste re aliz at c om p le t ch iar d e c tre m e tod a a t a a citeste.

80

CAPIT O L UL 3 . E X CE PT II L isting 3.1: Citire a unui sie r - c ore 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 ( File NotFo undEx cepti on 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

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


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

81

B loc ul try c ontine instruc iunile d e d e sch id e re a unui ie r i d e c itire t s s d intr-un ie r, am b e le p ut nd p rod uc e e x c e p ii. E x c e p iile p rov oc ate d e s a t t ac e ste instruc iuni sunt tratate c e le d ou b loc uri c atch , c te unul p e nt n a a tru e c are tip d e e x c e p ie . Inch id e re a ie rului se fac e b loc ul nally , t s n d e oare c e ac e sta e ste sig ur c se v a e x e c uta Fr a folosi b loc ul nally , a aa nch id e re a ie rului ar tre b uit fac ut e c are situatie c are ie rul ar s a n n s fost d e sch is, c e e a c e ar d us la sc rie re a d e c od 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 m ai d e lic at c are tre b uie se m nalata ac e asta situatie e ste a a n fap tul c m e tod a close, re sp onsab il c u a a nch id e re a unui ie r, p oate p rov oc a s la r nd ul su e x c e p ii, d e e x e m p lu atunc i c nd ie rul m ai e ste folosit i d e a a t a s s alt p roc e s i nu p oate s nch is. D e c i, p e ntru a av e a un c od c om p le t c ore c t tre b uie s tratm i p osib ilitate a ap aritie i une i e x c e p ii la m e tod a close. a a s t

A tentie Ob lig atoriu un b loc d e instruc iuni try tre b uie s e urm at d e unul t a sau m ai m ulte b loc uri c atch , func ie d e e x c e p iile p rov oc ate d e ac e le n t t instruc iuni sau (op ional) d e un b loc nally . t t

82

CAPIT O L UL 3 . E X CE PT II

3 .3

A runcarea ex ceptiilor

In c az ul c are o m e tod nu si asum re sp onsab ilitate a tratrii une ia sau n a a a m ai m ultor e x c e p ii p e c are le p ot p rov oc a anum ite instruc iuni d in c od ul t t su atunc i e a p oate s arunc e ac e ste e x c e p ii c tre m e tod e le c are o ap e a a t a le az , urm nd c a ac e ste a s im p le m e nte z e tratare a lor sau, la r nd ul lor, s a a a a a arunc e m ai d e p arte e x c e p iile re sp e c tiv e . t A c e st luc ru se re aliz e az p rin sp e c ic are a d e c laratia m e tod e i a c lauz e i a n throws: [modificatori] TipReturnat metoda([argumente]) throws TipExceptie1, TipExceptie2, ... { ... }

A tentie O m e tod c are nu trate az o anum it e x c e p ie tre b uie ob lig atoriu s o a a a t a arunc e .

In e x e m p lul d e m ai sus d ac nu fac e m tratare a e x c e p iilor c ad rul a t n m e tod e i citeste atunc i m e tod a ap e lant (main) v a tre b ui s fac ac e st luc ru: a a a L isting 3.2: Citire a unui sie 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 () ; }

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 ( File NotFo undEx cepti on 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 se rv ati c , ac e st c az , nu m ai p ute m d ife re ntia e x c e p iile p rov oc ate d e a n t c itire a d in ie r s d e inch id e re a ie rului, am b e le ind d e tip ul IOException. s s D e ase m e ne a, inch id e re a ie rului nu v a m ai fac ut situatia c are s a n n ap are o e x c e p ie la c itire a d in ie r. E ste situatia c are p ute m folosi b loc ul t s n finally fr a folosi nic i un b loc catch: aa 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(); } }

84

CAPIT O L UL 3 . E X CE PT II

M e tod a ap e lant p oate arunc a la r nd ul s u e x c e p iile m ai d e p arte c tre a a a t a m e tod a c are a ap e lat-o la r nd ul e i. A c e ast antuire se te rm in c u m e tod a a a nl a main c are , d ac v a arunc a e x c e p iile c e p ot ap re a c orp ul e i, v a d e te rm ina a t a n trim ite re a e x c e p iilor c tre m a ina v irtual J av a. t a s 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 ratare a e x c e p iilor d e c tre J V M se fac e p rin te rm inare a p rog ram ului i t a s a are a inform atiilor d e sp re e x c e p ia c are a d e te rm inat ac e st luc ru. P e ntru s t e x e m p lul nostru, m e tod a main ar p ute a d e c larat astfe l: a public static void main(String args[]) throws FileNotFoundException, IOException { citeste(args[0]); } Intotd e auna tre b uie g sit c om p rom isul op tim a ntre tratare a loc al a e x c e p iilor a t i arunc are a lor c tre niv e le le sup e rioare , astfe l t c od ul s e c t m ai c lar s a nc a a a i id e ntic are a loc ului c are a ap rut e x c e p ia s e c t m ai u or d e fc ut. s n a t a a s a

A runc are a une i e x c e p ii se p oate fac e i im p lic it p rin instruc iune a throw t s t c e are form atul: throw exceptie, c a e x e m p le le d e m ai jos: n throw new IOException("Exceptie I/O"); ... if (index >= vector.length) throw new ArrayIndexOutOfBoundsException(); ...

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R catch(Exception e) { System.out.println("A aparut o exceptie); throw e; }

85

A c e ast instruc iune e ste folosit m ai ale s la arunc are a e x c e p iilor p rop rii. a t a t (v e z i Cre are a p rop riilor e x c e p ii ) t

3 .4

A vantajele trat rii ex ceptiilor a

P rin m od alitate a sa d e tratare a e x c e p iilor, J av a are urm toare le av antaje t a fat d e m e c anism ul trad itional d e tratare a e rorilor: a S e p arare a c od ului p e ntru tratare a une i e rori d e c od ul c are e a p oate n s ap ar. a a P rop ag are a une i e rori p n la un analiz or d e e x c e p ii c ore sp unz tor. a a t a G rup are a e rorilor d up tip ul lor. a

3 .4 .1

S epararea codului pentru tratarea erorilor

In p rog ram are a trad itional tratare a e rorilor se c om b in c u c od ul c e p oate a a p rod uc e ap aritia lor p rod uc nd a a num itul c od sp ag h e tti . S c onsid e rm a s a a urm torul e x e m p lu: o func ie c are arc un ie r m e m orie : a t nc a s n citesteFisier { deschide fisierul; determina dimensiunea fisierului; aloca memorie; citeste fisierul in memorie; inchide fisierul; } P rob le m e le c are p ot ap re a la ac e asta func ie , ap are nt sim p l, sunt d e a t a g e nul: Ce se am p l d ac : ... ? nt a a ie rul nu p oate d e sch is s nu se p oate d e te rm ina d im e nsiune a ie rului s

86 nu p oate aloc at suc ie nt m e m orie a a nu se p oate fac e c itire a d in ie r s ie rul nu p oate s nch is

CAPIT O L UL 3 . E X CE PT II

U n c od trad itional c are s trate z e ac e ste e rori ar arta astfe l: a a 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 e rori i re une az s ng a e x tre m d e m ult te le g e re a sa. In J av a, folosind m e c ansim ul e x c e p iilor, nt t c od ul ar arata, sch e m atiz at, astfe l:

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R 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 re nta d e c laritate e ste e v id e nt. a

87

3 .4 .2

P ropag area erorilor

P rop ag are a une i e rori se fac e p n la un analiz or d e e x c e p ii c ore sp unz tor. a a t a S p re sup une m c ap e lul la m e tod a citesteFisier e ste c onse c inta unor a a ap e luri im b ric ate d e m e tod e : int metoda1() { metoda2(); ... } int metoda2() { metoda3; ... } int metoda3 { citesteFisier(); ...

88 }

CAPIT O L UL 3 . E X CE PT II

S p re sup une m d e ase m e ne a c d orim s fac e m tratare a e rorilor d oar a a a metoda1. T rad itional, ac e st luc ru ar tre b ui fc ut p rin p rop ag are a e rorii n a p rod use d e m e tod a citesteFisier p n la metoda1: a a 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 c um am v az ut, J av a p e rm ite une i m e tod e s arunc e e x c e p iile a a t ap rute c ad rul e i la un niv e l sup e rior, ad ic func iilor c are o ap e le az a n a t a sau siste m ului. Cu alte c uv inte , o m e tod p oate s nu si asum e re sp onsab ila a itate a tratrii e x c e p iilor ap rute c ad rul e i: a t a n int metoda1() { try { metoda2(); } catch (TipExceptie e) { //proceseazaEroare; } ... }

3 .4 . AV ANT AJ E L E T RAT ARII E X CE PT IIL O R int metoda2() throws TipExceptie { metoda3(); ... } int metoda3() throws TipExceptie { citesteFisier(); ... }

89

3 .4 .3

G ruparea erorilor dup tipul lor a

In J av a e x ist c lase c ore sp unz toare tuturor e x c e p iilor c are p ot ap re a la a a t a e x e c utia unui p rog ram . A c e ste a sunt g rup ate func ie d e sim ilarit ile n t at lor ntr-o ie rarh ie d e c lase . D e e x e m p lu, c lasa IOException se oc up c u a e x c e p iile c e p ot ap re a la op e ratii d e intrare / ie sire i d ife re ntiaz la r nd ul t a s a a e i alte tip uri d e e x c e p ii, c um ar FileNotFoundException, EOFException, t e tc . L a r nd ul e i, c lasa IOException se ad re az a nc a ntr-o c ate g orie m ai larg d e a e x c e p ii i anum e c lasa Exception. t s R ad ac in ac e ste i ie rarh ii e ste c lasa Throwable (v e z i Ie rarh ia c lase lor c e d e a sc riu e x c e p ii ). t P rond e re a une i e x c e p ii se p oate fac e e la niv e lul c lase i sp e c ic e p e nt tru ac e a e x c e p ie , e la niv e lul une ia d in sup e rc lase le sale , func ie d e t n t ne c e sit ile p rog ram ului, a, c u c t c lasa folosit e ste m ai g e ne ric c u at t at ns a a a a tratare a e x c e p iilor p rog ram ul si p ie rd e d in e x ib ilitate . t 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

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 d c ina c lase lor c e d e sc riu e x c e p ii e ste c lasa Throwable iar c e le m ai im p ora a t tante sub c lase ale sale sunt Error, Exception i RuntimeException, c are s sunt la r nd ul lor sup e rc lase p e ntru o se rie a ntre ag d e tip uri d e e x c e p ii. a t

E rorile , ob ie c te d e tip Error, sunt c az uri sp e c iale d e e x c e p ii g e ne rate t d e func ionare a anorm al a e ch ip am e ntului h ard p e c are rule az un p rot a a g ram J av a i sunt inv iz ib ile p rog ram atorilor. U n p rog ram J av a nu tre b uie s s a trate z e ap aritia ac e stor e rori i e ste im p rob ab il c a o m e tod J av a s p rov oac e s a a ase m e ne a e rori.

3 .6 . E X CE PT II L A E X E CUT IE

91

E x c e p iile , ob ie c te le d e tip Exception, sunt e x c e p iile stand ard (soft) c are t t tre b uie tratate d e c tre p rog ram e le J av a. D up c um am m ai z is tratare a ac e sa a tor e x c e p ii nu e ste o op iune c i o c onstr ng e re . E x c e p iile c are p ot sc p a t t a t a ne tratate d e sc ind d in sub c lasa RuntimeException i se num e sc excep ii la s t execu ie . t M e tod e le c are sunt ap e late uz ual p e ntru un ob ie c t e x c e p ie sunt d e nite t c lasa Throwable i sunt p ub lic e , astfe l t p ot ap e late p e ntru oric e tip n s nc a d e e x c e p ie . Ce le m ai uz uale sunt: t getMessage - a e az d e taliul une i e x c e p ii; s a t printStackTrace - a e az inform atii c om p le te d e sp re e x c e p ie i los a t s c aliz are a e i; toString - m e tod m o te nit d in c lasa Object, c are furniz e az re p re z e ntare a a s a a c a ir d e c arac te re a e x c e p ie i. s t

3 .6

E x ceptii la ex ecutie

In g e ne ral, tratare a e x c e p iilor e ste ob lig atorie J av a. D e la ac e st p rinc ip u se t n sustrag a a a num ite le excep ii la execu ie sau, c u alte c uv inte , e x c e p iile ns s t t t c are p rov in stric t d in v ina p rog ram atorului i nu g e ne rate d e o anum it s a situatie e x te rn, c um ar lip sa unui ie r. a s A c e ste e x c e p ii au o sup e rc las c om un RuntimeException i ac e sata t a a s n c ate g orie sunt inc luse e x c e p iile p rov oc ate d e : t op e ratii aritm e tic e ile g ale ( p rtire a m a ntre g ilor la z e ro); ArithmeticException ac c e sare a m e m b rilor unui ob ie c t c e are v aloare a null; NullPointerException ac c e sare a e ronat a e le m e nte lor unui v e c tor. a ArrayIndexOutOfBoundsException E x c e p iile la e x e c utie p ot ap re a uriund e p rog ram i p ot e x tre m t a n s d e num e roare iar e rc are a d e p rind e re a lor ar e x tre m d e ane v oioas. nc a D in ac e st m otiv , c om p ilatorul p e rm ite c a ac e ste e x c e p ii s rm n ne tratate , t a a a a tratare a lor ne ind a ile g al. R e am intim a c , c az ul ap aritie i oric rui ns a ns a n a tip d e e x c e p ie c are nu are un analiz or c ore sp unz tor, p rog ram ul v a te rm it a nat.

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 rtire a la 0 v a g e ne ra o e x c e p ie d oar d ac tip ul num e re lor p rtite a t a m a e ste aritm e tic ntre g . In c az ul tip urilor re ale (float i double) nu v a s g e ne rat nic i o e x c e p ie , c i v a furniz at c a re z ultat o c onstant c are p oate a t a , func ie d e op e ratie , Infinity, -Infinity, sau Nan. t 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 se ori p oate ap re a ne c e sitate a c re rii unor e x c e p ii p rop rii p e ntru a p une a a t e v id e nta c az uri sp e c iale d e e rori p rov oc ate d e m e tod e le c lase lor une i lib rrii, n a c az uri c are nu au fost p re v az ute ie rarh ia e x c e p iilor stand ard J av a. n t O e x c e p ie p rop rie tre b uie s se ad re z e a ie rarh ia e x c e p iilor J av a, t a nc ns n t c u alte c uv inte c lasa c are o im p le m e nte az tre b uie s e sub c las a une ia a a a d e ja e x iste nte ac e asta ie rarh ie , p re fe rab il una ap rop iat c a se m nic atie , n a sau sup e rc lasa Exception.

3 .7 . CRE ARE A PRO PRIIL O R E X CE PT II public class ExceptieProprie extends Exception { public ExceptieProprie(String mesaj) { super(mesaj); // Apeleaza constructorul superclasei Exception } }

93

S c onsid e rm urm torul e x e m p lu, c are c re m o c las c e d e sc rie p artial a a a n a a o stiv d e num e re a ntre g i c u op e ratiile d e ad ug are a unui e le m e nt, re sp e c a tiv d e sc oate re a e le m e ntului d in v rful stiv e i. D ac p re sup une m c stiv a a a a p oate m e m ora m ax im 100 d e e le m e nte , am b e le op e ratii p ot p rov oc a e x c e p ii. t P e ntru a p e rsonaliz a ac e ste e x c e p ii v om c re a o c las sp e c ic d e num it t a a a ExceptieStiva: 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 e nta ch e ie e ste extends Exception c are sp e c ic fap tul c noua a a c las ExceptieStiva e ste sub c las a c lase i Exception i d e c i im p le m e nte az a a s a ob ie c te c e re p re z int e x c e p ii. a t

94

CAPIT O L UL 3 . E X CE PT II

In g e ne ral, c od ul ad ug at c lase lor p e ntru e x c e p ii p rop rii e ste ne se m nic ativ : a t unul sau d oi c onstruc tori c are a e az a un m e saj d e e roare la ie ire a stand ard . s s P roc e sul d e c re are a une i noi e x c e p ii p oate d us m ai d e p arte p rin ad ug are a t a unor noi m e tod e c lase i c e d e sc rie ac e a e x c e p ie , a ac e asta d e z v oltare nu t ns si are rostul m ajoritate a c az urilor. E x c e p iile p rop rii sunt d e sc rise uz ual n t d e c lase foarte sim p le , ch iar fr nic i un c od e le , c um ar : aa n class ExceptieSimpla extends Exception { } A c e ast c las se b az e az p e c onstruc torul im p lic it c re at d e c om p ilator a a a a nu are c onstruc torul ExceptieSimpla(String s). ns

Capitolul 4 Intr ri i ie iri a s s


4 .1
4 .1.1

Introducere
Ce sunt ux urile?

M ajoritate a ap lic atiilor ne c e sit c itire a unor inform atii c are se g se sc p e a a o surs e x te rn sau trim ite re a unor inform atii c tre o d e stinatie e x te rn. a a a a Inform atia se p oate g si oriund e : a ntr-un ie r p e d isc , re e a, m e m orie s n t n sau alt p rog ram i p oate d e oric e tip : d ate p rim itiv e , ob ie c te , im ag ini, n s sune te , e tc . P e ntru a ad uc e inform atii d intr-un m e d iu e x te rn, un p rog am J av a tre b uie s d e sch id un ca n a l d e co m u n ica ie ( u x) d e la sursa inform atiilor a a t ( ie r, m e m orie , sock e t, e tc ) i s c ite asc se c v e ntial inform atiile re sp e c tiv e . s s a a S im ilar, un p rog ram p oate trim ite inform atii c tre o d e stinatie e x te rn a a d e sch iz nd un c anal d e c om unic atie ( ux ) c tre ac e a d e stinatie i sc riind a a s se c v e ntial inform atiile re sp e c tiv e . Ind ife re nt d e tip ul inform atiilor, c itire a/ sc rie re a d e p e / c tre un m e d iu a e x te rn re sp e c t urm torul alg oritm : a a deschide canal comunicatie while (mai sunt informatii) { citeste/scrie informatie; } inchide canal comunicatie; P e ntru a g e ne raliz a, at t sursa e x te rn a unor d ate c t i d e stinatia lor a a a s sunt v z ute c a ind ni te p roc e se c are p rod uc , re sp e c tiv c onsum inform atii. a s a 95

96

CAPIT O L UL 4 . INT RARI SI IE SIRI

D e nitii: U n u x e ste un c anal d e c om unic atie unid ire c ional t ntre d ou p roc e se . a U n p roc e s c are d e sc rie o surs e x te rn d e d ate se num e te p roces p ro d u c to r. a a s a U n p roc e s c are d e sc rie o d e stinatie e x te rn p e ntru d ate se num e te p roce s a s co n su m a to r. U n ux c are c ite te d ate se num e te u x d e in tra re . s s U n ux c are sc rie d ate se num e te u x d e ie ire. s s

O b servatii: Flux urile sunt c anale d e c om unic atie se riale p e 8 sau 16 b iti. Flux urile sunt unid ire c ionale , d e la p rod uc tor la c onsum ator. t a Fie c are ux are un sing ur p roc e s p rod uc tor i un sing ur p roc e s c onsum ator. a s Intre d ou p roc e se p ot e x ista oric te ux uri, oric e p roc e s p ut nd at t p roa a a a d uc ator c t i c onsum ator ac e la i tim p , d ar p e ux uri d ife rite . a s n s Consum atorul i p rod uc atorul nu c om unic d ire c t p rintr-o inte rfat d e ux s a a c i p rin inte rm e d iul c od ului J av a d e tratare a ux urilor.

Clase le i inte fe e le stand ard p e ntru luc rul c u ux uri se g se sc p ach e tul s t a n java.io. D e c i, oric e p rog ram c are ne c e sit op e ratii d e intrare sau ie ire tre a s b uie s c ontin instruc iune a d e im p ort a p ach e tului java.io: a a t import java.io.*;

4 .1.2

Clasi carea ux urilor

E x ist tre i tip uri d e c lasic are a ux urilor: a D up d irectia c analului d e c om unic atie d e sch is ux urile se p art a m n: ux uri d e intrare (p e ntru c itire a d ate lor) ux uri d e ie ire (p e ntru sc rie re a d ate lor) s D up tip u l d e d a te p e c are op e re az : a a ux uri d e oc te i (c om unic are a se rial se re aliz e az p e 8 b iti) t a a ux uri d e c arac te re (c om unic are a se rial se re aliz e az p e 16 b iti) a a

4 .1 . INT RO D UCE RE D up a ctiu n ea lor: a

97

ux uri p rim are d e c itire / sc rie re a d ate lor (se oc up e fe c tiv c u a c itire a/ sc rie re a d ate lor) ux uri p e ntru p roc e sare a d ate lor

4 .1.3

Ierarh ia claselor pentru lucrul cu ux uri

Clase le rd c in p e ntru ie rarh iile c e re p re z int ux uri d e c arac te re sunt: a a a a R eader- p e ntru ux uri d e intrare i s W riter- p e ntru ux uri d e ie ire . s A c e ste a sunt sup e rc lase ab strac te p e ntru toate c lase le c e im p le m e nte az a ux uri sp e c ializ ate p e ntru c itire a/ sc rie re a d ate lor p e 16 b iti i v or c ontine s m e tod e le c om une tuturor. Ca o re g ul g e ne ral, toate c lase le d in ac e ste ie rarh ii v or av e a te rm inatia a a Reader sau Writer func ie d e tip ul lor, c um ar e x e m p le le : FileReader, n t n BufferedReader, FileWriter, BufferedWriter, e tc . D e ase m e ne a, se ob se rv c a o alt re g ul g e ne ral, fap tul c unui ux d e intrare XReader a a a a a i c ore sp und e uz ual un ux d e ie ire XWriter, a ac e st luc ru nu e ste ob lig as ns toriu.

Clase le rad ac in p e ntru ie rarh ia ux urilor d e oc te i sunt: a t InputS tream - p e ntru ux uri d e intrare i s O utputS tream - p e ntru ux uri d e ie ire . s A c e ste a sunt sup e rc lase ab strac te p e ntru c lase c e im p le m e nte az ux uri a sp e c ializ ate p e ntru c itire a/ sc rie re a d ate lor p e 8 b iti. Ca i c az ul ux s n urilor p e c arac te re d e num irile c lase lor v or av e a te rm inatia sup e rc lase i lor: FileInputStream, BufferedInputStream, FileOutputStream, BufferedOutputStream, e tc ., e c rui ux d e intrare XInputStream c ore a sp unz nd u-i uz ual un ux d e ie ire XOutputStream, fr c a ac e st luc ru s a s aa a e ob lig atoriu.

98

CAPIT O L UL 4 . INT RARI SI IE SIRI

P n la un p unc t, e x ist un p arale lism a a a ntre ie rarh ia c lase lor p e ntru ux uri d e c arac te re i c e a p e ntru ux urile p e oc te i. P e ntru m ajoritate a p ros t g ram e lor e ste re c om and at c a sc rie re a i c itire a d ate lor s se fac p rin inte rs a a m e d iul ux urilor d e c arac te re , d e oare c e ac e ste a p e rm it m anip ulare a c arac te re lor U nic od e tim p c e ux urile d e oc te i p e rm it d oar luc rul p e 8 b iti n t c arac te re A S CII.

4 .1.4

M etode com une ux urilor

S up e rc lase le ab strac te Reader i InputStream d e ne sc m e tod e sim ilare p e ns tru c itire a d ate lor. Reader int read() int read(char buf[]) ... InputStream int read() int read(byte buf[]) ...

D e ase m e ne a, am b e le c lase p un la d isp oz itie m e tod e p e ntru m arc are a une i loc atii ntr-un ux , saltul p e ste un num r d e p oz itii, re se tare a p oz itie i a c ure nte , e tc . A c e ste a sunt a m ai rar folosite i nu v or d e taliate . ns s S up e rc lase le ab strac te Writer i OutputStream sunt d e ase m e ne a p arale le , s d e nind m e tod e sim ilare p e ntru sc rie re a d ate lor: Reader void write(int c) void write(char buf[]) void write(String str) ... InputStream void write(int c) void write(byte buf[]) ...

Inch id e re a oric rui ux se re aliz e az p rin m e tod a close. In c az ul c are a a n ac e asta nu e ste ap e lat e x p lic it, ux ul v a autom at a nch is d e c tre c ole c torul a d e g unoaie atunc i c nd nu v a m ai e x ista nic i o re fe rint la e l, a ac e st luc ru a a ns tre b uie e v itat d e oare c e , la luc rul c u ux rui c u z on tam p on d e m e m orie , a d ate le d in m e m orie v or p ie rd ute la nch id e re a ux ului d e c tre gc . a M e tod e le re fe ritoare la ux uri p ot g e ne ra e x c e p ii d e tip ul IO E x ception t sau d e riv ate d in ac e ast c las, tratare a lor ind ob lig atorie . a a

4 .2 . F O L O SIRE A F L UX URIL O R

99

4 .2

F olosirea ux urilor

A a c um am v z ut, ux urile p ot p rtite func ie d e ac tiv itate a lor s a m a n t ux uri c are se oc up e fe c tiv c u c itire a/ sc rie re a d ate lor i ux uri p e ntru n a s p roc e sare a d ate lor (d e ltrare ). In c ontinuare , v om v e d e a c are sunt c e le m ai im p ortante c lase d in c e le d ou c ate g orii i la c e folose sc ac e ste a, p re c um i a s s m od alit ile d e c re are i utiliz are a ux urilor. at s

4 .2 .1

F lux uri prim itive

Flux urile p rim itiv e sunt re sp onsab ile c u c itire a/ sc rie re a e fe c tiv a d ate lor, a p un nd la d isp oz itie im p le m e ntri ale m e tod e lor d e b az read, re sp e c tiv a a a write, d e nite sup e rc lase . In func ie d e tip ul surse i d ate lor, e le p ot n t p rtite astfe l: m a F i ier s FileReader, FileWriter FileInputStream, FileOutputStream N um ite i u xu ri ier, ac e ste a sunt folosite p e ntru c itire a d ate lor s s d intr-un ie r, re sp e c tiv sc rie re a d ate lor s ntr-un ie r i v or analiz ate s s ntr-o se c iune se p arat (v e z i Flux uri p e ntru luc rul c u ie re ). t a s M em orie CharArrayReader, CharArrayWriter ByteArrayInputStream, ByteArrayOutputStream A c e ste ux uri folose sc p e ntru sc rie re a/ c itire a inform atiilor d in m e m n/ orie i sunt c re ate p e un v e c tor e x iste nt d e ja. Cu alte c uv inte , p e rm it s tratare a v e c torilor c a surs/ d e stinatie p e ntru c re are a unor ux uri d e a intrare / ie ire . s StringReader, StringWriter P e rm it tratare a irurilor d e c arac te re a ate m e m orie c a surs/ d e stinatie s n a p e ntru c re are a d e ux uri. P ipe PipedReader, PipedWriter PipedInputStream, PipedOutputStream Im p le m e nte az c om p one nte le d e intrare / ie ire ale une i c ond uc te d e a s

100

CAPIT O L UL 4 . INT RARI SI IE SIRI d ate (p ip e ). P ip e -urile sunt folosite p e ntru a c analiz a ie ire a unui p ros g ram sau r d e e x e c utie c tre intrare a altui p rog ram sau r d e e x e c utie . a

4 .2 .2

F lux uri de procesare

Flux urile d e p roc e sare (sau d e ltrare ) sunt re sp onsab ile c u p re luare a d ate lor d e la un ux p rim itiv i p roc e sare a ac e stora p e ntru a le ofe ri s ntr-o alt form , a a m ai util d intr-un anum it p unc t d e v e d e re . D e e x e m p lu, BufferedReader a p oate p re lua d ate d e la un ux FileReader i s ofe re inform atia d intr-un s a ie r linie c u linie . Fiind p rim itiv , FileReader nu p ute a c iti d e c t c arac te r s a c u c arac te r. U n ux d e p roc e sare nu p oate folosit d e c t p re un c u un a m a ux p rim itiv . Clase le c e d e sc riu ac e ste ux uri p ot p artite func ie d e tip ul d e m n t p roc e sare p e c are e fe c tue az a astfe l: l B u eriz are BufferedReader, BufferedWriter BufferedInputStream, BufferedOutputStream S unt folosite p e ntru a introd uc e un b u e r p roc e sul d e c itire / sc rie re n a inform atiilor, re d uc nd astfe l num rul d e ac c e sri la d isp oz itiv ul c e a a a re p re z int sursa/ d e stinatia orig inal a d ate lor. S unt m ult m ai e c ie nte a a d e c t ux urile fr b u e r i d in ac e st m otiv se re c om and folosire a lor a aa s a ori d e c te ori e ste p osib il (v e z i Citire a i sc rie re a c u z ona tam p on ). a s F iltrare FilterReader, FilterWriter FilterInputStream, FilterOutputStream S unt c lase ab strac te c e d e ne sc o inte rfat c om un p e ntru ux uri c are a a ltre az autom at d ate le c itite sau sc rise (v e z i Flux uri p e ntru ltrare ). a Conversie octeti-caractere InputStreamReader, OutputStreamWriter Form e az o p unte d e le g atur a a ntre ux urile d e c arac te re i ux urile s d e oc te i. U n ux InputStreamReader c ite te oc te i d intr-un ux t s t InputStream i c onv e rte te la c arac te re , folosind c od ic are a stans i s d ard a c arac te re lor sau o c od ic are sp e c ic at d e p rog ram . S im ilar, a un ux OutputStreamWriter c onv e rte te c arac te re oc te i i trim ite s n t s re z utatul c tre un ux d e tip ul OutputStream. a

4 .2 . F O L O SIRE A F L UX URIL O R

101

Concatenare SequenceInputStream Conc ate ne az m ai m ulte ux uri d e intrare a ntr-unul sing ur (v e z i Conc ate nare a ie re lor ). s S erializ are ObjectInputStream, ObjectOutputStream S unt folosite p e ntru se rializ are a ob ie c te lor (v e z i S e rializ are a ob ie c te lor ). Conversie tipuri de date DataInputStream, DataOutputStream Folosite la sc rie re a/ c itire a d ate lor d e tip p rim itiv ntr-un form at b inar, ind e p e nd e nt d e m a ina p e c are se luc re az (v e z i Folosire a c lase lor s a D ataInp utS tre am i D ataOutp utS tre am ). s N um rare a LineNumberReader LineNumberInputStream Ofe r i p osib ilitate a d e num rare autom at a liniilor c itite d e la un a s a a ux d e intrare . Citire avans n PushbackReader PushbackInputStream S unt ux uri d e intrare c are au un b u e r d e 1-c arac te r(oc te t) c are n e ste c itit av ans i c arac te rul (oc te tul) c are urm e az c e lui c ure nt c itit. n s a A are s PrintWriter PrintStream Ofe r m e tod e c onv e nab ile p e ntru asare a inform atiilor. a

4 .2 .3

Crearea unui ux

Oric e ux e ste un ob ie c t al c lase i c e im p le m e nte az ux ul re sp e c tiv . Cre are a a unui ux se re aliz e az a ad ar sim ilar c u c re are a ob ie c te lor, p rin instruc iune a a s t new i inv oc are a unui c onstruc tor c ore sp unz tor al c lase i re sp e c tiv e : s a E x e m p le :

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 ad ar, c re are a unui ux p rim itiv d e d ate c are c ite te / sc rie inform atii d e s s la un d isp oz itiv e x te rn are form atul g e ne ral: F lux P rim itiv num eF lux = new F lux P rim itiv(dispoz itivE x tern); Flux urile d e p roc e sare nu p ot e x ista d e sine stttoare c i se sup rap un p e aa un ux p rim itiv d e c itire / sc rie re a d ate lor. D in ac e st m otiv , c onstruc torii c lase lor p e ntru ux urile d e p roc e sare nu p rim e sc c a arg um e nt un d isp oz itiv e x te rn d e m e m orare a d ate lor c i o re fe rinta la un ux p rim itiv re sp onsab il c u c itire a/ sc rie re a e fe c tiv a d ate lor: a 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 ad ar, c re are a unui ux p e ntru p roc e sare a d ate lor are form atul g e ne ral: s

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( ux P rim itiv); In g e ne ral, ux urile p ot c om p use suc c e siuni oric t d e lung i: n a DataInputStream in = new DataInputStream( new BufferedInputStream( new FileInputStream("fisier.dat")));

4 .2 .4

F lux uri pentru lucrul cu iere s

Flux urile p e ntru luc rul c u ie re sunt c e le m ai usor d e le s, s nte ntruc t a op e ratia lor d e b az e ste c itire a, re sp e c tiv sc rie re a unui c arac te r sau oc te t a d intr-un sau ntr-un ie r sp e c ic at uz ual p rin num e le su c om p le t sau re lativ s a la d ire c torul c ure nt. D up c um am v z ut d e ja, c lase le c are im p le m e nte az ac e ste ux uri sunt a a a urm toare le : a FileReader, FileWriter - caractere FileInputStream, FileOutputStream - octeti Construc torii ac e stor c lase ac c e p t c a arg um e nt un ob ie c t c are s sp e c ic e a a un anum e ie r. A c e sta p oate un ir d e c arac te re , on ob ie c t d e tip File s s sau un ob ie c t d e tip FileDesciptor (v e z i Clasa File ). Construc torii c lase i FileReader sunt: public FileReader(String fileName) throws FileNotFoundException public FileReader(File file) throws FileNotFoundException public FileReader(FileDescriptor fd) Construc torii 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 throws IOException

append)

104

CAPIT O L UL 4 . INT RARI SI IE SIRI

Ce i m ai uz uali c onstruc tori sunt c e i c are p rim e sc c a arg um e nt num e le ie rului. A c e tia p ot p rov oc a e x c e p ii d e tip ul FileNotFoundException s s t n c az ul c are ie rul c u num e le sp e c ic at nu e x ist. D in ac e st m otiv oric e n s a c re are a unui ux d e ac e st tip tre b uie fc ut a a ntr-un b loc try-catch sau m e tod a c are sunt c re ate ux urile re sp e c tiv e tre b uie s arunc e e x c e p iile n a t d e tip ul FileNotFoundException sau d e tip ul sup e rc lase i IOException.

S c onsid e rm c a e x e m p lu un p rog ram c are c op ie c ontinutul unui ie r a a s c u num e le in.tx t ntr-un alt ie r c u num e le out.tx t . A m b e le ie re sunt s s c onsid e rate d ire c torul c ure nt. n L isting 4.1: Cop ie re a unui sie 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 c az ul c are v om lansa ap lic atia iar d ire c torul c ure nt nu e x ist un n n a ie r c u num e le in.tx t , v a g e ne rat o e x c e p ie d e tip ul s a t FileNotFoundException. A c e asta v a p rins d e p rog ram d e oare c e , IOException a e ste sup e rc las p e ntru FileNotFoundException. a D ac e x ist ie rul in.tx t , ap lic atia v a c re a un nou ie r out.tx t c are a a s s n v a c op iat c ontinutul p rim ului. D ac e x ist d e ja ie rul out.tx t e l v a re a a s

4 .2 . F O L O SIRE A F L UX URIL O R

105

sc ris. D ac d ore am s fac e m op e ratia d e ad ug are (ap p e nd ) i nu d e re sc rie re a a a s p e ntru ie rul out.tx t folose am : s FileWriter out = new FileWriter("out.txt", true);

4 .2 .5

Citirea i scrierea cu b u er s

Clase le p e ntru c itire a/ sc rie re a c u z ona tam p on sunt: BufferedReader, BufferedWriter - caractere BufferedInputStream, BufferedOutputStream - octeti S unt folosite p e ntru a introd uc e un b u e r (z on d e m e m orie ) p roc e a n sul d e c itire / sc rie re a inform atiilor, re d uc nd astfe l num arul d e ac c e sri ale a a d isp oz itiv ului c e re p re z int sursa/ d e stinatia ate lor. D in ac e st m otiv , sunt a m ult m ai e c ie nte d e c t ux urile fr b u e r i d in ac e st m otiv se re c om and a aa s a folosire a lor ori d e c te ori e ste p osib il. a Clasa BufferedReader c ite te av ans d ate i le m e m ore az s n s a ntr-o z on a tam p on. A tunc i c nd se e x e c ut o op e ratie d e c itire , c arac te rul v a p re a a luat d in b u e r. In c az ul c are b u e r-ul e ste g ol, c itire a se fac e d ire c t d in n ux i, od at c u c itire a c arac te rului, v or m e m orati b u e r i c arac te re le s a n s c are urm e az . E v id e nt, BufferedInputStream func ione az d up ac e la i i a t a a s p rinc ip iu, sing ura d ife re nt ind fap tul c sunt c ititi oc te i. a a t S im ilar luc re az a i c lase le BufferedWriter i BufferedOutputStream. s s L a op e ratiile d e sc rie re d ate le sc rise nu v or ajung e d ire c t la d e stinatie , c i v or m e m orate jntr-un b u e r d e o anum it d im e nsiune . A tunc i c nd b u e rul a a e ste p lin, c ontinutul ac e stuia v a transfe rat autom at la d e stinatie . Flux urile d e c itire / sc rie re c u b u e r sunt ux uri d e p roc e sare i sunt s folosite p rin sup rap une re c u alte ux uri, d intre c are ob lig atoriu unul e ste p rim itiv . BufferedOutputStream out = new BufferedOutputStream( new FileOutputStream("out.dat"), 1024) //1024 este dimensiunea bufferului Construc torii c e i m ai folositi ai ac e stor c lase sunt urm torii: a BufferedReader(Reader in) BufferedReader(Reader in, int dim_buffer) BufferedWriter(Writer out)

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 c az ul c onstruc torilor c are d im e nsiune a b u e r-ului nu e ste sp e c ic at, n a ac e asta p rim e te v aloare a im p lic it d e 512 oc te i (c arac te re ). s a t M e tod e le ac e stor c lase sunt c e le uz uale d e tip ul read i write. P e l ng a s a ac e ste a, c lase le p e ntru sc rie re p rin b u e r m ai au i m e tod a flush c are g ole te s s e x p lic it z ona tam p on, ch iar d ac ac e asta nu e ste p lin. a a 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 ine E ste sp e c ic ux urilor d e c itire c u b u e r i p e rm ite c itire a linie c u linie a a s d ate lor d e intrare . O linie re p re z int o suc c e siune d e c arac te re te rm inat c u a a sim b olul p e ntru sf r it d e linie , d e p e nd e nt d e p latform a d e luc ru. A c e sta as e ste re p re z e ntat J av a p rin se c v e nta e sc ap e \n; n BufferedReader br = new BufferedReader(new FileReader("in")) String linie; while ((linie = br.readLine()) != null) { ... //proceseaza linie } br.close(); }

4 .2 . F O L O SIRE A F L UX URIL O R

107

4 .2 .6

Concatenarea ux urilor

Clasa S eq uenceInputS tream p e rm ite une i ap lic atii s c om b ine se rial m ai a m ulte ux uri d e intrare astfe l t ac e ste a s ap ar c a un sing ur ux d e nc a a a intrare . Citire a d ate lor d intr-un astfe l d e ux se fac e astfe l: se c ite te d in s p rim ul ux d e intrare sp e c ic at p na c nd se ajung e la sf rsitul ac e stuia, a a a d up c are p rim ul ux d e intrare e ste a nch is i se d e sch id e autom at urm torul s a ux d e intrare d in c are se v or c iti c ontinuare d ate le , d up c are p roc e sul se n a re p e t p na la te rm inare a tuturor ux urilor d e intrare . a a Construc torii ac e ste i c lase sunt: SequenceInputStream(Enumeration e) SequenceInputStream(InputStream s1, InputStream s2) P rim ul c onstruie ste un ux se c v e ntial d intr-o m ultim e d e ux uri d e in trare . Fie c are ob ie c t e num e rare a p rim it c a p aram e tru tre b uie s e d e n a a tip ul InputStream. Ce l d e -al d oile a c onstruie te un ux d e intrare c are c om b in d oar d ou ux uri s a a s1 i s2, p rim ul ux c itit ind s1. s E x e m p lul c e l m ai e loc v e nt d e folosire a a ac e ste i c lase e ste c onc ate nare a a d ou sau m ai m ultor ie re : a s L isting 4.2: Conc ate nare a a d ou ie re a s
/* 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 ) ;

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 e ntru c onc ate nare a m ai m ultor ie re e x ist d ou v ariante : s a a folosire a une i e num e rri - p rim ul c onstruc tor (v e z i Cole c ii ); a t c onc ate nare a p e r nd a ac e stora folosind al 2-le a c onstruc tor; c ona c ate nare a a 3 ie re v a c onstrui un ux d e intrare astfe l: s 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 ltrarea datelor

U n ux d e ltrare se ata e az altui ux p e ntru a ltra d ate le c are sunt s a c itite / sc rise d e c tre ac e l ux . Clase le p e ntru ltrare a d ate lor sup e rc lase le a ab strac te : F ilterInputS tream - p e ntru ltrare a ux urilor d e intrare i s F ilterO utputS tream - p e ntru ltrare a ux urilor d e ie ire . s Ce le m ai im p ortante ux ruri p e ntru ltrare a d ate lor sunt im p le m e ntate d e c lase le : DataInputStream, DataOutputStream BufferedInputStream, BufferedOutputStream LineNumberInputStream PushbackInputStream PrintStream

4 .2 . F O L O SIRE A F L UX URIL O R Ob se rv ati c toate ac e ste c lase d e sc riu ux uri d e oc te i. a t

109

Filtrare a d ate lor nu tre b uie v z ut c a o m e tod d e a e lim ina anum iti a a a oc te ti d intr-un ux c i d e a transform a ac e ti oc te i d ate c are s p oat s t n a a inte rp re tate sub alt form . A a c um am v z ut la c itire a/ sc rie re a c u z on a a s a a tam p on, c lase le d e ltrare BufferedInputStream i BufferedOutputStream s c ole c te az d ate le unui ux a ntr-un b u e r, urm nd c a c itire a/ sc rie re a s se a a fac p rin inte rm e d iu ac e lui b u e r. a A ad ar, ux urile d e ltrare nu e lim in d ate c itite sau sc rise d e un anum it s a ux , c i introd uc o noua m od alitate d e m anip ulare a lor, e le m ai ind num ite i u xu ri d e p ro cesa re . D in ac e st m otiv , ux urile d e ltrare v or c ontine s anum ite m e tod e sp e c ializ ate p e ntru c itire a/ sc rie re a d ate lor, alte le d e c t c e le a c om une tuturor ux urilor. D e e x e m p lu, c lasa BufferedInputStream p une la d isp oz itie m e tod a readLine p e ntru c itire a une i linii d in ux ul d e intrare . Folosire a ux urilor d e ltrare se fac e p rin ata are a lor d e un ux c are se s oc up e fe c tiv d e c itire a/ sc rie re a d ate lor: a FluxFiltrare numeFlux = new FluxFiltrare(referintaAltFlux);

4 .2 .8

Clasele DataInputStream i DataOutputStream s

A c e ste c lase ofe r m e tod e p rin c are un ux nu m ai e ste v z ut c a o a a nsiruire d e oc te i, c i d e d ate p rim itiv e . P rin urm are , v or furniz a m e tod e p e ntru t c itire a i sc rie re a d ate lor la niv e l d e tip p rim itiv i nu la niv e l d e oc te t. s s Clase le c are ofe r un astfe l d e sup ort im p le m e nte az inte rfe e le DataInput, a a t re sp e c tiv DataOutput. A c e ste a d e ne sc m e tod e le p e c are tre b uie s le p un la a a d isp oz itie v e d e re a c itire ii/ sc rie rii d ate lor d e tip p rim itiv . Ce le m ai folosite n m e tod e , alte le d e c t c e le c om une tuturor ux urilor, sunt d ate tab e lul d e a n m ai jos:

110 D ataInputS tream readBoolean readByte readChar readDouble readFloat readInt readLong readShort readUTF

CAPIT O L UL 4 . INT RARI SI IE SIRI D ataO utputS tream writeBoolean writeByte writeChar writeDouble writeFloat writeInt writeLong writeShort writeUTF

A c e ste m e tod e au d e num irile g e ne ric e d e readXXX i w riteXXX, sp e c is c ate d e inte rfe te le DataInput i DataOutput i p ot p rov oc a e x c e p ii d e tip ul s s t IOException. D e num irile lor sunt sug e stiv e p e ntru tip ul d e d ate p e c are l p re luc re az . m ai p utin readUTF i w rite U T F c are se oc up c u ob ie c te d e tip a s a String, ind sing urul tip re fe rint p e rm is d e ac e ste c lase . a S c rie re a d ate lor folosind ux uri d e ac e st tip se fac e form at b inar, c e e a n c e am n c un ie r c are au fost sc rise inform atii folosind m e tod e nse a a s n writeXXX nu v a p ute a c itit d e c t p rin m e tod e readXXX. a T ransform are a une i v alori form at b inar se num e te seria liza re . Clase le n s DataInputStream i DataOutputStream p e rm it se rializ are a tip urilor p rim s itiv e i a irurilor d e c arac te re . S e rializ are a c e lorlalte tip uri re fe rint v a s s a fc ut p rin inte rm e d iul altor c lase , c um ar ObjectInputStream i a a s ObjectOutputStream (v e z i S e rializ are a ob ie c te lor ).

4 .3

Intr ri i ie iri form atate a s s

Inc e p nd c u v e rsiune a 1.5, lim b ajul J av a p une la d isp oz itii m od alit i sim a at p lic ate p e ntru a are a form atat a unor inform atii, re sp e c tiv p e ntru c itire a s a d e d ate form atate d e la tastatur. a

4 .3 .1

Intr ri form atate a

Clasa java.util.S canner ofe r o solutie sim p l p e ntru form atare a unor inform atii a a c itite d e p e un ux d e intrare e p e oc te i, e p e c arac te re , sau ch iar d intr-un t ob ie c t d e tip File. P e ntru a c iti d e la tastatur v om sp e c ic a c a arg um e nt a al c onstruc torului ux ul System.in:

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE Scanner s = Scanner.create(System.in); String nume = s.next(); int varsta = s.nextInt(); double salariu = s.nextDouble(); s.close();

111

4 .3 .2

Ie iri form atate s

Clase le PrintStream i PrintWriter p un la d isp oz itiile , p e l ng m e tod e le s a a print, println c are ofe re au p osib ilitate a d e a a a un ir d e c arac te re , i s s s m e tod e le form at, printf (e ch iv ale nte ) c e p e rm it a are a form atat a unor s a v ariab ile . System.out.printf("%s %8.2f %2d %n", nume, salariu, varsta); Form atare a irurilor d e c arac te re se b az e az p e c lasa java.util.F orm atter. s a

4 .4

F lux uri standard de intrare i ie ire s s

M e rg nd p e linia introd us d e siste m ul d e op e rare U N IX, oric e p rog ram J av a a a are : o intrare stand ard o ie ire stand ard s o ie ire stand ard p e ntru e rori s In g e ne ral, intrare a stand ard e ste tastatura iar ie ire a stand ard e ste e c ranul. s Intrare a i ie ire a stand ard sunt re p re z e ntate d e ob ie c te p re -c re ate c e s s d e sc riu ux uri d e d ate c are c om unic c u d isp oz itiv e le stand ard ale siste m ului. a A c e ste ob ie c te sunt d e nite p ub lic e c lasa System i sunt: n s S y stem .in - ux ul stand ar d e intrare , d e tip InputStream S y stem .out - ux ul stand ar d e ie ire , d e tip PrintStream s S y stem .err - ux ul stand ar p e ntru e rori, d e tip PrintStream

112

CAPIT O L UL 4 . INT RARI SI IE SIRI

4 .4 .1

A sarea inform atiilor pe ecran

A m v z ut d e ja num e roase e x e m p le d e utiliz are a ux ului stand ard d e ie ire , a s e l ind folosit la a are a oric ror re z ultate p e e c ran ( m od ul c onsola): s a n System.out.print (argument); System.out.println(argument); System.out.printf (format, argumente...); System.out.format (format, argumente...); Flux ul stand ard p e ntru a are a e rorilor se folose te sim ilar i ap are uz ual s s s se c v e nte le d e tratare a e x c e p iilor. Im p lic it, e ste ac e la i c u ux ul stand ard n t s d e ie ire . s catch(Exception e) { System.err.println("Exceptie:" + e); } Flux urile d e ie ire p ot folosite a ad ar fr p rob le m e d e oare c e tip ul lor s s aa e ste PrintStream, c las c onc re t p e ntru sc rie re a d ate lor. In sch im b , ux ul a a stand ard d e intrare System.out e ste d e tip InputStream, c are e ste o c las a ab strac t, d e c i p e ntru a-l p ute a utiliz a e c ie nt v a tre b ui sa-l folosim p re una a m c u un ux d e p roc e sare (ltrare ) c are s p e rm it c itire a fac il a d ate lor. a a a

4 .4 .2

Citirea datelor de la tastatur a

U z ual, v om d ori s folosim m e tod a readLine p e ntru c itire a d ate lor d e la a tastatura i d in ac e st m otiv v om folosi intrare a stand ard p re un c u o c las s m a a d e p roc e sare c are ofe r ac e ast m e tod . E x e m p lul tip ic e ste : a a a 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 tor e ste p re z e ntat un p rog ram c are a e az a liniile introa s d use d e la tastatur p n m om e ntul c are se introd uc e linia e x it sau a a a n n o linie v id i m e ntione az d ac irul re sp e c tiv re p re z int un num r sau nu. as a as a a

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE L isting 4.3: Citire a d ate lor d e la tastatur a
/* 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 ( Numb erFor matEx cepti on e ) { System . out . println ( " : NU " ) ; } } } catch ( IOException e ) { System . err . println ( " Eroare la intrarea standard ! " ) ; e . printStackTrace () ; } } }

113

Inc e p nd c u v e rsiune a 1.5, v arianta c e a m ai c om od d e c itire a d ate lor a a d e la tastatur e ste folosire a c lase i java.util.Scanner. a

4 .4 .3

R edirectarea ux urilor standard

R e d ire c tare a ux urilor stand ard p re sup une stab ilire a une i alte surse d e c t a tastatura p e ntru c itire a d ate lor, re sp e c tiv alte d e stinatii d e c t e c ranul p e ntru a c e le d ou ux uri d e ie ire . In c lasa System e x ist urm toare le m e tod e static e a s a a c are re aliz e az ac e st luc ru: a setIn(InputStream) - redirectare intrare setOut(PrintStream) - redirectare iesire setErr(PrintStream) - redirectare erori

114

CAPIT O L UL 4 . INT RARI SI IE SIRI

R e d ire c tare a ie irii e ste util sp e c ial atunc i c nd sunt a ate foarte m ulte s a n a s d ate p e e c ran. P ute m re d ire c ta asare a c tre un ie r p e c are s-l c itim d up a s a a e x e c utia p rog ram ului. S e c v e nta c lasic d e re d ire c tare a ie irii e ste c tre un a s a ie r e ste : s PrintStream fis = new PrintStream( new FileOutputStream("rezultate.txt"))); System.setOut(fis); R e d ire c tare a e rorilor ntr-un ie r p oate d e ase m e ne a util i se fac e s as ntr-o m anie r sim ilar: a a PrintStream fis = new PrintStream( new FileOutputStream("erori.txt"))); System.setErr(fis); R e d ire c tare a intrrii p oate folositoare p e ntru un p rog ram m od c ona n sol c are p rim e te m ai m ulte v alori d e intrare . P e ntru a nu le sc rie d e la a s tastatur d e e c are d at tim p ul te strii p rog ram ului, e le p ot p use a a n a ntrun ie r, re d ire c t nd intrare a stand ard c tre ac e l ie r. In m om e ntul c nd s a a s a te stare a p rog ram ului a luat sf rsit re d ire c tare a p oate e lim inat, d ate le ind a a c e rute d in nou d e la tastatur. a L isting 4.4: E x e m p lu d e folosire a re d ire c trii: a
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 ) ) ;

4 .4 . F L UX URI ST AND ARD D E INT RARE SI IE SIRE


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 () ; } } }

115

4 .4 .4

A naliz a lex ical pe ux uri (clasa StreamTokenizer) a

Clasa StreamTokenizer p roc e se az un ux d e intrare d e oric e tip i m p arte a s l atom i le x ic ali . R e z ultatul v a c onsta fap tul c loc s se c ite asc n n a n a a oc te i sau c arac te re , se v or c iti, p e r nd , atom ii le x ic ali ai ux ului re sp e c tiv . t a P rintr-un a to m lexica l se le g e g e ne ral: n]e n un id e ntic ator (un ir c are nu e ste s ntre g h ilim e le ) un num ar un ir d e c arac te re s un c om e ntariu un se p arator A tom ii le x ic ali sunt d e sp rtiti a ntre e i d e se p aratori. Im p lic it, ac e ti se p aras tori sunt c e i ob i nuti: sp atiu, tab , v irg ul, p unc t i v irg ula, e tc ., a p ot s a s ns sch im b ati p rin d iv e rse m e tod e ale c lase i. Construc torii c lase i sunt:

116

CAPIT O L UL 4 . INT RARI SI IE SIRI

public StreamTokenizer(Reader r) public StreamTokenizer(InputStream is) Id e ntic are a tip ului i v alorii unui atom le x ic al se fac e p rin inte rm e d iul s v ariab ile lor: a a s T T E O F - atom c e m arch e az sf ar itul ux ului T T E O L - atom c e m arch e az sf r itul une i linii a as T T N U M B E R - atom d e tip num r a T T W O R D - atom d e tip c uv nt a tty pe- tip ul ultim ului atom c itit d in ux nval- v aloare a unui atom num e ric sval - v aloare a unui atom d e tip c uv nt a Citire a atom ilor d in ux se fac e c u m e tod a nex tT ok en(), c are re turne z a tip ul atom ului le x ic al c itit i sc rie v ariab ile le nval sau sval v aloare a c ore s n sp unz atore atom ului. a E x e m p lul tip ic d e folosire a unui analiz or le x ic al e ste c itire a une i se c v e nte d e num e re i iruri a ate s s ntr-un ie r sau p rim ite d e la tastatur: s a L isting 4.5: Citire a unor atom i le x ic ali d intr-un sie 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

4 .5 . CL ASA RANDOMACCESFILE (F ISIE RE CU ACCE S D IRE CT )


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 } } }

117

A ad ar, m od ul d e utiliz are tip ic p e ntru un analiz or le x ic al e ste s ntr-o b uc la w h ile , c are se c ite sc atom ii unul c te unul c u m e tod a nextToken, n a p na se ajung e la sf rsitul ux ului (TT EOF). In c ad rul b uc le i w h ile se d e te ra a m in tip ul atom ul c ure nt c ure nt ( a ntors d e m e tod a nextToken) i ap oi se a s a v aloare a num e ric sau irul d e c arac te re c ore sp unz tor atom ului re sp e c tiv . a s a In c az ul c are tip ul atom ilor nu ne inte re se az , e ste m ai sim p lu s n a a c itim ux ul linie c u linie i s folosim c lasa StringTokenizer, c are re aliz e az s a a p rtire a unui ir d e c arac te re atom i le x ic ali, sau m e tod a split a c lase i m a s n String.

4 .5

Clasa RandomAccesFile ( iere cu acces dis rect)

D up c um am v z ut, ux urile sunt p roc e se se c v e ntiale d e intrare / ie ire . a a s A c e ste a sunt ad e c v ate p e ntru luc rul c u m e d ii se c v e ntiale d e m e m orare a d ate lor, c um ar b and a m ag ne tic sau p e ntru transm ite re a inform atiilor a p rin re e a, d e si sunt foarte utile i p e ntru d isp oz itiv e c are inform atia p oate t s n ac c e sat d ire c t. a Clasa RandomAccesFile are urm toare le c arac te ristic i: a p e rm ite ac c e sul ne se c v e ntial (d ire c t) la c ontinutul unui ie r; s e ste o c las d e sine stttoare , sub c las d ire c t a c lase i Object; a aa a a se g se te p ach e tul java.io; a s n

118

CAPIT O L UL 4 . INT RARI SI IE SIRI

im p le m e nte az inte rfe e le DataInput i DataOutput, c e e a c e am na a t s nse c a sunt d isp onib ile m e tod e d e tip ul readXXX, writeXXX, ntoc m ai c a la c lase le DataInputStream i DataOutputStream; s p e rm ite at t c itire a c t i sc rie re d in/ in ie re c u ac c e s d ire c t; a a s s p e rm ite sp e c ic are a m od ului d e ac c e s al unui ie r (re ad -only , re ad s w rite ). Construc torii ac e ste i c lase sunt: RandomAccessFile(StringnumeFisier, StringmodAcces) throws IOException RandomAccessFile(StringnumeFisier, StringmodAcces) throws IOException und e m od A cces p oate : r - ie rul e ste d e sch is num ai p e ntru c itire (re ad -only ) s rw - ie rul e ste d e sch is p e ntru c itire i sc rie re (re ad -w rite ) s s 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 ort notiune a d e p o in ter d e ier. A c e sta e ste a s un ind ic ator c e sp e c ic p oz itia c ure nt ie r. L a d e sch id e re a unui ie r a a n s s p ointe rul are v aloare a 0, ind ic nd e p utul ie rului. A p e luri la m e tod e le a nc s d e c itire / sc rire re d e p lase az p ointe rul ie rului c u num rul d e oc te i c ititi a s a t sau sc ri i d e m e tod e le re sp e c tiv e . s In p lus fatd e m e tod e le d e tip read i write c lasa p une la d isp oz itie i a s s m e tod e p e ntru c ontrolul p oz itie i p ointe rului d e ie r. A c e ste a sunt: s skipBytes - m ut p ointe rul ie rului a s nainte c u un num r sp e c ic at d e a oc te i t seek - p oz itione az a p ointe rului ie rului s nainte a unui oc te t sp e c ic at getFilePointer - re turne az p oz itia p ointe rului d e ie r. a s

4 .6 . CL ASA FILE

119

4 .6

Clasa File

Clasa File nu se re fe r d oar la un ie r c i p oate re p re z e nta e un ie r a s s anum e , e m ultim e a ie re lor d intr-un d ire c tor. s S p e c ic are a unui ie r/ d ire c tor se fac e p rin sp e c ic are a c ii ab solute sp re s a ac e l ie r sau a c ii re lativ e fat d e d ire c torul c ure nt. A c e ste a tre b uie s re s a a a sp e c te c onv e ntiile d e sp e c ic are a c ilor i num e lor ie re lor d e p e p latform a a s s d e luc ru. U tilitate c lase i File c onst furniz are a une i m od alit i d e a ab strac tiz a a n at d e p e nd e nte le c ailor i num e lor ie re lor fatd e m a ina g az d , p re c um i s s a s a s p une re a la d isp oz itie a unor m e tod e p e ntru luc rul c u se re i d ire c toare la s niv e lul siste m ului d e op e rare . A stfe l, ac e ast c las v om g si m e tod e p e ntru te stare a e x iste nte i, te rg e re a, n a a a s re d e num ire a unui ie r sau d ire c tor, c re are a unui d ire c tor, listare a ie re lor s s d intr-un d ire c tor, e tc . T re b uie m e ntionat i fap tul c m ajoritate a c onstruc torilor ux urilor c are s a p e rm it ac c e sul la ie re ac c e p t c a arg um e nt un ob ie c t d e tip File loc ul s a n unui ir c e re p re z int num e le ie rului re sp e c tiv . s a s File f = new File("fisier.txt"); FileInputStream in = new FileInputStream(f) Ce l m ai uz ual c onstruc tor 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 e num iri sug e stiv e i v or s p re z e ntate p rin inte rm e d iul e x e m p lului urm tor c are liste az ie re le i sub a a s s d ire c toare le unui d ire c tor sp e c ic at i, p e ntru e c are d in e le a e az d iv e rse s s a inform atii: L isting 4.6: L istare a c ontinutului 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 .*;

120
import java . util .*; public class ListareDirector {

CAPIT O L UL 4 . INT RARI SI IE SIRI

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 () ; } } }

Capitolul 5 Interfete
5 .1
5 .1.1

Introducere
Ce este o interfat ? a

Inte rfe e le d uc c onc e p tul d e c las ab strac t c u un p as t a a nainte p rin e lim inare a oric ror im p le m e ntri d e m e tod e , p un nd p rac tic unul d in c onc e p te le a a a n a p rog ram rii orie ntate ob ie c t i anum e c e l d e se p arare a m od e lului unui ob ie c t a s (inte rfat) d e im p le m e ntare a sa. A ad ar, o inte rfat p oate p riv ita c a un a s a p ro to co l d e co m u n ica re ntre ob ie c te . O inte rfat J av a d e ne te un se t d e m e tod e d ar nu sp e c ic nic i o im p le a s a m e ntare p e ntru e le . O c las c are im p le m e nte az o inte rfat tre b uie ob lig atoa a a riu s sp e c ic e im p le m e ntri p e ntru toate m e tod e le inte rfe e i, sup un nd u-se a a t a a ad ar unui anum it c om p ortam e nt. s D e nitie O in terfa e ste o c ole c ie d e m e tod e fr im p le m e ntare i d e c laratii d e ta t aa s c onstante . Inte rfe e le p e rm it, alturi d e c lase , d e nire a unor noi tip uri d e d ate . t a 121

122

CAPIT O L UL 5 . INT E RF E T E

5 .2
5 .2 .1

F olosirea interfetelor
D e nirea unei interfete

D e nire a une i inte rfe e se fac e p rin inte rm e d iul c uv ntului ch e ie interface: t a [public] interface NumeInterfata [extends SuperInterfata1, SuperInterfata2...] { /* Corpul interfetei: Declaratii de constane Declaratii de metode abstracte */ } O inte rfat p oate av e a un sing ur m od ic ator i anum e public. O inte rfat a s a p ub lic e ste ac c e sib il tuturor c lase lor, ind ife re nt d e p ach e tul d in c are fac a a p arte , im p lic it niv e lul d e ac c e s ind d oar la niv e lul p ach e tului d in c are fac e p arte inte rfata. O inte rfat p oate e x tind e oric te inte rfe e . A c e ste a se num e sc su p erin terfete a a t i sunt se p arate p rin v irg ul. (v e z i M o te nire a m ultip l p rin inte rm e d iul s a s a inte rfe e lor ). t Corp ul une i inte rfe e p oate c ontine : t constante: ac e ste a p ot sau nu d e c larate c u m od ic atorii public, static i final c are sunt im p lic iti, nic i un alt m od ic ator ne p ut nd s a ap re a d e c laratia une i v ariab ile d intr-o inte rfat. Constante le une i a n a inte rfe e tre b uie ob lig atoriu initializ ate . t 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 }

5 .2 . F O L O SIRE A INT E RF E T E L O R

123

m etode f r im plem entare: ac e ste a p ot sau nu d e c larate c u m od a a ic atorul public, c are e ste im p lic it; nic i un alt m od ic ator nu p oate ap re a d e c laratia une i m e tod e a une i inte rfe e . a n t interface Exemplu { void metoda(); // Echivalent cu: public void metoda(); protected void metoda2(); // Incorect, modificator nepermis

A tentie V ariab ile le une i inte rfe e sunt im p lic it p ub lic e ch iar d ac nu sunt d e c larate t a c u m od ic atorul public. V ariab ile le une i inte rfe e sunt im p lic it c onstante ch iar d ac nu sunt t a d e c larate c u m od ic atorii static i final. s M e tod e le une i inte rfe e sunt im p lic it p ub lic e ch iar d ac nu sunt d e c larate t a c u m od ic atorul public. In v ariante le m ai v e ch i d e J av a e ra p e rm is i m od ic atorul abstract s d e c laratia inte rfe e i i d e c laratiile m e tod e lor, a ac e st luc ru nu n t s n ns m ai e ste v alab il, d e oare c e at t inte rfata c t i m e tod e le sale nu p ot a a s altfe l d e c t ab strac te . a

5 .2 .2

Im plem entarea unei interfete

Im p le m e ntare a une ia sau m ai m ultor inte rfe e d e c tre o c las se fac e p rin t a a inte rm e d iul c uv ntului ch e ie im plem ents: a class NumeClasa implements NumeInterfata sau class NumeClasa implements Interfata1, Interfata2, ...

124

CAPIT O L UL 5 . INT E RF E T E

O c las p oate im p le m e nta oric te inte rfe e sau p oate s nu im p le m e nte z e a a t a nic i una. In c az ul c are o c las im p le m e nte az o anum it inte rfat, atunc i tre n a a a a b uie ob lig atoriu s sp e c ic e c od p e ntru toate m e tod e le inte rfe e i. D in ac e st a t m otiv , od at c re ata i folosit la im p le m e ntare a unor c lase , o inte rfat nu a s a a m ai tre b uie m od ic at, se nsul c ad ug are a unor m e tod e noi sau sch im a n a a b are a sig naturii m e tod e lor e x iste nte v or d uc e la e rori c om p ilare a c lase lor n c are o im p le m e nte az . E v id e nt, o c las p oate av e a i alte m e tod e i v ariab ile a a s s m e m b re afar d e c e le d e nite inte rfat. n a n a

A tentie M od ic are a une i inte rfe e im p lic m od ic are a tuturor c lase lor c are im t a p le m e nte az ac e a inte rfat. a a

O inte rfat nu e ste o c las, d ar oric e re fe rint d e tip inte rfat p oate p rim i a a a a c a v aloare o re fe rinta la un ob ie c t al une i c lase c e im p le m e nte az inte rfata a re sp e c tiv . D in ac e st m otiv , inte rfe e le p ot p riv ite c a tip uri d e d ate i v om a t s sp une ad e se a c un ob ie c t are tip ul X, und e X e ste o inte rfat, d ac ac e sta a a a e ste o instant a une i c lase c e im p le m e nte az inte rfata X. a a Im p le m e ntare a une i inte rfe e p oate s e i o c las ab strac t. t a s a a

5 .2 .3

E x em plu: im plem entarea unei stive

S c onsid e rm urm torul e x e m p lu. D orim s im p le m e ntm un nou tip d e a a a a a d ate num it S ta ck , c are s m od e le z e notiune a d e stiv d e ob ie c te . Ob ie c te le a a d e tip stiv , ind ife re nt d e im p le m e ntare a lor, v or tre b ui s c ontin m e tod e le : a a a push - ad aug un nou e le m e nt in stv a a pop - e lim in e le m e ntul d in v rful stiv e i a a peek - re turne az v arful stiv e i a empty - te ste az d ac stiv a e ste v id a a a toString - re turne az c ontinutul stiv e i sub form a unui ir d e c arac te re . a s

5 .2 . F O L O SIRE A INT E RF E T E L O R

125

D in p unc tul d e v e d e re al struc turii inte rne , o stiv p oate im p le m e ntat a a folosind un v e c tor sau o list antuit, am b e le solutii av nd av antaje i a nl a a s d e z av antaje . P rim a solutie e ste m ai sim p lu d e e le s, tim p c e a d oua e ste nt n m ai e c ie nt d in p unc tul d e v e d e re al folosirii m e m orie i. D e oare c e nu d orim a s le g m tip ul d e d ate S ta ck d e o anum it im p le m e ntare struc tural, v om a a a a l d e ni p rin inte rm e d iul une i inte rfe e . V om v e d e a im e d iat av antaje le ac e ste i t ab ord ri. a L isting 5.1: Inte rfata 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 e ntru a trata situatiile anorm ale c are p ot ap re a atunc i c nd e rc m a a nc a s p une m un e le m e nt stiv i nu e ste p osib il d in lip s d e m e m orie , sau a n a s a e rc m s ac c e sm v rful stiv e i i ac e asta e ste v id , v om d e ni o e x c e p ie nc a a a a s a t p rop rie StackException: L isting 5.2: T ip ul d e e x c e p ie g e ne rat d e stiv t a
public class StackException extends Exception { public StackException () { super () ; } public StackException ( String msg ) { super ( msg ) ; } }

D m c ontinuare p rim a im p le m e ntare a stiv e i, folosind un v e c tor: a n L isting 5.3: Im p le m e ntare a stiv e i folosind un v e c tor
// Implementarea stivei folosind un vector de obiecte . public class StackImpl1 implements Stack { private Object items []; // Vectorul ce contine obiectele

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 arc ati c , d e i inte rfat m e tod e le nu sunt d e c larate e x p lic it c u a s n a m od ic atorul public, e le sunt totu i p ub lic e i tre b uie d e c larate c a atare s s n c las. a T re b uie re m arc at i fap tul c m e tod a toString e ste d e nit d e ja c lasa s a a n Object, d e c i c lasa noastr o are d e ja im p le m e ntat i nu am ob inut nic i a as t o e roare la c om p ilare d ac nu o im p le m e ntam e x p lic it. Ce e a c e fac e m ac um a e ste d e fap t sup rad e nire a e i.

5 .2 . F O L O SIRE A INT E RF E T E L O R

127

O alt ob se rv atie im p ortant se re fe r la fap tul c tre b uie s d e c larm a a a a a a n c ad rul inte rfe e i i e x c e p iile arunc ate d e m e tod e , c e tre b uie ob lig atoriu t s t tratate . S v e d e m ac um m od alitate a d e im p le m e ntare a stiv e i folosind o list a a antuit: nl a L isting 5.4: Im p le m e ntare a stiv e i folosind o list a
// 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 ) {

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 se rv atie p e c are o fac e m aic i e ste c , d e i m e tod a push d in a s inte rfat d e c lar arunc are a unor e x c e p ii d e tip ul StackException, nu e ste a a t ob lig atoriu c a m e tod a d in c las s sp e c ic e i e a ac e st luc ru, at t tim p c t a a s a a nu g e ne re az e x c e p ii d e ac e l tip . Inv e rs e ste a ob lig atoriu. a t ns In c ontinuare e ste p re z e ntat o m ic ap lic atie d e m onstrativ c are folose te a a a s tip ul d e d ate nou c re at i c e le d ou im p le m e ntri ale sale : s a a L isting 5.5: Folosire a 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 se rv ati folosire a inte rfe e i Stack c a un tip d e d ate , c e ad uc e e x ib ilitate t sp orit m ane v rare a c lase lor c e im p le m e nte az tip ul re sp e c tiv . M e tod a a n a

5 .3 . INT E RF E T E SI CL ASE AB ST RACT E

129

afiseaza ac c e p t c a arg um e nt oric e ob ie c t al une i c lase c e im p le m e nte az a a Stack. O b servatie In p ach e tul java.util e x ist c lasa Stack c are m od e le az notiune d e stiv a a a d e ob ie c te i, e v id e nt, ac e asta v a folosit ap lic atiile c e au ne v oie d e ac e st s a n tip d e d ate . E x e m p lu ofe rit d e noi nu are le g tur c u ac e ast c las i are rol a a a as p ur d e m onstrativ .

5 .3

Interfete i clase ab stracte s

L a p rim a v e d e re o inte rfat nu e ste altc e v a d e c t o c las ab strac t c are a a a a n toate m e tod e le sunt ab strac te (nu au nic i o im p le m e ntare ). A ad ar, o cla s a bstra ct n u a r p u tea n lo cu i o in terfa ? s a a ta R asp unsul la intre b are d e p ind e d e situatie , a g e ne ral e ste N u . ns n D e ose b ire a c onst fap tul c une le c lase sunt fortate s e x tind o anum it a n a a a a c las (d e e x e m p lu oric e ap p le t tre b uie s e sub c lasa a c lase i Applet) i nu ar a a s m ai p ute a sa e x tind o alt c las, d e oare c e J av a nu e x ista d e c t m o te nire a a a n a s sim p la. Fara folosire a inte rfe e lor nu am p ute a forta c lasa re sp e c tiv s t a a re sp e c te d iv e rse tip uri d e p rotoc oale . L a niv e l c onc e p tual, d ife re nta c onst a n: e x tind e re a une i c lase ab strac te forte az o re latie a ntre c lase ; im p le m e ntare a une i inte rfe e sp e c ic d oar ne c e sitate a im p le m e ntrii t a a unor anum ie m e tod e . In m ulte situatii inte rfe e le i c lase le ab strac te sunt folosite p re un t s m a p e ntru a im p le m e nta c t m ai e x ib il i e c ie nt o anum it ie rarh ie d e c lase . U n a s a e x e m p lu sug e stiv e ste d at d e c lase le c e d e sc riu c ole c ii. Ca sa p artic ulariz m , t a e x ist: a inte rfata L ist c are im p une p rotoc olul p e c are tre b uie s re sp e c te o a l c las d e tip list, a a c lasa ab strac t A b stractL ist c are im p le m e nte az inte rfata List i a a s ofe r im p le m e ntri c onc re te p e ntru m e tod e le c om une tuturor tip urilor a a d e list, a

130

CAPIT O L UL 5 . INT E RF E T E

c lase c onc re te , c um ar L ink edL ist, A rray L ist c are e x tind AbstractList.

5 .4

M o tenire m ultipl prin interfete s a

Inte rfe e le nu au nic i o im p le m e ntare i nu p ot instantiate . D in ac e st m otiv , t s nu re p re z int nic i o p rob le m c a anum ite c lase s im p le m e nte z e m ai m ulte a a a inte rfe e sau c a o inte rfat s e x tind m ai m ulte inte rfe e (s aib m ai m ulte t a a a t a a sup e rinte rfe e ) t class NumeClasa implements Interfata1, Interfata2, ... interface NumeInterfata extends Interfata1, Interfata2, ... O inte rfat m oste ne ste at t c onstante le c t i d e c laratiile d e m e tod e d e la a a a s sup e rinte rfe e le sale . O c las m o te ne ste d oar c onstante le une i inte rfe e i t a s t s re sp onsab ilitate a im p le m e ntrii m e tod e lor sale . a S c onsid e rm un e x e m p lu d e c lasa c are im p le m e nte az a m ai m ulte inte rfe e : a a t 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 inte rfat c are e x tind e m ai m ulte inte rfe e : a t interface Monstru { void ameninta(); } interface MonstruPericulos extends Monstru { void distruge();

5 .4 . M O ST E NIRE M UL T IPL A PRIN INT E RF E T E } interface Mortal { void omoara(); } interface Vampir extends void beaSange(); } class Dracula implements public void ameninta() public void distruge() public void omoara()() public void beaSange() }

131

MonstruPericulos, Mortal {

Vampir { {} {} {} {}

E v id e nt, p ot ap re a situatii d e am b ig uitate , atunc i c nd e x ist c onstante a a a sau m e tod e c u ac e le a i num e m ai m ulte inte rfe e , a ac e st luc ru tre b uie s n t ns ntotd e auna e v itat, d e oare c e sc rie re a unui c od c are p oate c onfuz e ste un stil p rost d e p rog ram are . In c az ul in c are ac e st luc ru se am p l, c om p ilatorul nt a nu v a furniz a e roare d e c t d ac se e arc re fe rire a c onstante lor am b ig ue a a nc a fr a le p re x a c u num e le inte rfe e i sau d ac m e tod e le c u ac e la i num e nu aa t a s p ot d e osb ite , c um ar situatia c nd au ac e e a i list d e arg um e nte d ar a s a tip uri re turnate inc om p atib ile . interface I1 { int x=1; void metoda(); } interface I2 { int x=2; void metoda(); //int metoda(); }

//corect //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

132 } }

CAPIT O L UL 5 . INT E RF E T E

S re c ap itulm c te v a luc ruri le g ate d e c lase i inte rfe e : a a a s t O c las nu p oate av e a d e c t o sup e rc las. a a a O c las p oate im p le m e nta oric te inte rfe e . a a t O c las tre b uie ob lig atoriu s trate z e m e tod e le d in inte rfe e le p e c are a a t la im p le m e nte az . a Ie rarh ia inte rfe e lor e ste ind e p e nd e nt d e ie rarh ia c lase lor c are le im t a p le m e nte az . a

5 .5

U tilitatea interfetelor

D up c um am v z ut, o inte rfat d e ne te un p rotoc ol c e p oate im p le m e ntat a a a s d e oric e c las, ind ife re nt d e ie rarh ia d e c lase d in c are fac e p arte . Inte rfe e le a t sunt utile p e ntru: d e nire a unor sim ilaritati ntre c lase ind e p e nd e nte fr a forta artic ial aa o le g atur a ntre e le ; asig ur c toate c lase le c are im p le m e nte az o inte rfat p un la d ip oz itie a a a a m e tod e le sp e c ic ate inte rfat - d e aic i re z ult p osib ilitate a im p le n a a m e ntrii unor c lase p rin m ai m ulte m od alit i i folosire a lor a at s ntr-o m anie r unitar; a a d e nire a unor g rup uri d e c onstante ; transm ite re a m e tod e lor c a p aram e tri;

5 .5 .1

Crearea g rupurilor de constante

D e oare c e oric e v ariab il a une i inte rfe e e ste im p lic it d e c larat c u public, a t a static si final, inte rfe e le re p re z int o m e tod c onv e nab il d e c re are a unor t a a a g rup uri d e c onstante c are s e folosite g lob al a ntr-o ap lic atie :

5 .5 . UT IL IT AT E A INT E RF E T E L O R public interface Luni { int IAN=1, FEB=2, ..., DEC=12; } Folosire a ac e stor c onstante se fac e p rin e x p re sii d e g e nul NumeInterfata.constanta, c a e x e m p lul d e m ai jos: n if (luna < Luni.DEC) luna ++ else luna = Luni.IAN;

133

5 .5 .2

T ransm iterea m etodelor ca param etri

D e oare c e nu e x ist p ointe ri p rop riu-z i i, transm ite re a m e tod e lor c a p aram e tri a s e ste re aliz at J av a p rin inte rm e d iul inte rfe e lor. A tunc i c nd o m e tod a n t a a tre b uie s p rim e asc c a arg um e nt d e intrare o re fe rint la o alt func ie a a a a t ne c e sar e x e c utie i sale , c unosc ut d oar la m om e ntul e x e c utie i, atunc i arg ua a m e ntul re sp e c tiv v a d e c larat d e tip ul une i inte rfe e c are c ontine m e tod a t re sp e c tiv . L a e x e c utie m e tod a v a p ute a p rim i c a p aram e tru oric e ob ie c t c e a im p le m e nte az inte rfata re sp e c tiv i d e c i c ontine i c od ul func ie i re sp e c tiv e , a as s t ac e asta urm nd s e ap e lat norm al p e ntru a ob ine re z ultatul d orit. a a a t A c e ast te h nic , d e num it i ca ll-ba ck , e ste e x tre m d e folosit J av a a a a s a n i tre b uie ne ap rat e le as. S c onsid e rm m ai m ulte e x e m p le p e ntru a s a nt a a a c laric a luc rurile . P rim ul e x e m p lu se re fe r la e x p lorare a nod urilor unui g raf. In e c are a nod tre b uie s se e x e c ute p re luc rare a inform atie i d in nod ul re sp e c tiv p rin a inte rm e d iul une i func ii p rim ite c a p aram e tru. P e ntru ac e asta, v om d e ni o t inte rfat Functie c are v a sp e c ic a m e tod a trim is c a p aram e tru. a a interface Functie { public void executa(Nod u); } class Graf { //... void explorare(Functie f) { //...

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 oile a x e m p lu v a p re z e ntat se c iune a urm toare , n t a ntruc t fac e a p arte d in A P I-ul stand ard J av a i v or p use e v id e nt, p rin inte rm e d iul s n a su, i alte te h nic i d e p rog ram are . a s

5 .6

Interfata FilenameFilter

Instante le c lase lor c e im p le m e nte az ac e asta inte rfat sunt folosite p e ntru a a a c re a ltre p e ntru ie re i sunt p rim ite c a arg um e nte d e m e tod e c are liste az s s a c ontinutul unui d ire c tor, c um ar m e tod a list a c lase i File. A ad ar, p ute m sp une c m e tod a list p rim e te c a arg um e nt o alt func ie s a s a t c are sp e c ic d ac un ie r v a re turnat sau nu (c rite riul d e ltrare ). a a s

5 .6 . INT E RF AT A FILENAMEFILTER

135

Inte rfata FilenameFilter are o sing ur m e tod : accept c are sp e c ic a a a c rite riul d e ltrare i anum e , te ste az d ac num e le ie rului p rim it c a p aras a a s m e tru e p line te c ond itiile d orite d e noi. nd s D e nitia inte rfe e i e ste : t public interface FilenameFilter { public boolean accept(File dir, String numeFisier); } A ad ar, oric e c las d e sp e c ic are a unui ltru c are im p le m e nte z inte rfata s a a FilenameFilter tre b uie s im p le m e nte z e m e tod a accept a ac e ste i inte rfe e . a t A c e ste c lase m ai p ot av e a i alte m e tod e , d e e x e m p lu un c onstruc tor c are s s a p rim e asc a c rite riul d e ltrare . In g e ne ral, o c las d e sp e c ic are a unui ltru a are urm torul form at: a 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 uz uale ale c lase i String folosite p e ntru ltrare a ie re lor s sunt: endsW ith - te ste az d ac un ir are o anum it te rm inatie a a s a index O f - te ste az d ac un ir c ontine un anum it sub ir, re turn nd a a s s a p oz itia ac e stuia, sau 0 c az c ontrar. n

136

CAPIT O L UL 5 . INT E RF E T E

Instante le c lase lor p e ntru ltrare sunt p rim ite c a arg um e nte d e m e tod e d e listare a c ontinutului unui d ire c tor. O astfe l d e m e tod e ste list d in a c lasa File: String[] list (FilenameFilter filtru) Ob se rv ati c aic i inte rfata e ste folosit c a un tip d e d ate , e a ind sub stia a tuit c u oric e c las c are o im p le m e nte az . A c e sta e ste un e x e m p lu tip ic d e a a a transm ite re a une i func ii (func ia d e ltrare accept) c a arg um e nt al une i t t m e tod e . S c onsid e rm e x e m p lul c om p le t c are d orim s listm ie re le d in d ia a n a a s re c torul c ure nt c are au o anum it e x te nsie . a L isting 5.6: L istare a ie re lor c u o anum it e x te nsie s a
/* 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 ;

5 .6 . INT E RF AT A FILENAMEFILTER
} public boolean accept ( File dir , String nume ) { return ( nume . endsWith ( " . " + extensie ) ) ; } }

137

5 .6 .1

F olosirea claselor anonim e

In c az ul c are nu av e m ne v oie d e c lasa c are re p re z int ltrul p e ntru listare a n a ie re lor d intr-un d ire c tor d e c t o sing ur d at, p e ntru a e v ita c re are a une i s a a a noi c lase d e sine stttoare c are s e folosit p e ntru instantie re a unui sing ur aa a a ob ie c t, p ute m folosi c las inte rn anonim , ac e ast situatie ind un e x e m p lu a a a a tip ic d e folosire a ac e stora. L isting 5.7: Folosire a 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 () ; }

138
} }

CAPIT O L UL 5 . INT E RF E T E

A ad ar, o m od alitate uz ual d e folosire a c lase lor anonim e p e ntru instantie re a s a unui ob ie c t c are tre b uie s re sp e c te o inte rfat e ste : a a metoda(new Interfata() { // Implementarea metodelor interfetei });

5 .7

Com pararea ob iectelor

A m v z ut p rim ul c ap itol c o solutie fac il i e c ie nt d e sortare a unui a n a as a v e c tor e ste folosire a m e tod 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 c az ul c are e le m e nte le d in v e c tor sunt d e tip p rim itiv , c a in e x e m n p lul d e m ai sus, nu e x ist nic i o p rob le m a d e te rm ina ord ine a re asc a a n a a e le m e nte lor. Ce se am p l a atunc i c nd v e c torul c ontine re fe rinte la nt a ns a ob ie c te d e un anum it tip ? S c onsid e rm urm torul e x e m p lu, c are d orim a a a n s sortm un v e c tor form at d in instante ale c lase i Persoana, d e nit m ai jos: a a a L isting 5.8: Clasa P e rsoana (fr sup ort p e ntru c om p arare ) aa
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 ; } }

5 .7 . CO M PARARE A O B IE CT E L O R P rog ram ul urm tor ar tre b ui s sorte z e un v e c tor d e p e rsoane : a a L isting 5.9: S ortare a unui v e c tor d e tip re fe rint a
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 ]) ; } }

139

L a e x e c utia ac e ste i ap lic atii v a ob inut o e x c e p ie , d e oare c e m e tod a t a t sort nu tie c are e ste ord ine a natural a ob ie c te lor d e tip Persoana. V a s a tre b ui, ntr-un fe l sau altul, s sp e c ic m ac e st luc ru. a a

5 .7 .1

Interfata Comparable

Inte rfata Comparable im p une o ord ine total asup ra ob ie c te lor une i c lase c e a o im p le m e nte az . A c e ast ord ine se num e te o rd in ea n a tu ra l a c lase i i e ste a a s a s sp e c ic at p rin inte rm e d iul m e tod e i com pareT o. D e nitia inte rfe e i e ste : a t public interface Comparable { int compareTo(Object o); } A ad ar, o c las ale c re i instante tre b uie s e c om p arab il v a im p le m e nta s a a a m e tod a compareTo c are tre b uie s re turne z e : a o valoare strict neg ativ : d ac ob ie c tul c ure nt (this) e ste m ai m ic a a d e c ob ie c tul p rim it c a arg um e nt; a z ero: d ac ob ie c tul c ure nt e ste ega l d e c ob ie c tul p rim it c a arg um e nt; a a

140

CAPIT O L UL 5 . INT E RF E T E

o valoare strict poz itiv : d ac ob ie c tul c ure nt e ste m ai m a re d e c a a a ob ie c tul p rim it c a arg um e nt. R e am intim c m e tod a equals, m o te nit d in Object d e toate c lase le , a s a d e te rm in d ac d ou ob ie c te sunt e g ale (au ac e e a i v aloare ). S p une m c a a a s a ord ine a natural a une i c lase C e ste co n siten t c u equals d ac i num ai a a a s d ac (e1.compareTo((Object)e2) == 0) are ac e e as i v aloare log ic c u a s a e1.equals((Object)e2, p e ntru oric e e1, e2 instante ale lui C. null nu e ste instant a nic i une i c lase i e.compareTo(null) tre b uie s a s a arunc e o e x c e p ie d e tip NullPointerException ch iar d ac e.equals(null) t a re turne az false. a S p re sup une m c d orim c a ord ine a natural a p e rsoane lor s e d up a a a a a c od ul lor inte rn. L isting 5.10: Clasa P e rsoana c u sup ort p e ntru c om 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 ;

5 .7 . CO M PARARE A O B IE CT E L O R
return ( cod - p . cod ) ; } }

141

Ob se rv ati folosire a op e ratorului instanceof, c are v e ric d ac un ob ie c t a a e ste instant a une i anum ite c lase . M e tod a compareTo v a arunc a o e x c e p ie a t d e tip ul ClassCastException d ac se e arc c om p arare a unui ob ie c t d e a nc a tip Persoana c u un ob ie c t d e alt tip . M e tod a equals v a re turna, p ur i s sim p lu, false.

5 .7 .2

Interfata Comparator

In c az ul c are d orim s sortm e le m e nte le unui v e c tor c e c ontine re fe rinte n a a d up alt c rite riu d e c t ord ine a natural a e le m e ne te lor, av e m ne v oie d e o alt a a a a solutie . A c e asta e ste ofe rit tot d e m e tod a sort d in c lasa java.util.Arrays, a d ar v arianta c are , p e l ng v e c torul c e tre b uie sortat, v om transm ite n n a a un arg um e nt d e tip Comparator c are s sp e c ic e m od alitate a d e c om p arare a a e le m e nte lor. Inte rfata java.util.Comparator c ontine m e tod a com pare, c are im p une o ord ine total asup ra e le m e nte lor une i c ole c ii. A c e asta re turne az un a t a ntre g c u ac e e a i se m nic atie c a la m e tod a compareTo a inte rfe e i Comparator i s t s are urm toare a d e nitie : int compare(Object o1, Object o2); a S p re sup une m c d orim s sortm p e rsoane le ord onate d up num e le lor. a a a a a P e ntru d e nire a c om p aratorului v om folosi o c las anonim . a a L isting 5.11: S ortare a unui v e c tor folosind un c om 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 ) ) ;

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 se rv ati c um c om p arare a a d ou iruri d e c arac te re se fac e tot c u m e tod a as compareTo, c lasa String im p le m e n nd inte rfata Comparable. a

5 .8

A daptori

In c az ul c are o inte rfat c ontine m ai m ulte m e tod e i, la un m om e nt n a s d at, av e m ne v oie d e un ob ie c t c are im p le m e nte az inte rfata re sp e c tiv d ar nu a sp e c ic c od d e c t p e ntru o sing ur m e tod , e l tre b ui totu i s im p le m e nte z e a a a a s a toate m e tod e le inte rfe e i, ch iar d ac nu sp e c ic nic i un c od . t a a 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() {}

5 .8 . AD APT O RI });

143

A c e ast ab ord are p oate ne p lc ut d ac av e m fre c v e nt ne v oie d e ob ie c te a a a a ale unor c lase c e im p le m e nte az inte rfata X. S olutia la ac e ast p rob le m e ste a a a folosire a adaptorilor. D e nitie U n a d a p to r e ste o c las ab strac t c are im p le m e nte az o anum it inte rfat a a a a a fr a sp e c ic a c od nic i une i m e tod e a inte rfe e i. aa t

public abstract class XAdapter implements X { public void metoda_1() {} public void metoda_2() {} ... public void metoda_n() {} } In situatia c nd av e m ne v oie d e un ob ie c t d e tip X v om folosi c lasa a ab strac t, sup rad e nind d oar m e tod a c are ne inte re se az : a 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 d ate c ap itolul Inte rfata n g rac c u utiliz atorul . a

144

CAPIT O L UL 5 . INT E RF E T E

Capitolul 6 O rg aniz area claselor


6 .1 P ach ete

D e nitie U n p a ch et e ste o c ole c ie d e c lase i inte rfe e t s t nrud ite d in p unc tul d e v e d e re al func ionalit ii lor. S unt folosite p e ntru g sire a i utiliz are a m ai t at a s u oar a c lase lor, p e ntru a e v ita c on ic te le d e num e i p e ntru a c ontrola s a s ac c e sul la anum ite c lase . In alte lim b aje d e p rog ram are p ach e te le se m ai num e sc lib rrii sau b ib iliote c i. a

6 .1.1

P ach etele standard (J2 S D K )

P latform a stand ard d e luc ru J av a se b az e az p e o se rie d e p ach e te c u ajutorul a c rora se p ot c onstrui a ntr-o m anie r sim p lic at ap lic atiile . E x ist d e c i un a a a se t d e c lase d e ja im p le m e ntate c are m od e le az struc turi d e d ate , alg oritm i sau a d iv e rse notiuni e se ntiale d e z v oltare a unui p rog ram . Ce le m ai im p ortante n p ach e te i sup ortul ofe rit d e lor sunt: s java.lang - c lase le d e b az ale lim b ajului J av a a java.io - intrri/ ie iri, luc rul c u ie re a s s java.util - c lase i inte rfe e utile s t java.applet - d e z v oltare a d e ap p le turi 145

146

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

java.aw t - inte rfata g rac c u utiliz atorul a java.aw t.event - m e c anism e le d e tratare e e v e nim e nte lor g e ne rate d e utiliz ator java.b eans - sc rie re a d e c om p one nte re utiliz ab ile java.net - p rog ram are d e re e a t java.sq l - luc rul c u b az e d e d ate java.rm i - e x e c utie la d istant R em o te M essa ge In terfa ce a java.security - m e c anism e d e se c uritate : c rip tare , aute ntic are java.m ath - op e ratii m ate m atic e c u num e re m ari java.tex t - luc rul c u te x te , d ate i num e re ind e p e nd e nt d e lim b s a java.lang .re ect - introsp e c ie t javax .sw ing - inte rfata g rac c u utiliz atorul, m ult b og it fat d e a m at a a AW T. ...

6 .1.2

F olosirea m em b rilor unui pach et

Conform sp e c ic atiilor d e ac c e s ale une i c lase i ale m e b rilor e i, d oar c lase le s p ub lic e i m e m b rii d e c larati p ub lic i ai une i c lase sunt ac c e sib ili afara p as n ch e tului c are se g se sc . D up c um am v z ut se c iune a S p e c ic atori n a a a n t d e ac c e s p e ntru m e m b rii une i c lase , ac c e sul im p lic it J av a e ste la niv e l d e n p a ch et. P e ntru a folosi o c las p ub lic d intr-un anum it p ach e t, sau p e ntru a ap e la a a o m e tod p ub lic a une i c lase p ub lic e a unui p ach e t, e x ist tre i solutii: a a a sp e c ic are a num e lui c om 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 c are se g se te c lasa. n a s

6 .1 . PACH E T E

147

S p e c ic are a n u m elu i co m p let al c lase i se fac e p rin p re x are a n u m elu i scu rt al c lase i c u num e le p ach e tului d in c are fac e p arte : numePachet.NumeClasa. Button java.awt java.awt.Button - numele scurt al clasei - pachetul din care face parte - numele complet al clasei

A c e ast m e tod e ste re c om and at d oar p e ntru c az ul c are folosire a a a a n ac e le i c lase se fac e o sing ur d at sau foarte rar. a a D e e x e m p lu, ar e x tre m d e ne p lc ut s sc rie m d e e c are d at c nd v re m a a a a s d e c larm un ob ie c t g rac se c v e nte d e g e nul: a a java.awt.Button b1 java.awt.Button b2 java.awt.TextField java.awt.TextField = new java.awt.Button("OK"); = new java.awt.Button("Cancel"); tf1 = new java.awt.TextField("Neplacut"); tf2 = new java.awt.TextField("Tot neplacut");

In ac e ste situatii, v om im p orta ap lic atia noastr c lasa re sp e c tiv , sau n a a ntre g p ach e tul d in c are fac e p arte . A c e st luc ru se re aliz e az p rin instruc iune a a t im port, c are tre b uie s ap ar la e p utul ie re lor surs, a a nc s a nainte d e d e c larare a v re une i c lase sau inte rfe e . t

6 .1.3

Im portul unei clase sau interfete

S e fac e p rin instruc iune a im port c are sp e c ic m num e le c om p le t al c lase i t n a sau inte rfe e i p e c are d orim s o folosim d intr-un anum it p ac e h e t: t a import numePachet.numeClasa; //Pentru exemplul nostru: import java.awt.Button; import java.awt.TextField; D in ac e st m om e nt, v om p ute a folosi c lase le ie rului c are am p lasat n s n instruc iune a d e im p ort num e le sc urt al c lase lor Button i TextField: t s Button b1 Button b2 TextField TextField = new Button("OK"); = new Button("Cancel"); tf1 = new TextField("Placut"); tf2 = new TextField("Foarte placut");

148

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

A c e ast ab ord are e ste e c ie nt i re c om and at c az ul c are nu av e m a as a n n ne v oie d e c t d e c te v a c lase d in p ach e tul re sp e c tiv . D ac e x e m p lul nostru a a a n am av e a ne v oie i d e c lase le Line, Point, Rectangle, Polygon, ar tre b ui s s a av e m c te o instruc iune d e im p ort p e ntru e c are d intre e le : a t import import import import import import java.awt.Button; java.awt.TextField; java.awt.Rectangle; java.awt.Line; java.awt.Point; java.awt.Polygon;

In ac e ast situatie ar m ai sim p lu s folosim im p ortul la c e re re d in a a ntre g ul p ach e t i nu al e c re i c lase p arte . s a n

6 .1.4

Im portul la cerere dintr-un pach et

Im p ortul la c e re re d intr-un anum it p ach e t se fac e p rintr-o instruc iune import t c are sp e c ic m num e le p ach e tului ale c rui c lase i inte rfe e d orim s le n a a s t a folosim , urm at d e sim b olul *. S e num e te im p o rt la cerere d e oare c e rc are a s nc a c lase lor se fac e d inam ic , m om e ntul ap e lrii lor. n a import numePachet.*; //Pentru exemplul nostru: import java.awt.*; D in ac e st m om e nt, v om p ute a folosi c lase le ie rului c are am p lasat n s n instruc iune a d e im p ort num e le sc urt al tuturor c lase lor p ach e tului im p ortat: t Button b = new Button("OK"); Point p = new Point(0, 0);

A tentie * nu are se m nic atia uz ual d e la ie re d e w ild c ard (m asc ) i nu p oate a s a s folosit d e c t c a atare . O e x p re sie d e g e nul import java.awt.C*; v a p rod uc e a o e roare d e c om p ilare .

6 .1 . PACH E T E

149

In c az ul c are sunt im p ortate d ou sau m ai m ulte p ach e te c are c ontin n a c lase (inte rfe e ) c u ac e la i num e , atunc i re fe rire a la e le tre b uie fc ut d oar t s a a folosind num e le c om p le t, c az c ontrar ind se m nalat o a m bigu ita te d e n a c tre c om p ilator. a 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 c onsid e rate im p ortate autom at, p e ntru oric e ie r surs, urm toare le s a a p ach e te : p ach e tul java.lang import java.lang.*; // Poate sau nu sa apara // Mai bine nu... p ach e tul c ure nt p ach e tul im p lic it (fr num e ) aa

6 .1.5

Im portul static

A c e ast fac ilitate , introd us e p nd c u v e rsiune a 1.5, p e rm ite re fe rire a c ona a nc a stante lor static e ale une i c lase fr a m ai sp e c ic a num e le c om p le t al ac e saa te ia i e ste im p le m e ntat p rin ad ug are a c uv ntului ch e ie static d up c e l d e s a a a a import: import static numePachet.NumeClasa.*; A stfe l, loc s ne re fe rim la c onstante le c lase i c u e x p re sii d e tip ul n a NumeClasa.CONSTANTA, p ute m folosi d oar num e le c onstante i.

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 tentie Im p ortul static nu im p ort d e c t c onstante le static e ale une i c lase , nu i a a s c lasa sine . n

6 .1.6

Crearea unui pach et

T oate c lase le i inte rfe e le J av a ap artin la d iv e rse p ach e te , g rup ate d up s t a func ionalitate a lor. D up c um am v z ut c lase le d e b az se g se sc p at a a a a n ch e tul java.lang, c lase le p e ntru intrri/ ie iri sunt java.io, c lase le p e ntru a s n inte rfata g rac java.awt, e tc . a n Cre are a unui p ach e t se re aliz e az p rin sc rie re la e p utul ie re lor surs a nc s a c e c ontin c lase le i inte rfe e le p e c are d orim s le g rup m s t a a ntr-un p ach e t a instruc iunii: pack ag e num eP ach et; t S c onsid e rm un e x e m p lu: p re sup une m c av e m d ou ie re surs Graf.java a a a a s a i Arbore.java. s //Fisierul Graf.java package grafuri; class Graf {...} class GrafPerfect extends Graf {...} //Fisierul Arbore.java package grafuri; class Arbore {...}

6 .1 . PACH E T E class ArboreBinar extends Arbore {...}

151

Clase le Graf, GrafPerfect, Arbore, ArboreBinar v or fac e p arte d in ac e la i p ach e t grafuri. s Instruc iune a package ac ione az asup ra t t a ntre g ului ie r surs la e p utul s a nc c ruia ap are . Cu alte c uv inte nu p ute m sp e c ic a fap tul c anum ite c lase a a d intr-un ie r surs ap artin unui p ach e t, iar alte le altui p ach e t. s a D ac nu e ste sp e c ic at un anum it p ach e t, c lase le unui ie r surs v or fac e a s a p arte d in p ach e tul im p lic it (c are nu are nic i un num e ). In g e ne ral, p ach e tul im p lic it e ste form at d in toate c lase le i inte fe e le d ire c torului c ure nt d e luc ru. s t E ste re c om and at a c a toate c lase le i inte fe te le s e p lasate p ach e te , ns s a n p ach e tul im p lic it ind folosit d oar p e ntru ap lic atii m ic i sau p rototip uri.

6 .1.7

D enum irea unui pach et

E x ist p osib ilitate a c a d oi p rog ram atori c are luc re az la un p roie c t c om un a a s folose asc ac e la i num e p e ntru une le d in c lase le lor. D e ase m e ne a, se a a s p oate c a una d in c lase le une i ap lic atii s aib ac e la i num e c u o c las a a a s a m e d iului J av a. A c e st luc ru e ste p osib il at t tim p c t c lase le c u ac e la i num e a a s se g ase sc p ach e te d ife rite , e le ind d ife re ntiate p rin p re x are a lor c u num e le n p ach e te lor. Ce se am p l a c nd d oi p rog ram atori c are luc re az la un p roie c t nt a ns a a c om un folose sc c lase c u ac e la i num e , c e se g ase sc p ach e te c u ac e la i num e s n s ? P e ntru a e v ita ac e st luc ru, c om p aniile folose sc inv e rsul d om e niului lor Inte rne t d e num ire a p ach e te lor im p le m e ntate c ad rul c om p anie i, c um n n ar ro.companie.numePachet. In c ad rul ac e le iasi c om p anii, c on ic te le d e num e v or re z olv ate p rin d iv e rse c onv e ntii d e uz inte rn, c um ar folosire a num e lui d e c ont al p rog ram atorilor d e num ire a p ach e te lor c re ate d e ac e tia. n s D e e x e m p lu, p rog ram atorul c u num e le Ion al c om p anie i XS oft, av nd c ontul a ion@ x soft.ro, si v a p re x a p ach e te le c u ro.xsoft.ion, p e ntru a p e rm ite id e ntic are a m od unic a c lase lor sale , ind ife re nt d e c onte x tul c are ac e ste a n n v or inte g rate .

152

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

6 .2
6 .2 .1

O rg aniz area ierelor s


O rg aniz area ierelor surs s a

Oric e ap lic atie ne b anal tre b uie s e c onstruit folosind o org aniz are ie r a a a arh ic a c om p one nte lor sale . E ste re c om and at c a strate g ia d e org aniz are a a ie re lor surs s re sp e c te urm toare le c onv e ntii: s a a a Cod ul surs al c lase lor i inte rfe e lor s se g ase asc ie re ale c ror a s t a a n s a num e s e ch iar num e le lor sc urt i c are s aib e x te nsia .java. a s a a

A tentie E ste ob lig atoriu c a o c las/ inte rfat p ub lic s se g ase asc a a a a a ntr-un ie r av nd num e le c lase i(inte rfe e i) i e x te nisa .java, sau c om p ilatorul s a t s v a furniz a o e roare . D in ac e st m otiv , ntr-un ie r surs nu p ot e x ista s a d ou c lase sau inte rfe e p ub lic e . P e ntru c lase le c are nu sunt p ub lic e a t ac e st luc ru nu e ste ob lig atoriu, c i d oar re c om and at. Intr-un ie r surs s a p ot e x ista oric te c lase sau inte rfe e c are nu sunt p ub lic e . a t

Fi ie re le surs tre b uie s se g se asc d ire c toare c are s re e c te nus a a a a n a m e le p ach e te lor c are se g se sc c lase le i inte rfe e le d in ac e le ie re . n a s t s Cu alte c uv inte , un d ire c tor v a c ontine surse p e ntru c lase i inte rfe e s t d in ac e la i p ach e t iar num e le d ire c torului v a ch iar num e le p ach e tus lui. D ac num e le p ach e te lor sunt form ate d in m ai m ulte unit i le x ic ale a at se p arate p rin p unc t, atunc i ac e ste a tre b uie d e ase m e ne a s c ore sp und a a unor d ire c toare c e v or d e sc rie c ale a sp re ie re le surs ale c ror c lase s a a i inte rfe e fac p arte d in p ach e te le re sp e c tiv e . s t V om c laric a m od alitate a d e org aniz are a ie re lor surs ale une i ap lic atii s a p rintr-un e x e m p lu c onc re t. S p re sup une m c d orim c re are a unor c om p oa a ne nte c are s re p re z inte d iv e rse notiuni m ate m atic e d in d om e nii d ife rite , a c um ar g e om e trie , alg e b r, analiz , e tc . P e ntru a sim p lic a luc rurile , s a a a p re sup une m c d orim s c re m c lase c are s d e sc rie urm toare le notiuni: a a a a a p o ligo n , cerc, p o lied ru , sfer , gru p , fu n ctie . a O p rim v ariant ar s c onstruim c te o c las p e ntru e c are i s le p lasm a a a a a s a a

6 .2 . O RG ANIZ ARE A F ISIE RE L O R

153

ac e la i d ire c tor p re una c u un p rog ram c are s le folose asc a, a, av nd n s m a ns a v e d e re p osib ila e x tind e re a ap lic atie i c u noi re p re z e ntri d e notiuni m ate m n a atic e , ac e ast ab ord are ar ine c ie nt. a a O ab ord are e le g ant ar ac e e a c are c lase le c are d e sc riu notiuni d in a n ac e la i d om e niu sa se g ase asc a p ach e te se p arate i d ire c toare se p arate . s n s Ie rarh ia ie re lor sursa ar : s /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 ie re le d e m ai sus tre b uie d e c larate p ach e te d e nun s n m ite c ore sp unz ator c u num e le d ire c toare lor c are se g ase sc : n // Poligon.java package geometrie.plan; public class Poligon { . . . } // Cerc.java package geometrie.plan; public class Cerc { . . . }

// Poliedru.java package geometrie.spatiu; public class Poliedru { . . . }

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 al a ap lic atie i. a D up c um se ob se rv , num e le lung al une i c lase tre b uie s d e sc rie c ale a sp re a a a ac e a c las c ad rul ie re lor surs, re lativ la d ire c torul c are se g se te a n s a n a s ap lic atia.

6 .2 .2

O rg aniz area unit ilor de com pilare (.class) at

In urm a c om p ilrii ie re lor surs v or g e ne rate unit i d e c om p ilare p e ntru a s a at e c are c las i inte rfat d in ie re le surs. D up c um tim ac e ste a au e x te nsia as a s a a s .class i num e le sc urt al c lase i sau inte rfe e i re sp e c tiv e . s t S p re d e ose b ire d e org aniz are a surse lor, un ie r .class treb uie s se s a g ase asc a ntr-o ie rarh ie d e d ire c toare c are s re e c te num e le p ach e tului d in a c are fac e p arte c lasa re sp e c tiv . a Im p lic it, urm a c om p ilrii ie re le surs i unit ile d e c om p ilare se n a s a s at g se sc ac e la i d ire c tor, a e le p ot ap oi org aniz ate se p arat. E ste re c oa n s ns m and at a c a ac e ast se p arare s e fc ut autom at la c om p ilare . ns a a a a R e v e nind la e x e m p lul d e m ai sus, v om av e a urm toare a org aniz are : a /matematica /clase /geometrie /plan Poligon.class Cerc.class /spatiu

6 .2 . O RG ANIZ ARE A F ISIE RE L O R Poliedru.class Sfera.class /algebra Grup.class /analiza Functie.class Matematica.class

155

Cre are a ac e ste i struc turi ie rarh ic e e ste fac ut autom at d e c tre c om p ilator. a a In d ire c torul ap lic atie i (matematica) c re m sub d ire c torul clase i d m c oa s a m and a: javac -sourcepath surse surse/Matematica.java -d clase sau javac -classpath surse surse/Matematica.java -d clase Op iune a -d sp e c ic d ire c torul rd c in al ie rarh ie i d e c lase . In lip sa t a a a a lui, e c are unitate d e c om p ilare v a p lasat ac e la i d ire c tor c u ie rul su a n s s a surs. a D e oare c e c om p ilm c lasa p rinc ip al a p lic atie i, v or c om p ilate c asc ad a a n a toate c lase le re fe rite d e ac e asta, d ar num ai ac e ste a. In c az ul c are d orim s n a c om p ilm e x p lic it toate ie re le jav a d intr-un anum it d ire c tor, d e e x e m p lu a s surse/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 rii ierelor a s

Org aniz are a ie re lor surs e ste ne c e sar d e oare c e m om e ntul c nd c om p is a a n a latorul alne ste un num e d e c las e l tre b uie s p oat id e ntic a ac e a c las, nt a a a a c e e a c e am na c tre b uie s g ase asc e rul surs c are o c ontine . nse a a a s a S im ilar, unit ile d e c om p ilare sunt org aniz ate astfe l p e ntru a d a p osib ilat itate a inte rp re torului s g ase asc i s arc e m e m orie o anum it c las a a s a nc n a a n tim p ul e x e c utie i p rog ram ului. Ins ac e ast org aniz are nu e ste suc ie nt d e oare c e sp e c ic num ai p arte a a a a a nal d in c ale a c tre ie re le .jav a i .c lass, d e e x e m p lu a a s s /matematica/clase/geometrie/plan/Poligon.class. P e ntru ac e asta, at t a la c om p ilare c t i la inte rp re tare tre b uie sp e c ic at lista d e d ire c toare rd c in a s a a a a

156

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

c are se g se sc ie re le ap lic atie i. A c e ast list se num e te ca le d e ca u ta re n a s a a s (cla ssp a th ). D e nitie O ca le d e c u ta re e ste o list d e d ire c toare sau arh iv e c are v or c utate a a n a ie re le ne c e sare une i ap lic atii. Fie c are d ire c tor d in c ale a d e c autare e ste s d ire c torul im e d iat sup e rior struc turii d e d ire c toare c ore sp unz toare num e lor a p ach e te lor c are se g se sc c lase le d in d ire c torul re sp e c tiv , astfe l t c om p in a nc a latorul i inte rp re torul s p oat c onstrui c ale a c om p le t sp re c lase le ap lic atie i. s a a a Im p lic it, c ale a d e c utare e ste form at d oar d in d ire c torul c ure nt. a a S c onsid e rm c lasa p rinc ip al a ap lic atie i Matematica.java: a a a 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 e ntic are a une i c lase re fe rite p rog ram se fac e fe lul urm tor: n n a L a d ire c toare le a ate c ale a d e c utare se ad aug sub d ire c toare le n a a sp e c ic ate im p ort sau num e le lung al c lase i n n In d ire c toare le form ate e ste c utat un ie r c u num e le c lase i. In c az ul a s c are nu e ste g sit nic i unul sau sunt g site m ai m ulte v a se m nalat n a a a o e roare .

6 .2 .4

S etarea c ii de c utare (CL A S S P A T H ) a a

S e tare a c ii d e c utare se p oate fac e d ou m od alit i: a a n a at S e tare a v ariab ile i d e m e d iu CL A S S P A T H - folosind ac e ast v ariant a a toate ap lic atiile J av a d e p e m a ina re sp e c tiv v or c uta c lase le ne c e sare s a a d ire c toare le sp e c ic ate v ariab ila CLASSPATH. n n

6 .3 . ARH IV E J AR UNIX: SET CLASSPATH = cale1:cale2:... DOS shell (Windows 95/NT/...): SET CLASSPATH = cale1;cale2;...

157

Folosire a op iunii -classpath la c om p ilare a i inte rp re tare a p rog ram e lor t s - d ire c toare le sp e c ic ate astfe l v or v alab ile d oar p e ntru c om and a c ure nt: a javac - classpath <cale de cautare> <surse java> java - classpath <cale de cautare> <clasa principala> L ansare a e x e c utie a ap lic atie i noastre , d in d ire c torul matematica, se n v a fac e astfe l: java -classpath clase Matematica In c onc luz ie , o org aniz are e c ie nt a ie re lor ap lic atie i ar arta astfe l: a s a /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

Fi ie re le JA R (J av a A rch iv e ) sunt arh iv e form at Z IP folosite p e ntru s n p ach e tare a ap lic atiilor J av a. E le p ot folosite i p e ntru c om p rim ri m s a ob i nuite , d ife re nta fat d e o arh iv Z IP ob i nuit ind d oar e x iste nta unui s a a s a d ire c tor d e num it META-INF, c e c ontine d iv e rse inform atii aux iliare le g ate d e ap lic atia sau c lase le arh iv ate . U n ie r J A R p oate c re at folosind utilitarul jar a at d istrib utia s n J 2S D K , sau m e tod e ale c lase lor sup ort d in p ach e tul java.util.jar. D intre b e ne c 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 e nd e nt d e p latform ; a

158

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

c om p re sare - d im e nsiune a une i ap lic atii form a sa nal e ste re d us; n a a m inim iz are a tim p ului d e arc are a unui ap p le t: d ac ap p le tul ( ie re nc a s c lass, re surse , e tc ) e ste c om p re sat ntr-o arh iv J A R , e l p oate rc at a nc a ntr-o sing ur tranz ac ie H T T P , fr a d e c i ne v oie d e a d e sch id e c te a t aa a o c one x iune nou p e ntru e c are ie r; a s se c uritate - arh iv e le J A R p ot se m nate e le c tronic m e c anism ul p e ntru luc rul c u ie re J A R e ste p arte inte g rata a p lats form e i J av a.

6 .3 .1

F olosirea utilitarului jar

A rh iv atorul ja r se g se te sub d ire c torul bin al d ire c torului c are e ste a s n n instalat k itul J 2S D K . M ai jos sunt p re z e ntate p e sc urt op e ratiile uz uale : Cre are a une i arh iv e jar cf arhiva.jar fiier(e)-intrare s V iz ualiz are c ontinutului jar tf nume-arhiva E x trag e re a c ontinutului jar xf arhiva.jar E x trag e re a d oar a unor ie re s jar xf arhiva.jar fiier(e)-arhivate s E x e c utare a une i ap lic atii java -jar arhiva.jar D e sch id e re a unui ap p le t arh iv at <applet code=A.class archive="arhiva.jar" ...> E x e m p le : A rh iv are a a d ou ie re c lass: a s jar cf classes.jar A.class B.class arh iv are a tuturor ie re lor d in d ire c torul c ure nt: s jar cvf allfiles.jar *

6 .3 . ARH IV E J AR

159

6 .3 .2

E x ecutarea aplicatiilor arh ivate

P e ntru a rula o ap lic atie p ach e tat m a ntr-o arh iv J A R tre b uie s fac e m a a c unosc ut inte rp re torului num e le c lase i p rinc ip ale a ap lic atie i. S c onsid e rm a a a urm torul e x e m p lu, c are d orim s arh iv m c lase le ap lic atie i d e sc rise m ai a n a a sus, c are c lasa p rinc ip al e ra Matematica.java. D in d ire c torul clase v om n a lansa c om and a: jar cvf mate.jar geometrie analiza algebra Matematica.class In urm a ac e ste i c om e nz i v om ob tine arh iv a mate.jar. D ac v om e rc a a nc s lansm e x e c utie ac e ast arh iv p rin c om and a java -jar mate.jar a a n a a v om ob ine urm toare a e roare : Faile d to load M ain-Class m anife st from t a m ate .jar . A c e asta am na c se rul Manifest.mf c e se g ase te d inse a n s n re c torul META-INF tre b uie s g istrm c lasa p rinc ip al a ap lic atie i. A c e st a nre a a luc ru v om fac e d oi p a i: l n s se c re e az un ie r c u un num e oare c are , d e e x e m p lu manifest.txt, a s c are v om sc rie : n Main-Class: Matematica ad aug m ac e ast inform atie la ie rul m anife st al arh iv e i m ate .jar: a a s jar uvfm mate.jar manifest.txt A m b e le op e ratii p ute au e x e c utate 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 te nsiile .jar c u inte rp re torul J av a, c e e a c e am n c fac nd d ub lu-c lick p e o arh iv J A R v a nse a a a a lansat e x e c utie ap lic atia p ach e tat ac e a arh iv (d ac e x ist o c las a n m a n a a a a p rinc ip al). a

160

CAPIT O L UL 6 . O RG ANIZ ARE A CL ASE L O R

Capitolul 7 Colectii
7 .1 Introducere

O co lectie e ste un ob ie c t c are g rup e az m ai m ulte e le m e nte a ntr-o sing ur a unitate . P rin inte rm e d iul c ole c iilor v om av e a ac c e s la d ife rite tip uri d e t d ate c um ar v e c tori, liste antuite , stiv e , m ultim i m ate m atic e , tab e le d e nl d isp e rsie , e tc . Cole c iile sunt folosite at t p e ntru m e m orare a i m anip ulare a t a s d ate lor, c t i p e ntru transm ite re a unor inform atii d e la o m e tod la alta. a s a T ip ul d e d ate al e le m e nte lor d intr-o c ole c ie e ste Object, c e e a c e am n t nse a c m ultim ile re p re z e ntate sunt e te rog e ne , p ut nd inc lud e ob ie c te d e oric e tip . a a Inc e p nd c u v e rsiune a 1.2, J av a c ole c iile sunt tratate a n t ntr-o m anie r a unitar, ind org aniz ate a ntr-o arh ite c tur foarte e c ie nt i e x ib il c e c up rind e : a as a Interfete: tip uri ab strac te d e d ate c e d e sc riu c ole c iile i p e rm it uti t s liz are a lor ind e p e nd e nt d e d e taliile im p le m e ntrilor. a Im plem ent ri: im p le m e ntri c onc re te ale inte rfe e lor c e d e sc riu c ole c ii. a a t t A c e ste c lase re p re z int tip u ri d e d a te reu tiliza bile . a A lg oritm i: m e tod e c are e fe c tue az d iv e rse op e ratii utile c um ar a c utare a sau sortare a, d e nite p e ntru ob ie c te c e im p le m e nte az inte rfe e le a a t c e d e sc riu c ole c ii. A c e ti alg oritm i se num e sc i p o lim o r ci d e oare c e t s s p ot folositi p e im p le m e ntri d ife rite ale une i c ole c ii, re p re z e nt nd a t a e le m e ntul d e fu n ctio n a lita te reu tiliza bil . a U tiliz are a c ole c iilor ofe r av antaje e v id e nte p roc e sul d e d e z v oltare a t a n une i ap lic atii. Ce le m ai im p ortante sunt: 161

162

CAPIT O L UL 7 . CO L E CT II

R educerea efortului de prog ram are: p rin p une re a la d isp oz itia p rog ram atorului a unui se t d e tip uri d e d ate i alg oritm i c e m od e le az s a struc turi i op e ratii d e s folosite ap lic atii. s n Cre terea vitez ei i calit ii prog ram ului: im p le m e ntrile e fe c tiv e s s at a ale c ole c iilor sunt d e t nalt p e rform ant i folose sc alg oritm i c u tim p a a s d e luc ru op tim . A stfe l, la sc rie re a une i ap lic atii p ute m s ne c onc e ntrm e forturile asup ra a a p rob le m e i sine i nu asup ra m od ului d e re p re z e ntare i m anip ulare a n s s inform atiilor.

7 .2

Interfete ce descriu colectii

Inte rfe e le re p re z int nuc le ul m e c anism ului d e luc ru c u c ole c ii, sc op ul lor t a t ind d e a p e rm ite utiliz are a struc turilor d e d ate ind e p e nd e nt d e m od ul lor d e im p le m e ntare .

Collection m od e le az o c ole c ie la niv e lul c e l m ai g e ne ral, d e sc riind un a t g rup d e ob ie c te num ite i elem en tele sale . U ne le im p le m e ntri ale ac e ste i s a inte rfe e p e rm it e x iste nta e le m e nte lor d up lic ate , alte im p le m e ntri nu. U nt a e le au e le m e nte le ord onate , alte le nu. P latform a J av a nu ofe r nic i o im a p le m e ntare d ire c t a ac e ste i inte rfe e , c i e x ist d oar im p le m e ntri ale unor a t a a sub inte rfe e m ai c onc re te , c um ar Set sau List. t 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);

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 le az notiune a d e m u ltim e se ns m ate m atic . O m ultim e nu a n p oate av e a e le m e nte d up lic ate , m ai b ine z is nu p oate c ontine d ou ob ie c te o1 a i o2 c u p rop rie tate a o1.eq u als(o2). M o te ne te m e tod e le d in Collection, s s s fr a av e a alte m e tod e sp e c ic e . aa D ou d intre c lase le stand ard c are ofe r im p le m e ntri c onc re te ale ac e ste i a a a inte rfe e sunt H ash S et i T reeS et. t s

S ortedS et e ste ase m ntoare c u inte rfata Set, d ife re nta p rinc ip al c onst nd a a a a fap tul c e le m e nte le d intr-o astfe l d e c ole c ie sunt ord onate asc e nd e nt. n a t P une la d isp oz itie op e ratii c are b e ne c iaz d e av antajul ord onrii e le m e nte lor. a a Ord onare a e le m e nte lor se fac e c onform ord inii lor naturale , sau c onform c u ord ine a d at d e un c om p arator sp e c ic at la c re are a c ole c ie i i e ste m e ntinut a t s a autom at la oric e op e ratie e fe c tuat asup ra m ultim ii. S ing ura c ond ittie e ste a c a, p e ntru oric e d ou ob ie c te o1, o2 ale c ole c ie i, ap e lul o1.com p ar eT o(o2) a t (sau com p ar ator.com p ar e(o1, o2), d ac e ste folosit un c om p arator) tre b uie a s e v alid i s nu p rov oac e e x c e p ii. a s a t Fiind sub c las a inte rfe e i Set, m o te ne te m e tod e le ac e ste ia, ofe rind a t s s m e tod e sup lim e ntare c e in c ont d e fap tul c m ultim e a e ste sortat: t a a public interface SortedSet extends Set { // Subliste SortedSet subSet(Object fromElement, Object toElement); SortedSet headSet(Object toElement);

164

CAPIT O L UL 7 . CO L E CT II

SortedSet tailSet(Object fromElement); // Capete Object first(); Object last(); Comparator comparator(); } Clasa c are im p le m e nte az ac e ast inte rfat e ste T reeS et. a a a

L ist d e sc rie liste (secven e) d e e le m e nte ind e x ate . L iste le p ot c ontine t d up lic ate i p e rm it un c ontrol p re c is asup ra p oz itie i unui e le m e nt p rin ins te rm e d iul ind e x ului ac e lui e le m e nt. In p lus, fatd e m e tod e le d e nite d e a inte rfata Collection, av e m m e tod e p e ntru ac c e s p oz itional, c utare i it a s e rare av ansat. D e nitia inte rfe e i e ste : a t 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); }

7 .2 . INT E RF E T E CE D E SCRIU CO L E CT II Clase stand ard c are im p le m e nte az ac e ast inte rfat sunt: ArrayList, a a a LinkedList, Vector.

165

M ap d e sc rie struc turi d e d ate c e asoc iaz e c arui e le m e nt o ch e ie unic , a a d up c are p oate re g sit. Ob ie c te le d e ac e st tip nu p ot c ontine ch e i d up lia a c ate i e c are ch e ie e ste asoc iat la un sing ur e le m e nt. Ie rarh ia inte rfe e lor s a t d e riv ate d in Map e ste ind e p e nd e nt d e ie rarh ia d e riv at d in Collection. a a D e nittai inte rfe e i e ste p re z e ntat m ai jos: t a 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); } }

166

CAPIT O L UL 7 . CO L E CT II

Clase c are im p le m e nte az inte rfat Map sunt H ash M ap, T reeM ap i a a s H ash tab le.

S ortedM ap e ste ase m ntoare c u inte rfata Map, la c are se ad aug fap a a a tul c m ultim e a ch e ilor d intr-o astfe l d e c ole c ie e ste m e ntinut ord onat a t a a asc e nd e nt c onform ord inii naturale , sau c onform c u ord ine a d at d e un c om a p arator sp e c ic at la c re are a c ole c ie i. E ste sub c lasa a inte rfe e i Map, ofe rind t t m e tod e sup lim e ntare p e ntru: e x trag e re d e sub tab e le , a are a p rim e i/ ultim e i ch e i, a are a c om p aratorului folosit p e ntru ord onare . D e nitia inte rfe e i e ste d at m ai jos: t a 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 c are im p le m e nte az ac e ast inte rfat e ste T reeM ap. a a a

7 .3

Im plem ent ri ale colectiilor a

Inainte d e v e rsiune a 1.2, e x ista un se t d e c lase p e ntru luc rul c u c ole c ii, a t ns ac e ste a nu e rau org aniz ate p e ie rarh ia d e inte rfe e p re z e ntat se c iune a t a n t ante rioar. A c e ste c lase sunt c ontinuare d isp onib ile i m ulte d intre e le a n s au fost ad ap tate a a fe l t s se inte g re z e noua ab ord are . P e l ng n s nc a a n a a ac e ste a au fost c re ate noi c lase c ore sp unz toare inte rfe e lor d e nite , ch iar a t d ac func ionalitate a lor e ra ap roap e id e ntic c u c e a a une i c lase ante rioare . a t a

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 c are im p le m e nte az inte rfe e c e d e sc riu c ole c ii au num e le a a t t d e form a < I m p lem entar e >< I nter f ata >, und e im p le m e ntare se re fe r la a struc tura inte rn folosit p e ntru re p re z e ntare a m ultim ii, i sunt p re z e ntate a a s tab e lul d e m ai jos, p re un c u inte rfe e le c ore sp unz toare (c lase le d in n m a t a v e ch iul m od e l sunt tre c ute p e r nd ul d e jos): a Interfata Set SortedSet List Map SortedMap Clasa HashSet TreeSet ArrayList, LinkedList Vector HashMap Hashtable TreeMap

A ad ar se ob se rv e x iste nta unor c lase c are ofe r ac e e a i func ionalite , s a a s t c um ar ArrayList i Vector, HashMap i Hashtable. s s P e l ng org aniz are a ie rarh ic a inte rfe e lor im p le m e ntate , c lase le c e d e a a a t sc riu c ole c ii sunt d e ase m e ne a c onc e p ute t ntr-o m anie r ie rarh ic , c a g ura a a n d e m ai jos: AbstractCollection - AbstractSet, AbstractList - HashSet, TreeSet... Vector-Stack AbstractMap - HashMap, TreeMap, HashTable In vechea ierarhie: Dictionary - Hashtable - Properties E v id e nt, im p le m e ntare a inte rfe e lor e ste e x p lic it re aliz at la niv e lul sup e rt a c lase lor ab strac te , ac e ste a ofe rind d e altfe l i im p le m e ntri c onc re te p e ntru s a m ulte d in m e tod e le d e nite d e inte rfe e . t In g e ne ral, c lase le c are d e sc riu c ole c ii au une le trsaturi c om une , c um ar t a : p e rm it e le m e ntul null, sunt se rializ ab ile , au d e nit m e tod a clone, a

168

CAPIT O L UL 7 . CO L E CT II

au d e nit m e tod a toString, c are re turne az o re p re z e ntare c a ir d e a a s c arac te re a c ole c ie i re sp e c tiv e , t p e rm it c re are a d e ite ratori p e ntru p arc urg e re , au at t c onstruc tor fr arg um e nte c t i un c onstruc tor c are ac c e p t a aa a s a c a arg um e nt o alt c ole c ie a t e x c e p t nd c lase le d in arh ite c tura v e ch e , nu sunt sinc roniz ate (v e z i Fire a d e e x e c utie ).

7 .4

F olosirea e cient a colectiilor a

D up c um am v az ut, e c are inte rfat c e d e sc rie o c ole c ie are m ai m ulte a a t im p le m e ntri. D e e x e m p lu, inte rfata List e ste im p le m e ntat d e c lase le a a ArrayList i LinkedList, p rim a ind g e ne ral m ult m ai folosit. D e c e s n a e x ist atunc i i c lasa LinkedList ? R asp unsul c onst fap tul c folosind a s a n a re p re z e ntri d ife rite ale m ultim ii g e stionate p ute m ob ine p e rform ante m ai a t b une func ie d e situatie , p rin re aliz are a unor c om p rom isuri n t ntre sp atiul ne c e sar p e ntru m e m orare a d ate lor, rap id itate a re g sirii ac e stora i tim p ul a s ne c e sar ac tualiz rii c ole c ie i c az ul unor m od ic ri. a t n a S c onsid e rm un e x e m p lu c e c re e az a o list folosind ArrayList, re sp e c tiv a a a LinkedList i e x e c ut d iv e rse op e ratii p e e a, c ronom e tr nd tim p ul ne c e sar s a a re aliz rii ac e stora: a 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 ) ) ; }

7 .4 . F O L O SIRE A E F ICIE NT A A CO L E CT IIL O R


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 ) ; } }

169

T im p ii ap rox im ativ i d e rulare p e un c alc ulator c u p e rform ante m e d ii, e x p rim ati se c und e , sunt d ati tab e lul d e m ai jos: n n A rray L ist 0.12 0.01 12.05 L ink edL ist 0.14 87.45 0.01

add g et rem ove

A ad ar, ad ug are a e le m e nte lor e ste rap id p e ntru am b e le tip uri d e liste . s a a ArrayList ofe r ac c e s tim p c onstant la e le m e nte le sale i d in ac e st m otiv a n s folosire a lui g e t e ste rap id , tim p c e p e ntru LinkedList e ste e x tre m a n d e le nt, d e oare c e a ntr-o list a nlantuit ac c e sul la un e le m e nt se fac e p rin a

170

CAPIT O L UL 7 . CO L E CT II

p arc urg e re a se c v e ntial a liste i p n la e le m e ntul re sp e c tiv . a a a L a op e ratiune a d e e lim inare , folosire a lui ArrayList e ste le nt d e oare c e e l a e m e nte le rm ase sufe r un p roc e s d e re ind e x are (sh ift la st ng a), tim p a a a n c e p e ntru LinkedList e ste rap id i se fac e p rin sim p la sch im b are a une i a s le g turi. D e c i, ArrayList se c om p ort b ine p e ntru c az uri c are av e m a a n ne v oie d e re g sire a unor e le m e nte la p oz itii d ife rite list, iar LinkedList a n a func ione az a e c ie nt atunc i c nd fac e m m ulte op e ratii d e m od ic are ( te rg e ri, t a s inse rri). a

Concluz ia nu e ste c una d in ac e ste c lase e ste m ai b un d e c t c e alalt, a a a a c i c e x ist d ife re nte sub stantiale re p re z e ntare a i c om p ortam e ntul d ife rite lor a a n s im p le m e ntri i c ale g e re a une i anum ite c lase p e ntru re p re z e ntare a une i a s a m ultim i d e e le m e nte tre b uie s se fac func ie d e natura p rob le m e i c e a a n t tre b uie re z olv at. a

7 .5

A lg oritm i polim or ci

A lg oritm ii p olim orc i d e sc ri i ac e ast se c iune sunt m e tod e d e nite s n a t n c lasa Collections c are p e rm it e fe c tuare a unor op e ratii utile c um ar c utare a, a sortare a, e tc . Carac te risitic ile p rinc ip ale ale ac e stor alg oritm i sunt: sunt m e tod e d e c las (static e ); a au un sing ur arg um e nt d e tip c ole c ie ; t ap e lul lor g e ne ral v a d e form a: Collections.algoritm(colectie, [argumente]); m ajoritate a op e re az p e liste d ar i p e c ole c ii arb itrare . a s t M e tod e le m ai d e s folosite d in c lasa Collections sunt: sort - sorte az asc e nd e nt o list re fe ritor la ord ine a s natural sau la a a a a ord ine a d at d e un c om p arator; a sh u e - am e ste c e le m e nte le une i liste - op usul lui sort; a b inary S earch - e fe c tue az c utare a e c ie nt (b inar) a unui e le m e nt a a a a ntr-o list ord onat; a a

7 .6 . T IPURI G E NE RICE reverse - inv e rse az ord ine a e le m e nte lor d intr-o list; a a

171

ll - p op ule az a o lista c u un anum it e le m e nt re p e tat d e un num r d e a ori; copy - c op ie e le m e nte le une i liste alta; n m in - re turne az m inim ul d intr-o c ole c ie ; a t m ax - re turne az m ax im ul d intr-o c ole c ie ; a t sw ap - inte rsch im b e le m e nte le d e la d ou p oz itii sp e c ic ate ale une i a a liste ; enum eration - re turne az a o e num e rare a e le m e nte lor d intr-o c ole c ie ; t unm odi ab leT ip C o lectie - re turne az o instant c are nu p oate m od a a ic at a c ole c ie i re sp e c tiv e ; a t sy nch roniz edT ip C o lectie - re turne az o instant sinc roniz at a une i a a a c ole c ii (v e z i Fire d e e x e c utie ). t

7 .6

T ipuri g enerice

T ip urile g e ne ric e , introd use v e rsiune a 1.5 a lim b ajului J av a, sim p lic n a luc rul c u c ole c ii, p e rm it nd tip iz are a e le m e nte lor ac e stora. D e nire a unui t a tip g e ne ric se re aliz e az p rin sp e c ic are a a ntre p arante z e ung h iulare a unui tip d e d ate J av a, e fe c tul ind im p une re a tip ului re sp e c tiv p e ntru toate e le m e nte le c ole c ie i: <T ipD ate>. S c onsid e rm un e x e m p lu d e utiliz are a c ole c iilor t a a t nainte i d up introd uc e re a tip urilor g e ne ric e : s a // 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 e nit p oate c ontine ob ie c te d e oric e tip , d e i a s am d ori c a e le m e nte le s e d oar num e re a ntre g i. M ai m ult, tre b uie s fac e m a c ast e x p lic it d e la tip ul Object la Integer atunc i c nd p re lum v aloare a a a unui e le m e nt. Folosind tip uri g e ne ric e , p ute m re sc rie se c v e nta astfe l:

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 utiliz m i m e c anism ul d e a u to bo xin g , ob ine m o v ariant m ult sim a a s t a p lic at a se c v e nte i initiale : a // Dupa 1.5, folosind si autoboxing ArrayList<Integer> list = new ArrayList<Integer>(); list.add(123); int val = list.get(0); In c az ul folosirii tip urilor g e ne ric e , e rc are a d e a utiliz a c ad rul une i nc n c ole c ii a unui e le m e nt ne c ore sp unz tor c a tip v a p rod uc e o e roare la c om p it a lare , sp re d e ose b ire d e v arianta ante rioar c e p e rm ite a d oara arunc are a unor a e x c e p ie d e tip ul ClassCastException c az ul folosirii inc ore c te a tip urilor. t n

7 .7

Iteratori i enum er ri s a

E num e rrile i ite ratorii d e sc riu m od alit i p e ntru p arc urg e re a se c v e ntial a a s at a une i c ole c ii, ind ife re nt d ac ac e asta e ste ind e x at sau nu. E i sunt d e sc ri i t a a s d e ob ie c te c e im p le m e nte az inte rfe e le E num eration, re sp e c tiv Iterator a t sau L istIterator. T oate c lase le c are im p le m e nte az c ole c ii au m e tod e c e a t re turne az o e num e rare sau un ite rator p e ntru p arc urg e re a e le m e nte lor lor. a D e oare c e func ionalitate a inte rfe e i Enumeration se re g se te Iterator, t t a s n ac e asta d in urm e ste p re fe rat noile im p le m e ntri ale c ole c iilor. a a n a t M e tod e le uz uale ale ac e stor inte rfe e sunt p re z e ntate m ai jos, p re un t m a c u m od alitate a lor d e folosire , se m nic atiile lor ind e v id e nte : 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();

7 .7 . IT E RAT O RI SI E NUM E RARI 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)); }

173

Ite ratorii sim p li p e rm it e lim inare a e le m e ntului c ure nt d in c ole c ia p e c are t o p arc urg , c e i d e tip ListIterator p e rm it i inse rare a unui e le m e nt la p oz itia s c ure nt, re sp e c tiv m od ic are a e le m e ntului c ure nt, p re c um i ite rare a am a s n b e le se nsuri. Ite ratorii sunt p re fe rati e num e rrilor d atorit p osib ilit ii lor a a at d e a ac iona asup ra c ole c ie i p e c are o p arc urg p rin m e tod e d e tip remove, t t add, set d ar i p rin fap tul c d e num irile m e tod e lor sunt m ai c onc ise . s a

A tentie D e oare c e c ole c iile sunt c onstruite p e ste tip ul d e d ate Object, m e tod e le t d e tip next sau prev ale ite ratorilor v or re turna tip ul Object, ind re sp onsab ilitate a noastr d e a fac e c onv e rsie (c ast) la alte tip uri d e d ate , d ac e ste a a c az ul.

174

CAPIT O L UL 7 . CO L E CT II

In e x e m p lul d e m ai jos p une m ntr-un v e c tor num e re le d e la 1 la 10, le am e ste c m , d up c are le p arc urg e m e le m e nt c u e le m e nt folosind un ite rator, a a nloc uind num e re le p are c u 0. L isting 7.2: Folosire a 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 nd c u v e rsiune a 1.5 a lim b ajului J av a, e x ist o v ariant sim p lic at a a a a d e utiliz are a ite ratorilor. A stfe l, o se c v e nt d e g e nul: a ArrayList<Integer> list = new ArrayList<Integer>(); for (Iterator i = list.iterator(); i.hasNext();) { Integer val=(Integer)i.next(); // Proceseaza val ...

7 .7 . IT E RAT O RI SI E NUM E RARI } p oate re sc ris astfe l: a ArrayList<Integer> list = new ArrayList<Integer>(); for (Integer val : list) { // Proceseaza val ... }

175

176

CAPIT O L UL 7 . CO L E CT II

Capitolul 8 S erializ area ob iectelor


8 .1 F olosirea serializ rii a

D e nitie S e rializ are a e ste o m e tod c e p e rm ite transform are a unui ob ie c t a ntr-o se c v e nt d e oc te i sau c arac te re d in c are s p oat re fc ut ulte rior ob ie c tul a t a a a orig inal. Cu alte c uv inte , se rializ are a p e rm ite salv are a ntr-o m anie r unitar a a a tuturor inform atiilor unui ob ie c t p e un m e d iu d e stoc are e x te rn p rog ram ului. P roc e sul inv e rs, d e c itire a unui ob ie c t se rializ at p e ntru a-i re fac e stare a orig inal, se num e te d eseria liza re . Intr-un c ad ru m ai larg , p rin se rializ are a s se le g e p roc e sul d e sc rie re / c itire a ob ie c te lor. nte T ip urile p rim itiv e p ot d e ase m e ne a se rializ ate . U tilitate a se rializ arii c onst urm toare le asp e c te : a n a A sig ur un m e c anism sim p lu d e u tiliza t p e ntru salv are a i re staurare a a s a d ate lor. P e rm ite p ersisten a o biectelo r, c e e a c e am na c d urata d e v iata a t nse a unui ob ie c t nu e ste d e te rm inat d e e x e c utia unui p rog ram c are ac e sta a n e ste d e nit - ob ie c tul p oate e x ista i s ntre ap e lurile p rog ram e lor c are l folose sc . A c e st luc ru se re aliz e az p rin se rializ are a ob ie c tului i sc rie re a a s lui p e d isc nainte d e te rm inare a unui p rog ram , ap oi, la re lansare a p rog ram ului, ob ie c tul v a c itit d e p e d isc i stare a lui re fac ut. A c e st s a 177

178

CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R tip d e p e rsiste nt a ob ie c te lor se num e te p ersisten u oa r , a s ta s a ntruc t a e a tre b uie e fe c tuat e x p lic it d e c tre p rog ram ator i nu e ste re aliz at a a s a autom at d e c tre siste m . a

C o m p en sa rea d iferen elo r n tre sistem e d e o p era re - transm ite re a unor t inform atii ntre p latform e d e luc ru d ife rite se re aliz e az unitar, ind e a p e nd e nt d e form atul d e re p re z e ntare a d ate lor, ord ine a oc te ilor sau t alte d e talii sp e c ic e siste m e lor re p e c tiv e . T ra n sm iterea d a telo r retea - A p lic atiile c e rule az re e a p ot c om un a n t nic a ntre e le folosind ux uri p e c are sunt trim ise , re sp e c tiv re c e p ionate t ob ie c te se rializ ate . R M I (R em o te M e th od In vo ca tio n ) - e ste o m od alitate p rin c are m e tod e le unor ob ie c te d e p e o alt m a in p ot ap e late c a i c um ac e ste a ar e x a s a s ista loc al p e m a ina p e c are rule az ap lic atia. A tunc i c nd e ste trim is s a a un m e saj c tre un ob ie c t re m ote (d e p e alt m a in), se rializ are a a a s a e ste utiliz at p e ntru transp ortul arg um e nte lor p rin re e a i p e ntru re a t s turnare a v alorilor. J a va B ea n s - sunt c om p one nte re utiliz ab ile , d e sine stttoare c e p ot aa utiliz ate m e d ii v iz uale d e d e z v oltare a ap lic atiilor. Oric e c om p on ne nt B e an are o stare d e nit d e v alorile im p lic ite ale p rop rie t ilor a a at sale , stare c are e ste sp e c ic at e tap a d e d e sig n a ap lic atie i. M e d iile a n v iz uale folose sc m e c anism ul se rializ rii p e ntru asig urare a p e rsiste nte i a c om p one nte lor B e an. U n asp e c t im p ortant al se rializ rii e ste c nu salv e az d oar im ag ine a unui a a a ob ie c t c i i toate re fe rinte le la alte ob ie c te p e c are ac e sta le c ontine . A c e sta s e ste un p roc e s re c usiv d e salv are a d ate lor, ntruc t c e le lalte ob ie c te le re fe rite a d e ob ie c tul c are se se rializ e az p ot re fe ri la r nd ul lor alte ob ie c te , i a a m ai a a s s d e p arte . A ad ar re fe rinte le c are c onstruie sc stare a unui ob ie c t form e az o s a ntre ag re e a, c e e a c e am n c un alg oritm g e ne ral d e salv are a strii a t nse a a a unui ob ie c t nu e ste toc m ai fac il. In c az ul c are stare a unui ob ie c t e ste form at d oar d in v alori ale unor n a v ariab ile d e tip p rim itiv , atunc i salv are a inform atiilor ap sulate ac e l nc n ob ie c t se p oate fac e i p rin salv are a p e r nd a d ate lor, folosind c lasa s a DataOutputStream, p e ntru c a ap oi s e re staurate p rin m e tod e ale c lase i a DataInputStream, d ar, a a c um am v az ut, o ase m e ne a ab ord are nu e ste s

8 .1 . F O L O SIRE A SE RIAL IZ ARII

179

g e ne ral suc ie nt, d e oare c e p ot ap re a p rob le m e c um ar : v ariab ile le n a a m e m b re ale ob ie c tului p ot instante ale altor ob ie c te , une le c m p uri p ot a fac e re fe rint la ac e la i ob ie c t, e tc . a s

S e rializ are a form at b inar a tip urilor p rim itiv e i a ob ie c te lor se re aln s iz e az p rin inte rm e d iul ux urilor d e nite d e c lase sp e c ializ ate ac e st sc op a n c u ar : ObjectOutputStream p e ntru sc rie re i ObjectInputStream p e ntru re staus rare . In c ontinuare , p rin te rm e nul seria liza re ne v om re fe ri d oar la se rializ are a form at b inar. n

8 .1.1

S erializ area tipurilor prim itive

S e rializ are a tip urilor p rim itiv e p oate re aliz at e p rin inte rm e d iul ux ua rilor DataOutputStream i DataInputStream, e c u ObjectOutputStream s i ObjectInputStream. A c e ste a im p le m e nte az inte rfe e le DataInput, re s a t sp e c tiv DataOutput c e d e c lar m e tod e d e tip ul readT ip P rim itiv , re sp e c tiv a writeT ip P rim itiv p e ntru sc rie re a/ c itire a d ate lor p rim itiv e i a irurilor d e s s c arac te re . M ai jos e ste p re z e ntat un e x e m p lu d e se rializ are 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(); Citire a inform atiilor sc rise e x e m p lul d e m ai sus se v a fac e astfe l: n FileInputStream fis = new FileInputStream("test.dat"); DataInputStream in = new DataInputStream(fis); int i = in.readInt(); double d = in.readDouble(); boolean b = in.readBoolean();

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 erializ area ob iectelor

S e rializ are a ob ie c te lor se re aliz e az p rin inte rm e d iul ux urilor d e nite d e a c lase le O b jectO utputS tream (p e ntru salv are ) i O b jectInputS tream s (p e ntru re staurare ). A c e ste a sunt ux uri d e p roc e sare , c e e a c e am na nse c v or folosite p re una c u alte ux uri p e ntru sc rie re a/ c itire a e fe c tiv a a m a d ate lor p e m e d iul e x te rn p e c are v a salv at, sau d e p e c are v a re staurat un ob ie c t se rializ at. M e c anism ul im p lic it d e se rializ are a unui ob ie c t v a salv a num e le c lase i ob ie c tului, sig natura c lase i i v alorile tuturor c m p urile se rializ ab ile ale ob ie c s a tului. R e fe rinte le la alte ob ie c te se rializ ab ile d in c ad rul ob ie c tului c ure nt v or d uc e autom at la se rializ are a ac e stora iar re fe rinte le m ultip le c tre un ac e la i a s ob ie c t sunt c od ic ate utiliz nd un alg oritm c are s p oat re fac e re e aua d e a a a t ob ie c te la ac e e a i stare c a atunc i c nd ob ie c tul orig inal a fost salv at. s a Clase le ObjectInputStream i ObjectOutputStream im p le m e nte az inte rfe e le s a t ObjectInput, re sp e c tiv ObjectOutput c are e x tind DataInput, re sp e c tiv DataOutput, c e e a c e am n c , p e l ng m e tod e le d e d ic ate se rializ rii ob ie c te lor, v or nse a a a a a e x ista i m e tod e p e ntru sc rie re a/ c itire a d ate lor p rim itiv e i a irurilor d e s s s c arac te re . M e tod e le p e ntru se rializ are a ob ie c te lor sunt: w riteO b ject, p e ntru sc rie re i s readO b ject, p e ntru re staurare .

8 .1.3

Clasa O b jectO utputS tream

S c rie re a ob ie c te lor p e un ux d e ie ire e ste un p roc e s e x tre m d e sim p lu, s se c v e nta uz ual ind c e a d e m ai jos: a ObjectOutputStream out = new ObjectOutputStream(fluxPrimitiv); out.writeObject(referintaObiect); out.flush(); fluxPrimitiv.close();

8 .1 . F O L O SIRE A SE RIAL IZ ARII

181

E x e m p lul d e m ai jos c onstruie te un ob ie c t d e tip Date i salv e az s s l a n ie rul test.ser, p re un c u un ob ie c t d e tip String. E v id e nt, ie rul s m a s re z ultat v a c ontine inform atiile re p re z e ntate form at b inar. n FileOutputStream fos = new FileOutputStream("test.ser"); ObjectOutputStream out = new ObjectOutputStream(fos); out.writeObject("Ora curenta:"); out.writeObject(new Date()); out.flush(); fos.close(); D e oare c e im p le m e nte az inte rfata DataOutput, p e l ng a m e tod a d e sc rie re a a a ob ie c te lor, c lasa p une la d isp oz itie i m e tod e d e tip ul writeT ip P rim itiv s p e ntru se rializ are a tip urilor d e d ate p rim itiv e i a irurilor d e c arac te re , asts s fe l t ap e luri c a c e le d e m ai jos sunt p e rm ise : nc a out.writeInt(12345); out.writeDouble(12.345); out.writeBoolean(true); out.writeUTF("Sir de caractere"); M e tod a writeObject arunc e x c e p ii d e tip ul IOException i d e riv ate a t s d in ac e asta, m ai p re c is NotSerializableException d ac ob ie c tul p rim it c a a arg um e nt nu e ste se rializ ab il, sau InvalidClassException d ac sunt p rob a le m e c u o c las ne c e sar p roc e sul d e se rializ are . V om v e d e a c ontinuare a a n n c un ob ie c t e ste se rializ ab il d ac e ste instant a une i c lase c e im p le m e nte az a a a a inte rfata Serializable.

8 .1.4

Clasa O b jectInputS tream

Od at c e au fost sc rise ob ie c te i tip uri p rim itiv e d e d ate p e un ux , c itire a a s ac e stora i re c onstruire a ob ie c te lor salv ate se v a fac e p rintr-un ux d e intrare s d e tip ObjectInputStream. A c e sta e ste d e ase m e ne a un ux d e p roc e sare i v a tre b ui asoc iat c u un ux p e ntru c itire a e fe c tiv a d ate lor, c um ar s a FileInputStream p e ntru d ate salv ate ntr-un ie r. S e c v e nta uz ual p e ntru s a d e se rializ are e ste c e a d e m ai jos: ObjectInputStream in = new ObjectInputStream(fluxPrimitiv); Object obj = in.readObject(); //sau

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(); Citire a inform atiilor sc rise e x e m p lul d e m ai sus se v a fac e astfe l: n 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 se rv at c m e tod a readObject are tip ul re turnat Object, c e e a a c e am n c tre b uie re aliz at e x p lic it c onv e rsia la tip ul c ore sp unz ator nse a a a ob ie c tului c itit: Date date = in.readObject(); // gresit Date date = (Date)in.readObject(); // corect

A tentie Ca i la c e le lalte ux uri d e d ate c are im p le m e te az inte rfata DataInput s a c itire a d intr-un ux d e ob ie c te tre b uie s se fac e x ac t ord ine a c are a a a n n ac e ste a au fost sc rise , altfe l v or ap re a e v id e nt e x c e p ii p roc e sul d e d e se a t n rializ are .

Clasa ObjectInputStream im p le m e nte az inte rfata DataInput d e c i, p e a l ng m e tod a d e c itire a ob ie c te lor, c lasa p une la d isp oz itie i m e tod e d e a a s tip ul readT ip P rim itiv p e ntru c itire a tip urilor d e d ate p rim itiv e i a irurilor s s d e c arac te re . int i = in.readInt(); double d = in.readDouble(); boolean b = in.readBoolean(); String s = in.readUTF();

8 .2 . O B IE CT E SE RIAL IZ AB IL E

183

8 .2

O b iecte serializ ab ile

U n ob ie c t e ste se rializ ab il d ac i num ai d ac c lasa d in c are fac e p arte im as a p le m e nte az inte rfata S erializ ab le. A ad ar, d ac d orim c a instante le une i a s a c lase s p oat se rializ ate , c lasa re sp e c tiv tre b uie s im p le m e nte z e , d ire c t a a a a sau ind ire c t, inte rfata Serializable.

8 .2 .1

Im plem entarea interfetei S erializ ab le

Inte rfata Serializable nu c ontine nic i o d e c laratie d e m e tod sau c onstant, a a sing urul e i sc op ind d e a id e ntic a c lase le ale c ror ob ie c te sunt se rializ ab ile . a D e nitia sa c om p le t e ste : a package java.io; public interface Serializable { // Nimic ! } D e c larare a c lase lor ale c ror instante tre b uie s e se rializ ate e ste a ad ar a a s e x tre m d e sim p l, ind fc ut p rin sim p la im p le m e ntare a inte rfe e i Serializable: a a a t public class ClasaSerializabila implements Serializable { // Corpul clasei } Oric e sub c las a une i c lase se rializ ab ile e ste la r nd ul e i se rializ ab il, a a a ntruc t im p le m e nte az ind ire c t inte rfata Serializable. a a In situatia c are d orim s d e c larm o c las se rializ ab il d ar sup e rc lasa n a a a a sa nu e ste se rializ ab il, atunc i tre b uie s av e m v e d e re urm toare le luc ruri: a a n a V ariab ile le ac c e sib ile ale sup e rc lase i nu v or se rializ ate , ind re sp onsab ilitate a c lase i c ure nte d e a asig ura un m e c anism p rop riu p e ntru salv are a/ re staurare a lor. A c e st luc ru v a d isc utat se c iune a re fe ritoare n t la p e rsonaliz are a se rializ rii. a S up e rc lasa tre b uie s aib ob lig atoriu un c onstruc tor ac c e sib il fr ara a aa g um e nte , ac e sta ind utiliz at p e ntru initializ are a v ariab ile lor m o te nite s p roc e sul d e re staurare al unui ob ie c t. V ariab ile le p rop rii v or n initializ ate c u v alorile d e p e ux ul d e intrare . In lip sa unui c onstruc tor ac c e sib il fr arg um e nte p e ntru sup e rc las, v a g e ne rat o e x c e p ie la aa a a t e x e c utie .

184

CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

In p roc e sul se rializ rii, d ac e ste alnit un ob ie c t c are nu im p le m e nte az a a nt a inte rfata Serializable atunc i v a g e ne rat o e x c e p ie d e tip ul NotSerializableException a t c e v a id e ntic a re sp e c tiv a c las ne se rializ ab il. a a

8 .2 .2

Controlul serializ rii a

E x ist c az uri c nd d orim c a une le v ariab ile m e m b re ale unui ob ie c t s nu e a a a salv ate autom at p roc e sul d e se rializ are . A c e ste a sunt c az uri c om une atunc i n c nd re sp e c tiv e le c m p uri re p re z int inform atii c ond e ntiale , c um ar p aa a a role , sau v ariab ile te m p orare p e c are nu are rost s le salv m . Ch iar d e c larate a a p riv ate c ad rul c lase i ac e ste c m p uri p artic ip la se rializ are . P e ntru c a un n a a c m p s nu e salv at p roc e sul d e se rializ are e l tre b uie d e c larat c u m od ia a n c atorul transient i tre b uie s e ne -static . D e e x e m p lu, d e c larare a une i s a v ariab ile m e m b re te m p orare ar tre b ui fac ut astfe l: a transient private double temp; // Ignorata la serializare M od ic atorul static anule az e fe c tul m od ic atorului transient. Cu a alte c uv inte , v ariab ile le d e c las p artic ip ob lig atoriu la se rializ are . a a static transient int N; // Participa la serializare In e x e m p le le urm toare c m p urile m arc ate D A p artic ip la se rializ are , a a a c e le m arc ate N U , nu p artic ip iar c e le m arc ate c u E x c e p tie v or p rov oc a a e x c e p ii d e tip ul NotSerializableException. t L isting 8.1: M od ic atorii static i transie nt s
import java . io .*; public class Test1 implements Serializable { int x =1; transient int y =2; transient static int z =3; static int t =4; // DA // NU // DA // DA

public String toString () { return x + " , " + y + " , " + z + " , " + t ; } }

8 .2 . O B IE CT E SE RIAL IZ AB IL E

185

D ac un ob ie c t c e tre b uie se rializ at are re fe rinte la ob ie c te ne se rializ ab ile , a atunc i v a g e ne rat o e x c e p ie d e tip ul NotSerializableException. a t L isting 8.2: M e m b rii ne se rializ ab 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 nd o c las se rializ ab ila d e riv a d intr-o alt c las, salv are a c m p urilor a a a a a c lase i p rinte se v a fac e d oar d ac i ac e asta e ste se rializ ab il. In c az c ontrar, a as a sub c lasa tre b uie s salv e z e e x p lic it i c m p urile m o te nite . a s a s L isting 8.3: S e rializ are a c m p urilor m o te nite a s
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

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 e ste d e sc risa o ap lic atie c are e fe c tue az salv are a i re staurare a a s unor ob ie c te d in c e le tre i c lase p re z e ntate m ai sus. L isting 8.4: T e stare a se rializ rii a
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 ( Cl as sNo tF oun dE xc ept io n 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 ( N o t Se r i a li z a bl e E x ce p t io n e ) {

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R


System . out . println ( " Obiect neserializabil : " + e ) ; } test ( new Test3 () ) ; } }

187

R e z ultatul ac e stui p rog ram v a : A fost A fost Obiect A fost A fost salvat obiectul: 1, 2, 3, 4 restaurat obiectul: 1, 0, 3, 4 neserializabil: java.io.NotSerializableException: A salvat obiectul: 1, 2 restaurat obiectul: 0, 2

8 .3

P ersonaliz area serializ rii ob iectelor a

D e z av antajul m e c anism ului im p lic it d e se rializ are e ste c alg oritm ul p e c are a se b e az e az , ind c re at p e ntru c az ul g e ne ral, se p oate c om p orta ine c ie nt a n anum ite situatii: p oate m ult m ai le nt d e c t e ste c az ul sau re p re z e ntare a a b inar g e ne rat p e ntru un ob ie c t p oate m ult m ai v olum inoas d e c t ar a a a a tre b ui. In ac e ste situatii, p ute m s a nloc uim alg oritm ul im p lic it c u unul p rop riu, p artic ulariz at p e ntru o c las anum e . D e ase m e ne a, e ste p osib il a s e x tind e m c om p ortam e ntul im p lic it, ad ug nd i alte inform atii ne c e sare a a a s p e ntru se rializ are a unor ob ie c te . In m ajoritate a c az urilor m e c anism ul stand ard e ste suc ie nt a, d up c um ns a am sp us, o c las p oate av e a ne v oie d e m ai m ult c ontrol asup ra se rializ rii. a a P e rsonaliz are a se rializ arii se re aliz e az p rin d e nire a ( a ntr-o c las se riala iz ab il!) a m e tod e lor writeObject i readObject av nd ex act sig natura d e a s a m 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 c ontrole az c e d ate sunt salv ate iar readObject a c ontrole az m od ul c are sunt re staurate ob ie c te le , c itind inform atiile salv ate a n i, e v e ntual, m od ifc nd stare a ob ie c te lor c itite astfe l t e le s c ore sp und s a nc a a a

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 c az ul c are nu d orim s n a nloc uim c om p le t m e c anism ul stand ard , p ute m s folosim m e tod e le defaultW riteO b ject, re sp e c tiv a defaultR eadO b ject c are d e sc riu p roc e d urile im p lic ite d e se rializ are . Form a g e ne ral d e im p le m e ntare a m e tod e lor writeObject i readObject a s e 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 i readObject sunt re sp onsab ile c u se rializ are a s c lase i c are sunt d e nite , se rializ are a sup e rc lase i sale ind fac ut autom at n a ( i im p lic it). D ac a o c las tre b uie sa- i c oord one z e se rializ are a p ros a ns a s p rie c u se rializ are a sup e rc lase i sale , atunc i tre b uie s im p le m e nte z e inte rfata a Externalizable.

8 .3 .1

Controlul versiunilor claselor

S p re sup une m c d orim s re aliz m o ap lic atie c are s in e v id e nta ang ajatilor a a a a at a une i c om p anii. E v id e nt, v om av e an ne v oie d e o c las c are s re p re z inte a a

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R

189

notiune a d e a n gja t. O v ariant sim p lic at a ac e ste ia ar p ute a arta astfe l: a a a L isting 8.5: P rim a v ariant a c lase i A ng ajat a
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 e ste p re z e ntat o m ic ap lic atie c are p e rm ite introd uc e re a d e a a ang ajati i salv are a lor s ntr-un ie r. L a e c are p ornire a ap lic atie i, v or s c itite d ate le d in ie r astfe l t p rog ram ul v a ac tualiz a p e rm ane nt lista s nc a n a ang ajatilor c u noi p e rsoane . L isting 8.6: A p lic atia 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 ) ;

190

CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R


ang = ( ArrayList ) in . readObject () ; } catch ( File NotFo undEx cepti on 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 () ;

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 c are se p une ac um e ste urm toare a. D up introd uc e re a unui a a num r suc ie nt d e m are d e ang ajati ie r, c lasa Angajat e ste m od ia n s c at p rin ad ug are a une i noi v ariab il m e m b re c are s re ina a d resa . L a a a a a t e x e c utia ap lic atie i noastre , p roc e d ura d e c itire a ang ajatilor d in ie r nu s v a m ai func iona, p rod uc nd o e x c e p ie d e tip ul InvalidClassException. t a t A c e astp rob le m ar ap rut ch iar d ac v ariab ila ad ug at e ra d e c larat d e a a a a a a a tip transient. D e c e se am p l ac e st luc ru ? nt a E x p lic atia c onst fap tul c m e c anism ul d e se rializ are J av a e ste foarte a n a ate nt c u sig natura c lase lor se rializ ate . P e ntru e c are ob ie c t se rializ at e ste c alc ulat autom at un num r re p re z e ntat p e 64 d e b iti, c are re p re z int un fe l d e a a am p re nt a c lase i ob ie c tului. A c e st num r, d e num it serialV ersionU ID , a a e ste g e ne rat p ornind d e la d iv e rse inform atii ale c lase i, c um ar v ariab ile le sale m e m b re , (d ar nu num ai) i e ste salv at p roc e sul d e se rializ are p re un s n m a c u c e le lalte d ate . In p lus, oric e m od ic are se m nic ativ a c lase i, c um ar a ad ug are a unui nou c m p , v a d e te rm ina m od ic are a num rului su d e a a a a v e rsiune . L a re staurare a unui ob ie c t, num rul d e v e rsiune salv at form a se rializ at a n a v a re g sit i c om p arat c u noua se m ntur a c lase i ob ie c tului. In c az ul a s a a n c are ac e ste a nu sunt e g ale , v a g e ne rat o e x c e p ie d e tip ul a t InvalidClassException i d e se rializ are a nu v a fc ut. s a a A c e ast ab ord are e x tre m d e p re c aut e ste foarte util p e ntru p re v e nire a a a a unor anom alii c e p ot ap re a c nd d ou v e rsiuni d e c lase sunt inc om p atia a a b ile , d at p oate sup rtoare atunc i c nd m od ic rile ad use c lase i nu stric aa a a a c om p atib ilitate a c u v e ch e a v e rsiune . In ac e ast situatie tre b uie s c om ua a nic m e x p lic it c c e le d ou c lase sunt c om p atib ile . A c e st luc ru se re aliz e az a a a a p rin se tare a m anual a v ariab ile i serialVersionUID c ad rul c lase i d orite , a n ad ug nd p ur i sim p lu c m p ul: a a s a

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 e nta 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 rialz are c nu m ai c alc ule z e num rul d e se rie al c lase i, a a c i s-l folose asc p e c e l sp e c ic at d e noi. Cum p ute m a a a num rul d e se a a ns a rie al v e ch ii c lase Angajat c are a fost folosit ante rior la salv are a ang ajatilor a ? U tilitarul serialV er p e rm ite g e ne rare a num rului serialVersionUID p e na tru o c las sp e c ic at. A ad ar, tre b uie s re c om p ilm v e ch e a c las Angajat a a s a a a i s-i a m num rul d e se rie astfe l: serialVer Angajat. R e z ultatul v a : s a a a Angajat: static final long serialVersionUID = 5653493248680665297L; V om re sc rie noua c las Angajat astfe l t s e c om p atib il c u c e a a nc a a a v e ch e astfe l: L isting 8.7: V ariant c om p atib il a c lase i A ng ajat a a
import java . io .*; class Angajat implements Serializable { static final long serialVersionUID = 5653493248680665297 L ; 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 lic atia noastr v a func iona ac um , a rub ric a a d res nu v a initializ at a t ns a a nic i un fe l (v a null), d e oare c e e a nu e x ista form atul orig inal. L a noua n n

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 se rializ ate i inform atiile le g ate d e ad re s (e v id e nt, s a tre b uie a s le c itim d e la tastatur...) ns a a

8 .3 .2

S ecuriz area datelor

D up c um am v z ut m e m b rii p riv ati, c um ar p a ro la d in e x e m p lul d e m ai a a sus, p artic ip la se rializ are . P rob le m a c onst fap tul c , d e i form at a a n a s n b inar, inform atiile unui ob ie c t se rializ at nu sunt c rip tate nic i un fe l i p ot n s re g site c u u urint, c e e a c e p oate re p re z e nta un inc onv e nie nt atunc i c nd a s a a e x ist c m p uri c ond e ntiale . a a R e z olv are a ac e ste i p rob le m e se fac e p rin m od ic are a m e c anism ului im p lic it d e se rializ are , im p le m e nt nd m e tod e le readO b ject i w riteO b ject, a s p re c um i p rin utiliz are a une i func ii d e c rip tare a d ate lor. V arianta se c urs t iz at a c lase i Angajat d in e x e m p lul ante rior ar p ute a arta astfe l: a a L isting 8.8: V arianta se c uriz at a c lase i A ng ajat a
import java . io .*; class Angajat implements Serializable { static final long serialVersionUID = 5653493248680665297 L ; 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 () ;

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 , C la ssN ot Fou nd Exc ep ti on { stream . defaultReadObject () ; parola = criptare ( parola , -3) ; } }

8 .3 .3

Im plem entarea interfetei E x ternaliz ab le

P e ntru un c ontrol c om p le t, e x p lic it, al p roc e sului d e se rializ are , o c las tre a b uie s im p le m e nte z e inte rfata E x ternaliz ab le. P e ntru instante ale ac e stor a c lase d oar num e le c lase i e ste salv at autom at p e ux ul d e ob ie c te , c lasa ind re sp onsab il c u sc rie re a i c itire a m e m b rilor si i tre b uie s se c oord one z e a s a s a c u sup e rc lase le e i. D e nitia inte rfe e i Externalizable e ste : t package java.io; public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws IOException; public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; } A ad ar, ac e ste c lase tre b uie s im p le m e nte z e ob lig atoriu m e tod e le w rites a E x ternal i readE x ternal c are se v a fac e se rializ are a c om p le t a ob ie c te lor s n a i c oord onare a c u sup e rc lasa e i. s U z ual, inte rfata Externalizable e ste folosit situatii c are se d ore te a n n s b unt ire a p e rform ante lor alg oritm ului stand ard , m ai e x ac t c re te re a v ite z e i m a at s p roc e sului d e se rializ are .

8 .3 . PE RSO NAL IZ ARE A SE RIAL IZ ARII O B IE CT E L O R

195

M ai jos e ste p re z e ntat o c las sim p l i m od alitate a d e re sc rie re a sa a a a s folosind inte rfata Externalizable: L isting 8.9: S e rializ are im p lic it a
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 rializ are 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 () ; } }

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 tie c nu p ute m c op ia v aloare a unui ob ie c t p rin instruc iune a d e atrib uire . s a t O se c v e nta d e form a: TipReferinta o1 = new TipReferinta(); TipReferinta o2 = o1; nu fac e d e c t s d e c lare o nou v ariab il o2 c a re fe rinta la ob ie c tul re fe rit d e a a a a o1 i nu c re e az sub nic i o form un nou ob ie c t. s a a O p osib ilitate d e a fac e o c op ie a unui ob ie c t e ste folosire a m e tod e i clone d e nit c lasa Object. A c e asta c re e az un nou ob ie c t i initializ e az toate a n a s a v ariab ile le sale m e m b re c u v alorile ob ie c tului c lonat. TipReferinta o1 = new TipReferinta(); TipReferinta o2 = (TipReferinta) o1.clone(); D e c ie nta ac e ste i m e tod e e ste c nu re aliz e az d up lic are a a a ntre g ii re e le t d e ob ie c te c ore sp unz toare ob ie c tului c lonat. In c az ul c are e x ist c m p uri a n a a re fe rinta la alte ob ie c te , ob ie c te le re fe rite nu v or m ai c lonate la r nd ul lor. a O m e tod clone c are s re aliz e z e o c op ie e fe c tiv a unui ob ie c t, p re una a a a m c u c op ie re a tuturor ob ie c te lor re fe rite d e c m p urile ac e lui ob ie c t p oate a im p le m e ntat p rin m e c anism ul se rializ rii astfe l: a a 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) {

8 .4 . CL O NARE A O B IE CT E L O R System.out.println(e); return null; } }

197

198

CAPIT O L UL 8 . SE RIAL IZ ARE A O B IE CT E L O R

Capitolul 9 Interfata g ra c cu utiliz atorul a


9 .1 Introducere

Inte rfata g rac c u utiliz atorul (G U I), e ste un te rm e n c u e le s larg c are a nt se re fe r la toate tip urile d e c om unic are vizu a l a a ntre un p rog ram i utiliz as torii si. A c e asta e ste o p artic ulariz are a inte rfe e i c u utiliz atorul (U I), p rin a t c are v om le g e c onc e p tul g e ne ric d e inte rac iune d intre p rog ram i utiliz ante t s tori. L im b ajul J av a p une la d isp oz itie num e roase c lase p e ntru im p le m e ntare a d iv e rse lor func ionalitati U I, a ne v om oc up a c ontinuare d e c e le c are t ns n p e rm it re aliz are a inte fe e i g rac e c u utiliz atorul (G U I). t D e la ap aritia lim b ajului J av a, b ib liote c ile d e c lase c are ofe r se rv ic ii a g rac e au sufe rit p rob ab il c e le m ai m ari sch im b ri tre c e re a d e la o v e ra n siune la alta. A c e st luc ru se d atore az , p e d e o p arte d ic ult ii le g ate d e a at im p le m e ntare a notiunii d e p ortab ilitate , p e d e alt p arte ne v oii d e a inte g ra a m e c anism e le G U I c u te h nolog ii ap rute i d e z v oltate ulte rior, c um ar J a va a s B ea n s. In m om e ntul ac tual, e x ist d ou m od alit i d e a c re a o ap lic atie c u a a at inte rfat g rac i anum e : a as A W T (A b strac t W ind ow ing T oolk it) - e ste A P I-ul initial p us la d isp oz itie e p nd c u p rim e le v e rsiuni d e J av a; nc 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 ation Classe s) c re at urm a c olab orrii d intre S un, N e tsc ap e i IB M , n a s S w ing se b az e az p e m od e lul A W T , e x tinz nd func ionalitate a ac e stuia a a t i ad ug nd sau s a a nloc uind c om p one nte p e ntru d e z v oltare a ap lic atiilor G U I. 199

200

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

A ad ar, e ste d e p re fe rat c a ap lic atiile J av a s e c re ate folosind te h nolog ia s a S w ing , ac e asta p un nd la d isp oz itie o p ale t m ult m ai larg d e fac ilit i, a a a at a nu v om re nunta c om p le t la A W T d e oare c e aic i e x ist c lase e se ntiale , ns a re utiliz ate S w ing . n In ac e st c ap itol v om p re z e nta c lase le d e b az i m e c anism ul d e tratare a as e v e nim e nte lor d in A W T , d e oare c e v a sim p lic at p roc e sul d e e le g e re a nt d e z v oltrii une i ap lic atii G U I, d up c are v om fac e tre c e re a la S w ing . a a In p rinc ip iu, c re are a une i ap lic atii g rac e p re sup une urm toare le luc ruri: a D esig n Cre are a une i sup rafe e d e a are (c um ar o fe re astr) p e c are v or t s a a e z ate ob ie c te le g rac e (c om p one nte ) c are se rv e sc la c om unis c are a c u utiliz atorul (b utoane , c ontroale p e ntru e d itare a te x te lor, liste , e tc ); Cre are a i a e z are a c om p one nte lor p e sup rafata d e a are la p oz itiile s s s c ore sp unz toare ; a F unctionalitate D e nire a unor ac iuni c are tre b uie s se e x e c ute m om e ntul c nd t a n a utiliz atorul inte rac ione az c u ob ie c te le g rac e ale ap lic atie i; t a A sc ultare a e v e nim e nte lor g e ne rate d e ob ie c te m om e ntul n inte rac iunii c u utiliz atorul i e x e c utare a ac iunilor c ore sp unz toare , t s t a a a c um au fost e le d e nite . s

9 .2

M odelul A W T

P ach e tul c are ofe r c om p one nte A W T e ste java.aw t. a Ob ie c te le g rac e sunt d e riv ate d in Com ponent, c u e x c e p ia m e niurilor c are t d e sc ind d in c lasa M enuCom ponent. A ad ar, p rin notiune a d e c om p one nt s a v om le g e c ontinuare oric e ob ie c t c are p oate av e a o re p re z e ntare g rac nte n a i c are p oate inte rac tiona c u utiliz atorul. E x e m p le d e c om p one nte sunt fe re s stre le , b utoane le , liste le , b are d e d e lare , e tc . T oate c om p one nte le A W T sunt d e nte d e c lase p rop rii c e se g ase sc p ach e tul java.awt, c lasa Component n ind sup e rc lasa ab strac t a tuturor ac e stor c lase . a Cre are a ob ie c te lor g rac e nu re aliz e az autom at i a are a lor p e e c ran. a s s M ai ai e le tre b uie a e z ate p e o su p ra fa ta d e a a re , c are p oate o fe re astr nt s s a

9 .2 . M O D E L UL AW T

201

sau un ap p le t, i v or d e v e ni v iz ib ile m om e ntul c are sup rafata p e c are sunt s n n a ate v a v iz ib il. O astfe l d e sup rafat p e c are sunt p lasate c om p one nte s a a se m ai num e te co n ta in er i re p re z int o instant a une i c lase d e riv ate d in s s a a Container. Clasa Container e ste o sub c las ap arte a lui Component, ind a la r nd ul e i sup e rc lasa tuturor sup rafe te lor d e a are J av a. a s A a c um am v z ut, inte rfat g rac se rv e te inte rac iunii c u utiliz atorul. s a a a s t D e c e le m ai m ulte ori p rog ram ul tre b uie s fac o anum it p re luc rare a a a n m om e ntul c are utiliz atorul a e fe c tuat o ac iune i, p rin urm are , c om p on t s ne nte le tre b uie s g e ne re z e e v e nim e nte func ie d e ac iune a p e c are au a n t t sufe rit-o (ac iune transm is d e la tastatur, m ouse , e tc .). Inc e p nd c u v e rt a a a siune a 1.1 a lim b ajului J av a, e v e nim e nte le sunt instante ale c lase lor d e riv ate d in A W T E vent. A ad ar, un even im en t e ste p rod us d e o ac iune a utiliz atorului asup ra unui s t ob ie c t g rac , d e c i e v e nim e nte le nu tre b uie g e ne rate d e p rog ram ator. In sch im b , ntr-un p rog ram tre b uie sp e c ic at c od ul c are se e x e c ut la ap aritia a unui e v e nim e nt. T ratare a e v e nim e nte lor se re aliz e az p rin inte rm e d iul unor a c lase d e tip listen er (asc ulttor, c onsum ator d e e v e nim e nte ), c lase c are sunt a d e nite p ach e tul java.aw t.event. In J av a, oric e c om p one nt p oate c onn a sum a e v e nim e nte le g e ne rate d e o alt c om p one nt (v e z i T ratare a e v e nia a m e nte lor ). S c onsid e rm un m ic e x e m p lu, c are c re m o fe re astr c e c ontine d ou a a n a a a b utoane . L isting 9.1: O fe re astr c u d ou b utoane a a
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 ) ;

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 c um v e i ob se rv a la e x e c utia ac e stui p rog ram , at t b utoane le ad ug ate a t a a d e noi c t i b utonul d e a s nch id e re a fe re stre i sunt func ionale , ad ic p ot t a ap asate , d ar nu re aliz e az nim ic . A c e st luc ru se am p l d e oare c e nu am a nt a sp e c ic at nic ie ri c od ul c are tre b uie s se e x e c ute la ap sare a ac e stor b ua a a toane . D e ase m e ne a, m ai tre b uie re m arc at c nu am sp e c ic at nic ie ri d im e nsiua a nile fe re stre i sau ale b utoane lor i nic i p oz itiile ac e ste a s e p lasate . Cu s n a toate ac e ste a e le sunt p lasate unul l ng a c e lalalt, fr s se sup rap un iar a aa a a sup rafata fe re astre i e ste suc ie nt d e m are c t s c up rind am b e le ob ie c te . a a a A c e ste fe nom e ne sunt p rov oc ate d e un ob ie c t sp e c ial d e tip FlowLayout p e c are l-am sp e c ic at i c are se oc up c u g e stionare a fe re stre i i c u p lasare a s a s c om p one nte lor ntr-o anum it ord ine p e sup rafata e i. A ad ar, m od ul d e a s aranjare nu e ste o c arac te ristic a sup rafe e i d e a are c i, e c are c ontaine r a t s are asoc iat un ob ie c t c are se oc up c u d im e nsionare a i d isp une re a c om p oa s ne nte lor p e sup rafata d e a are i c are se num e ste gestio n a r d e po zitio n a re s s (la y o u t m a n a ger) (v e z i G e stionare a p oz itionrii ). a

9 .2 .1

Com ponentele A W T

D up c um am sp us d e ja, toate c om p one nte le A W T sunt d e nte d e c lase a p rop rii c e se g ase sc p ach e tul java.awt, c lasa Com ponent ind sup e rc lasa n ab strac ta a tuturor ac e stor c lase . B utton - b utoane c u e tich e ta form at d intr-un te x t p e o sing ur linie ; a a Canvas - sup rafat p e ntru d e se nare ; a Ch eck b ox - c om p one nt c e p oate av e a d ou stri; m ai m ulte ob ie c te a a a d e ac e st tip p ot g rup ate folosind c lasa Ch eck B ox G roup; Ch oice - liste c are d oar e le m e ntul se le c tat e ste v iz ib il i c are se n s d e sch id la ap sare a lor; a

9 .2 . M O D E L UL AW T

203

Container - sup e rc lasa tuturor sup rafe e lor d e a are (v e z i S up rafe e t s t d e a are ); s L ab el - e tich e te sim p le c e p ot c ontine o sing ur linie d e te x t ne e d itab il; a L ist - liste c u se le c ie sim p l sau m ultip l; t a a S crollb ar - b are d e d e lare oriz ontale sau v e rtic ale ; T ex tCom ponent - sup e rc lasa c om p one nte lor p e ntru e d itare a te x tului: T ex tF ield (p e o sing ur linie ) i T ex tA rea (p e m ai m ulte linii). a s M ai m ulte inform atii le g ate d e ac e ste c lase v or p re z e ntate se c iune a n t Folosire a c om p one nte lor A W T . D in c auz a unor d ife re nte e se ntiale im p le m e ntare a m e niurilor p e d ife rite n p latform e d e op e rare , ac e ste a nu au p utut inte g rate c a ob ie c te d e tip Component, sup e rc lasa c are d e sc rie m e niuri ind M enuCom ponent (v e z i M e niuri ).

Com p one nte le A W T au p e ste 100 d e m e tod e c om une , m o te nite d in c lasa s Component. A c e ste a se rv e sc uz ual p e ntru a are a sau se tare a atrib ute lor ob ie c te lor, c um ar : d im e nsiune , p oz itie , c uloare , font, e tc . i au form atul s g e ne ral g etP ro p rieta te, re sp e c tiv setP ro p rieta te. Ce le m ai folosite , g rup ate p e tip ul p rop rie t ii g e stionate sunt: at P oz itie getLocation, getX, getY, getLocationOnScreen setLocation, setX, setY D im ensiuni getSize, getHeight, getWidth setSize, setHeight, setWidth D im ensiuni i poz itie s getBounds setBounds Culoare (te x t i fund al) s getForeground, getBackground setForeground, setBackground

204

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

F ont getFont setFont V iz ib ilitate setVisible isVisible Interactivitate setEnabled isEnabled

9 .2 .2

S uprafete de a are (Clasa Container) s

Cre are a ob ie c te lor g rac e nu re aliz e az autom at i a are a lor p e e c ran. M ai a s s ai e le tre b uie a e z ate p e o sup rafat, c are p oate o fe re astr sau sup rafata nt s a a unui ap p le t, i v or d e v e ni v iz ib ile m om e ntul c are sup rafata re sp e c tiv s n n a v a v iz ib il. O astfe l d e sup rafata p e c are sunt p lasate c om p one nte le se a num e te su p ra fa d e a a re sau co n ta in er i re p re z int o instanta a une i c lase s ta s s a d e riv at d in Container. O p arte d in c lase le a c ror p rinte e ste Container a a a e ste p re z e ntat m ai jos: a W indow - e ste sup e rc lasa tututor fe re stre lor. D in ac e ast c las sunt a a d e riv ate : F ram e - fe re stre stand ard ; D ialog - fe re stre d e d ialog m od ale sau ne m od ale ; P anel - o sup rafat fr re p re z e ntare g rac folosit p e ntru g rup are a a a a a a altor c om p one nte . D in ac e ast c las d e riv A pplet, folosit p e ntru a a a a c re are a ap p le turilor. S crollP ane - c ontaine r folosit p e ntru im p le m e ntare a autom at a d e rulrii a a p e oriz ontal sau v e rtic al a une i c om p one nte . a a A ad ar, un c ontaine r e ste folosit p e ntru a ad ug a c om p one nte p e sup rafata s a lui. Com p one nte le ad ug ate sunt m e m orate a ntr-o list iar p oz itiile lor d in a ac e ast list v or d e ni ord ine a d e trav e rsare front-to-b ack a ac e stora a a n c ad rul c ontaine rului. D ac nu e ste sp e c ic at nic i un ind e x la ad ug are a une i a a c om p one nte , atunc i e a v a ad aug at p e ultim a p oz itie a liste i. a

9 .2 . M O D E L UL AW T

205

Clasa Container c ontine m e tod e le c om une tututor sup rafe e lor d e a are . t s D intre c e le m ai folosite , am intim : add - p e rm ite ad ug are a une i c om p one nte p e sup rafata d e a are . a s O c om p one nt nu p oate ap artine d e c t unui sing ur c ontaine r, c e e a c e a a am n c p e ntru a m uta un ob ie c t d intr-un c ontaine r altul tre b uie nse a a n sa-l e lim inam m ai ai d e p e c ontaine rul initial. nt rem ove - e lim in o c om p one nt d e p e c ontaine r; a a setL ay out - stab ile te g e stionarul d e p oz itionare al c ontaine rului (v e z i s G e stionare a p oz itionrii ); a g etInsets - d e te rm in d istanta re z e rv at p e ntru m arg inile sup rafe e i a a t d e a are ; s validate - forte az c ontaine rul s re a e z e toate c om p one nte le sale . a a s A c e ast m e tod tre b uie ap e lat e x p lic it atunc i c nd ad ug m sau e lim inm a a a a a a a c om p one nte p e sup rafata d e a are d up c e ac e asta a d e v e nit v iz ib il. s a a 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);

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 ition rii a

S c onsid e rm m ai ai un e x e m p lu d e p rog ram J av a c are a e az 5 b utoane a a nt s a p e o fe re astr: a L isting 9.2: P oz itionare a 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 Button Button Button Button b1 b2 b3 b4 b5 = = = = = new new new new new Button ( " Button 1 " ) ; Button ( " 2 " ) ; Button ( " Button 3 " ) ; Button ( " Long - Named Button 4 " ) ; Button ( " Button 5 " ) ;

f . add ( b1 ) ; f . add ( b2 ) ; f . add ( b3 ) ; f . add ( b4 ) ; f . add ( b5 ) ; f . pack () ; f . show () ; } }

Fe re astra a ata d e ac e st p rog ram v a arta astfe l: s a

S m od ic m ac um linia m arc ata c u * c a m ai jos, ls nd ne sch im b at a a aa re stul p rog ram ului: Frame f = new Frame("Flow Layout"); f.setLayout(new FlowLayout()); Fe re astra a at d up ac e ast m od ic are v a av e a o c u totul altfe l d e s a a a d isp une re a c om p one nte lor sale :

9 .3 . G E ST IO NARE A PO Z IT IO NARII

207

M otiv ul p e ntru c are c e le d ou fe re stre arat at t d e d ife rit e ste c folose sc a a a a g e stionari d e p oz itionare d ife riti: GridLayout, re sp e c tiv FlowLayout. D e nitie U n gestio n a r d e p o zitio n a re (la y o u t m a n a ger) e ste un ob ie c t c are c on trole az d im e nsiune a i aranjare a (p oz itia) c om p one nte lor unui c ontaine r. a s A ad ar, m od ul d e aranjare a c om p one nte lor p e o sup rafata d e a are s s nu e ste o c arac te ristic a c ontaine rului. Fie c are ob ie c t d e tip Container a (Applet, Frame, Panel, e tc .) are asoc iat un ob ie c t c are se oc up c u d isa p une re a c om p one nte lor p e sup rafata sa i anum e g e stionarul su d e p oz itionare . s a T oate c lase le c are instantiaz a ob ie c te p e ntru g e stionare a p oz itionrii im p le a m e nte az inte rfat L ay outM anag er. a a L a instantie re a unui c ontaine r se c re e az im p lic it un g e stionar d e p oz itionare a asoc iat ac e stuia. D e e x e m p lu, p e ntru o fe re astr g e stionarul im p lic t e ste d e a tip BorderLayout, tim p c e p e ntru un p ane l e ste d e tip FlowLayout. n

9 .3 .1

F olosirea g estionarilor de poz itionare

A a c um am v z ut, oric e c ontaine r are un g e stionar im p lic it d e p oz itionare s a un ob ie c t c are im p le m e ne az inte rfata LayoutManager, ac e sta ind u-i ata at a s autom at la c re are a sa. In c az ul c are ac e sta nu c ore sp und e ne c e sit ilor n at noastre , e l p oate sch im b at c u u urint. Ce i m ai utiliz ati g e stionari d in s a p 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

208

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

P e l ng ac e tia, m ai e x ist i c e i d in m od e lul S w ing c are v or p re z e ntati a a s as c ap itolul d e d ic at d e z v oltrii d e ap lic atii G U I folosind S w ing . n a A ta are a e x p lic it a unui g e stionar d e p oz itionare la un c ontaine r se fac e s a c u m e tod a setL ay out a c lase i Container. M e tod a p oate p rim i c a p aram e tru oric e instant a une i c lase c are im p le m e nte az inte rfat LayoutManager. a a a S e c v e nta d e ata are a unui g e stionar p e ntru un c ontaine r, p artic ulariz at s a p e ntru 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 le az g e ne ral m e tod e ale g e stionarilor d e p oz itionare , a n d ar c az ul c nd av e m ne v oie d e ob ie c tul g e stionar p ute m ob ine c u m e tod a n a l t g etL ay out d in c lasa Container. U na d in fac ilit ile c e le m ai utile ofe rite d e g e stionarii d e p oz itionare at e ste re aranjare a c om p one nte le unui c ontaine r atunc i c nd ac e sta e ste re d a im e sionat. P oz itiile i d im e nsiunile c om p one nte lor nu sunt x e , e le ind s ajustate autom at d e c tre g e stionar la e c are re d im e nsionare astfe l t s a nc a a oc up e c t m ai e ste tic sup rafata d e a are . Cum sunt d e te rm inate a a s ns d im e nsiunile im p lic ite ale c om p one nte lor ? Fie c are c las d e riv at d in Component p oate im p le m e nta m e tod e le g etP rea a ferredS iz e, g etM inim um S iz e i g etM ax im um S iz e c are s re turne z e d is a m e nsiune a im p lic it a c om p one nte i re sp e c tiv e i lim ite le afara c rora c om a s n a p one nta nu m ai p oate d e se nat. G e stionarii d e p oz itionare v or ap e la ac e ste a m e tod e p e ntru a c alc ula d im e nsiune a la c are v or a a o c om p one nt. s a S unt a situatii c nd d orim s p lasm c om p one nte le la anum ite p oz itii ns a a a x e iar ac e ste a s ram na ac olo ch iar d ac re d im e nsionm c ontaine rul. Folosind a a a a un g e stionar ac e ast p o zitio n a re a bso lu t a c om p one nte lor nu e ste p osib il i a a as d e c i tre b uie c um v a s re nuntm la g e stionare a autom at a c ontaine rul. A c e st a a a luc ru se re aliz e az p rin trim ite ra arg um e ntului null m e tod e i setLayout: a // pozitionare absoluta a componentelor in container container.setLayout(null); Folosind p oz itionare a ab solut, nu v a m ai a suc ie nt s ad ug am c u a ns a a m e tod a add c om p one nte le c ontaine r, c i v a tre b ui s sp e c ic m p oz itia i n a a s

9 .3 . G E ST IO NARE A PO Z IT IO NARII

209

d im e nsiune a lor - ac e st luc ru e ra fc ut autom at d e g e stionarul d e p oz itionare . a container.setLayout(null); Button b = new Button("Buton"); b.setSize(10, 10); b.setLocation (0, 0); container.add(b); In g e ne ral, se re c om and folosire a g e stionarilor d e p oz itionare toate a n situatiile c nd ac e st luc ru e ste p osib il, d e oare c e p e rm it p rog ram ului s aib a a a ac e e a i s nfatisare ind ife re nt d e p latform a i re z olutia p e c are e ste rulat. s P oz itionare a ab solut p oate rid ic a d iv e rse p rob le m e ac e st se ns. a n

S analiz am c ontinuare p e e c are d in g e stionarii am intiti ante rior. a n

9 .3 .2

G estionarul F low L ay out

A c e st g e stionar a e az c om p one nte le p e sup rafata d e a are ux liniar, m ai s a s n p re c is, c om p one nte le sunt ad ug ate una d up alta p e linii, lim ita sp atiului a a n d isp onib il. In m om e ntul c nd o c om p one nt nu m ai ap e p e linia c ure nt se a a nc a tre c e la urm toare a linie , d e sus jos. A d ug are a c om p one nte lor se fac e d e a n a la st ng a la d re ap ta p e linie , iar alinie re a ob ie c te lor c ad rul une i linii p oate a n d e tre i fe luri: la st ng a, la d re ap ta i p e c e ntru. Im p lic it, c om p one nte le a s sunt c e ntrate p e e c are linie iar d istanta im p lic it a ntre c om p one nte e ste d e 5 p ix e li p e v e rtic al i 5 p e oriz ontal. as a E ste g e stionarul im p lic it al c ontaine re lor d e riv ate d in c lasa Panel d e c i i s al 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 " ) ;

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 one nte le fe re stre i v or a ate astfe l: s

R e d im e nsion nd fe re astra astfe l t c e le c inc i b utoane s nu m ai ap a nc a a nc a p e o linie , ultim e le d intre e le v or tre c ute p e linia urm toare : a

9 .3 .3

G estionarul B orderL ay out

G e stionarul BorderLayout p arte sup rafata d e a are c inc i re g iuni, c ore m s n sp unz toare c e lor p atru p unc te c ard inale i c e ntrului. O c om p one nt p oate a s a p lasat oric are d in ac e ste re g iuni, d im e niune a c om p one nte i ind c alc ulata a n astfe l t s oc up e nc a a ntre g sp atiul d e a are ofe rit d e re g iune a re sp e c tiv . s a P e ntru a ad ug a m ai m ulte ob ie c te g rac e a ntr-una d in c e le c inc i z one , e le tre b uie g rup ate p re alab il n ntr-un p ane l, c are v a am p lasat ap oi re g iune a n d orit (v e z i G rup are a c om p one nte lor - c lasa P ane l ). a A ad ar, la ad ug are a une i c om p one nte p e o sup rafat g e stionat d e BorderLayout, s a a a m e tod a add v a m ai p rim i p e l ng a re fe rinta c om p one nte i i z ona c are a s n ac e asta v a am p lasat, c are v a sp e c ic at p rin una d in c onstante le c lase i: a a NORTH, SOUTH, EAST, WEST, CENTER. BorderLayout e ste g e stionarul im p lic it p e ntru toate c ontaine re le c are d e sc ind d in c lasa Window, d e c i al tuturor tip urilor d e fe re stre .

9 .3 . G E ST IO NARE A PO Z IT IO NARII 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 f . add ( new f . add ( new f . add ( new f . add ( new f . pack () ; f . show () ; } } Button ( " Nord " ) , BorderLayout . NORTH ) ; Button ( " Sud " ) , BorderLayout . SOUTH ) ; Button ( " Est " ) , BorderLayout . EAST ) ; Button ( " Vest " ) , BorderLayout . WEST ) ; Button ( " Centru " ) , BorderLayout . CENTER ) ;

211

Ce le c inc i b utoane ale fe re stre i v or a ate astfe l: s

L a re d im e nsionare a fe re stre i se p ot ob se rv a urm toare le luc ruri: nord ul i a s sud ul se re d im e nsione az d oar p e oriz ontal, e stul i v e stul d oar p e v e rtic al, a a s a tim p c e c e ntrul se re d im e nsione az at t p e oriz ontal c t i p e v e rtic al. n a a a a s a R e d im e nsionare a c om p one nte lor d in e c are z on se fac e astfe l t e le oc up a nc a a toat z ona c ontaine rului d in c are fac p arte . a

9 .3 .4

G estionarul G ridL ay out

G e stionarul GridLayout org aniz e az c ontaine rul c a un tab e l c u r nd uri i a a s c oloane , c om p one nte le ind p lasate c e lule le tab e lului d e la st ng a la n a d re ap ta, e p nd c u p rim ul r nd . Ce lule le tab e lului au d im e nsiuni e g ale nc a a iar o c om p one nt p oate oc up a d oar o sing ur c e lul. N um rul d e linii i a a a a s c oloane v or sp e c ic ate c onstruc torul g e stionarului, d ar p ot m od ic ate n

212

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

i ulte rior p rin m e tod e le setRows, re sp e c tiv setCols. D ac num rul d e linii s a a sau c oloane e ste 0 (d ar nu am b e le ac e la i tim p ), atunc i c om p one nte le v or n s p lasate ntr-o sing ur c oloan sau linie . D e ase m e ne a, d istanta a a ntre c om p one nte p e oriz ontal i d istanta as ntre r nd urile tab e lului p ot sp e c ic ate a c onstruc tor sau stab ilite ulte rior. n 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 f . add ( new f . add ( new f . add ( new f . add ( new f . add ( new f . pack () ; f . show () ; } } Button ( " 1 " ) ) ; Button ( " 2 " ) ) ; Button ( " 3 " ) ) ; Button ( " 4 " ) ) ; Button ( " 5 " ) ) ; Button ( " 6 " ) ) ;

Ce le ase b utoane ale fe re stre i v or p lasate p e tre i r nd uri i d ou s a s a c oloane , astfe l:

R e d im e nsionare a fe re stre i v a d e te rm ina re d im e nsionare a tuturor c e lule lor i d e c i a tuturor c om p one nte lor, at t p e oriz ontal c t i p e v e rtic al. s a a a s a

9 .3 .5

G estionarul CardL ay out

G e stionarul CardLayout trate az c om p one nte le ad ug ate p e sup rafata sa a a ntr-o m anie r sim ilar c u c e a a d isp une rii c rtilor d e joc a a a ntr-un p ach e t.

9 .3 . G E ST IO NARE A PO Z IT IO NARII

213

S up rafata d e a are p oate ase m nat c u p ach e tul d e c rti iar e c are c om s a a a p one nt e ste o c arte d in p ach e t. L a un m om e nt d at, num ai o sing ur c om a a p one nt e ste v iz ib il ( c e a d e d e asup ra ). a a Clasa d isp une d e m e tod e p rin c are s p oat a at o anum it c om a a s a a p one nt d in p ach e t, sau s se p oat p arc urg e se c v e ntial p ach e tul, ord ine a a a a c om p one nte lor ind inte rn g e stionarului. a P rinc ip ala utilitate a ac e stui g e stionar e ste utiliz are a m ai e c ie nt a a sp atiului d isp onib il situatii c are c om p one nte le p ot g rup ate a a n n n s fe l t utiliz atorul s inte rac ione z e la un m om e nt d at d oar c u un anum it nc a a t g rup (o c arte d in p ach e t), c e le lalte ind asc unse . O c las S w ing c are im p le m e nte az un m e c ansim sim ilar e ste JTabbedPane. a a 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 () ;

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 c arte e ste v iz ib il a

A d oua c arte e ste v iz ib il a

9 .3 .6

G estionarul G ridB ag L ay out

E ste c e l m ai c om p le x i e x ib il g e stionar d e p oz itionare d in J av a. L a fe l c a s n c az ul g e stionarului GridLayout, sup rafata d e a are e ste c onsid e rat c a ind s a un tab e l a, sp re d e ose b ire d e ac e sta, num rul d e linii i d e c oloane sunt ns a s d e te rm inate autom at, func ie d e c om p one nte le am p lasate p e sup rafata d e n t a are . D e ase m e ne a, func ie d e c om p one nte le g e stionate , d im e nsiunile s n t c e lule lor p ot d ife rite c u sing ure le re stric ii c a p e ac e e a i linie s aib ac e e a i t s a a s im e , iar p e c oloan aib ac e e a i l im e . S p re d e ose b ire d e GridLayout, nalt a a s at o c om p one nt p oate oc up a m ai m ulte c e lule ad iac e nte , ch iar d e d im e nsiuni a d ife rite , z ona oc up at ind re fe rit p rin re g iune a d e a are a c om p one nte i a a s re sp e c tiv e . P e ntru a sp e c ic a m od ul d e a are a une i c om p one nte , ac e ste ia e ste s i asoc iat un ob ie c t d e tip G ridB ag Constraints, c are se sp e c ic d ife rite n a p rop rie t i ale c om p one nte i re fe ritoare la re g iune a s d e a are i la m od ul at a s s c are v a p lasat ac e ast re g iune . L e g tura d intre o c om p one nt i un n a n a a as ob ie c t GridBagConstraints se re aliz e az p rin m e tod a setConstraints: a GridBagLayout gridBag = new GridBagLayout();

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 ad ar, s nainte d e a ad ug a o c om p one nt p e sup rafata unui c ontaine r a a c are are un g e stionar d e tip GridBagLayout, v a tre b ui s sp e c ic m anum iti a a p aram e tri (c onstr ng e ri) re fe ritori la c um v a p lasat c om p one nta re sp e c a a tiv . A c e ste c onstr ng e ri v or sp e c ic ate p rin inte rm e d iul unui ob ie c t d e tip a a GridBagConstraints, c are p oate re folosit p e ntru m ai m ulte c om p one nte c are au ac e le a i c onstr ng e ri d e a are : s a s gridBag.setConstraints(componenta1, c); gridBag.setConstraints(componenta2, c); . . . Ce le m ai utiliz ate tip uri d e c onstr ng e ri p ot sp e c ic ate p rin inte rm e d iul a urm toare lor v ariab ile d in c lasa GridBagConstraints: a gridx, gridy - c e lula c e re p re z int c oltul st ng a sus al c om p one nte i; a a gridwidth, gridheight - num rul d e c e lule p e linie i c oloan p e c are a s a v a a at c om p one nta; s a fill - folosit p e ntru a sp e c ic a d ac o c om p one nt v a oc up a a a a ntre g sp atiul p e c are are d e stinat; v alorile p osib ile sunt HORIZONTAL, VERTICAL, l BOTH, NONE; insets - d istante le d intre c om p one nt i m arg inile sup rafe e i sale d e as t a are ; s anchor - folosit atunc i c nd c om p one nta e ste m ai m ic d e c t sup rafata a a a a sa d e a are p e ntru a forta o anum it d isp une re a sa: nord , sud , e st, s a v e st, e tc . weigthx, weighty - folosite p e ntru d istrib utia sp atiului lib e r; uz ual au v aloare a 1;

216

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Ca e x e m p lu, s re aliz m o fe re astr c a g ura d e m ai jos. P e ntru a a a a n sim p lic a c od ul, a fost c re at o m e tod re sp onsab il c u se tare a v alorilor a a a gridx, gridy, gridwidth, gridheight i ad ug are a une i c om p one nte c u s a re stric iile stab ilite p e fe re astr. t a

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;

9 .3 . G E ST IO NARE A PO Z IT IO NARII
gbc . insets = new Insets (5 , 5 , 5 , 5) ; f . setLayout ( gridBag ) ;

217

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 () ; } }

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 lasare a c om p one nte lor d ire c t p e sup rafata d e a are p oate d e v e ni inc om od s a c az ul c are av e m m ulte ob ie c te g rac e . D in ac e st m otiv , se re c om and n n a g rup are a c om p one nte lor nrud ite c a func ii astfe l t s p ute m sig uri c , t nc a a a ind ife re nt d e g e stionarul d e p oz itionare al sup rafe e i d e a are , e le se v or g si t s a p re un. G rup are a c om p one nte lor se fac e panel-uri. m a n U n p a n el e ste c e l m ai sim p lu m od e l d e c ontaine r. E l nu are o re p re z e ntare v iz ib il, rolul su ind d e a ofe ri o sup rafat d e a are p e ntru c om p one nte a a a s g rac e , inc lusiv p e ntru alte p ane l-uri. Clasa c are instantiaz a ac e ste ob ie c te e ste P anel, e x te nsie a sup e rc lase i Container. P e ntru a aranja c ore sp unz tor a c om p one nte le g rup ate ntr-un p ane l, ac e stuia i se p oate sp e c ic a un g e stionar d e p oz itionare anum e , folosind m e tod a setLayout. G e stionarul im p lic it p e n tru c ontaine re le d e tip Panel e ste FlowLayout. A ad ar, o aranjare e c ie nt a c om p one nte lor une i fe re stre am n: s a nse a g rup are a c om p one nte lor nfratite (c are nu tre b uie s e d e sp artite a d e g e stionarul d e p oz itionare al fe re stre i) p ane l-uri; n aranjare a c om p one nte lor unui p ane l, p rin sp e c ic are a unui g e stionar d e p oz itionare c ore sp unz tor; a aranjare a p ane l-urilor p e sup rafata fe re stre i, p rin sp e c ic are a g e stionaru lui d e p oz itionare al fe re stre i. L isting 9.8: G rup are a c om p one nte 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 " ) ) ;

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 iune a utiliz atorului asup ra une i c om p ot ne nte g rac e i re p re z int m e c anism ul p rin c are utiliz atorul c om unic e fe c tiv s a a c u p rog ram ul. E x e m p le d e e v e nim e nte sunt: ap sare a unui b uton, m od ia c are a te x tului ntr-un c ontrol d e e d itare , nch id e re a sau re d im e nsionare a une i fe re stre , e tc . Com p one nte le c are g e ne re az anum ite e v e nim e nte se m ai a num e sc i su rse d e even im en te. s Inte rc e p tare a e v e nim e nte lor g e ne rate d e c om p one nte le unui p rog ram se re aliz e az p rin inte rm e d iul unor c lase d e tip listener (asc ulttor, c onsum ator a a d e e v e nim e nte ). In J av a, oric e ob ie c t p oate c onsum a e v e nim e nte le g e ne rate d e o anum it c om p one nt g rac . a a a

A ad ar, p e ntru a sc rie c od c are s se e x e c ute m om e ntul c are utiliz as a n n torul inte rac tione az c u o c om p one nt g rac tre b uie s fac e m urm toare le a a a a a luc ruri: s sc rie m o c las d e tip liste ne r c are s asc ulte e v e nim e nte le p rod use a a a d e ac e a c om p one nt i c ad rul ac e ste i c lase s im p le m e ntm m e tod e a s n a a sp e c ic e p e ntru tratare a lor;

220

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

s c om unic m c om p one nte i surs c re sp e c tiv a c lasa asc ult e v e nia a a a i a m e nte le p e c are le g e ne re az , c u alte c uv inte s g istrm ac e a c las a a nre a a d re p t c onsum ator al e v e nim e nte lor p rod use d e c om p one nta re sp e c tiv . a E v e nim e nte le sunt, c a oric e altc e v a J av a, ob ie c te . Clase le c are d e sc riu n ac e ste ob ie c te se p art m ai m ulte tip uri func ie d e c om p one nta c are m n n t le g e ne re az , m ai p re c is func ie d e ac iune a utiliz atorului asup ra ac e ste ia. a n t t P e ntru e c are tip d e e v e nim e nt e x ist o c las c are instantiaz ob ie c te d e a a a ac e l tip . D e e x e m p lu, e v e nim e ntul g e ne rat d e ac ionare a unui b uton e ste t d e sc ris d e c lasa ActionEvent, c e l g e ne rat d e m od ic are a unui te x t d e c lasa TextEvent, e tc . T oate ac e ste c lase sunt d e riv ate d in sup e rc lasa A W T E vent, lista lor c om p le t ind p re z e ntat ulte rior. a a O c las c onsum atoare d e e v e nim e nte (liste ne r) p oate oric e c las c are a a sp e c ic a d e c laratia sa c d ore te s asc ulte e v e nim e nte d e un anum it n a s a tip . A c e st luc ru se re aliz e az p rin im p le m e ntare a une i inte rfe e sp e c ic e a t e c rui tip d e e v e nim e nt. A stfe l, p e ntru asc ultare a e v e nim e nte lor d e tip a ActionEvent c lasa re sp e c tiv tre b uie s im p le m e nte z e inte rfata ActionListener, a a p e ntru TextEvent inte rfat c are tre b uie im p le m e ntata e ste TextListener, a e tc . T oate ac e ste inte rfe e sunt d e riv ate d in E ventL istener. t Fie c are inte rfat d e ne te una sau m ai m ulte m e tod e c are v or ap e late a s autom at la ap aritia unui e v e nim e nt: 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 t o c las p oate im p le m e nta oric te inte rfe e , e a v a p ute a s asc ulte a a a t a e v e nim e nte d e m ai m ulte tip uri:

9 .4 . T RAT ARE A E V E NIM E NT E L O R class Ascultator implements ActionListener, TextListener { public void actionPerformed(ActionEvent e) { ... } public void textValueChanged(TextEvent e) { ... } }

221

V om v e d e a c ontinuare m e tod e le e c re i inte rfe e p e ntru a ti c e tre b uie n a t s s im p le m e nte z e o c las c onsum atoare d e e v e nim e nte . a a A a c um am sp us m ai d e v re m e , p e ntru c a e v e nim e nte le une i c om p one nte s s e inte rc e p tate d e c tre o instant a une i c lase asc ulttor, ac e ast c las a a a a a a tre b uie g istrata lista asc ulttorilor c om p one nte i re sp e c tiv e . A m sp us nre n a lista, d e oare c e e v e nim e nte le une i c om p one nte p ot asc ultate d e oric te c lase , a c u c ond itia c a ac e ste a s e g istrate la c om p one nta re sp e c tiv . Inre g is a nre a trare a une i c lase lista asc ulttorilor une i c om p one nte se fac e c u m e tod e n a d in c lasa Component d e tip ul addT ip E ven im en tL istener, iar e lim inare a e i d in ac e ast list c u rem oveT ip E v en im en tL istener. a a

S um ariz nd , tratare a e v e nim e nte lor J av a se d e sf oar astfe l: a n as a Com p one nte le g e ne re az e v e nim e nte c nd c e v a inte re sant se am p l; a a nt a S urse le e v e nim e nte lor p e rm it oric re i c lase s asc ulte e v e nim e nte le a a sale p rin m e tod e d e tip addXXXListener, und e XXX e ste un tip d e e v e nim e nt; O c las c are asc ult e v e nim e nte tre b uie s im p le m e nte z e inte rfe e sp e c ia a a t c e e c rui tip d e e v e nim e nt - ac e ste a d e sc riu m e tod e c e v or ap e late a autom at la ap aritia e v e nim e nte lor.

9 .4 .1

E x em plu de tratare a evenim entelor

Inainte d e a d e talia asp e c te le p re z e ntate m ai sus, s c onsid e rm un e x e m p lu a a d e tratare a e v e nim e nte lor. V om c re a o fe re astr c are s c ontin d ou b ua a a a toane c u num e le OK , re p e c tiv Canc e l . L a ap sare a e c rui b uton v om a a sc rie p e b ara d e titlu a fe re stre i m e sajul A ti ap asat b utonul ... . L isting 9.9: A sc ultare a e v e nim e nte lor a d ou b utoane a
import java . awt .*; import java . awt . event .*;

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 e ste ob lig atoriu s d e nim c lase sp e c iale p e ntru asc ultare a e v e nia m e nte lor. In e x e m p lul d e m ai sus am d e nit c lasa Ascultator p e ntru a inte rc e p ta e v e nim e nte le p rod use d e c e le d ou b utoane i d in ac e st m otiv a a s tre b uit s trim ite m c a p aram e tru c onstruc torului c lase i o re fe rinta la fe re asa tra noastr. M ai sim p lu ar fost s folosim ch iar c lasa Fereastra p e ntru a a a trata e v e nim e nte le p rod use d e c om p one nte le sale . V om m od ic a p utin i s

9 .4 . T RAT ARE A E V E NIM E NT E L O R

223

ap lic atia p e ntru a p une e v id e nta o alt m od alitate d e a d e te rm ina c om n a p one nta g e ne ratoare a unui e v e nim e nt - m e tod a g etS ource. L isting 9.10: T ratare a e v e nim e nte lor fe re str n a
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 () ; } }

224

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

A ad ar, oric e c las p oate asc ulta e v e nim e nte d e oric e tip c u c ond itia s s a a im p le m e nte z e inte rfe e le sp e c ic e ac e lor tip uri d e e v e nim e nte . t

9 .4 .2

T ipuri de evenim ente

E v e nim e nte le se p art d ou c ate g orii: d e n ivel jo s i sem a n tice . m n a s

E venim entele de nivel jos re p re z int o inte rac iune d e niv e l jos c um ar a t o ap sare d e tast, m i c are a m ouse -ului, sau o op e ratie asup ra une i fe re stre . a a s In tab e lul d e m ai jos sunt e num e rate c lase le c e d e sc riu ac e ste e v e nim e nte i s op e ratiunile e fe c tuate (asup ra une i c om p one nte ) c are le g e ne re az : a ComponentEvent ContainerEvent FocusEvent KeyEvent MouseEvent WindowEvent A sc und e re , d e p lasare , re d im e nsionare , a are s A d ug are p e c ontaine r, e lim inare a Ob ine re , p ie rd e re fouc s t A p sare , e lib e rare taste , tastare a Op e ratiuni c u m ouse -ul: c lick , d rag , e tc . Op e ratiuni asup ra fe re stre lor: m inim iz are , m ax im iz are ,e tc .

O anum it ac iune a utiliz atorului p oate g e ne ra m ai m ulte e v e nim e nte . a t D e e x e m p lu, tastare a lite re i A v a g e ne ra tre i e v e nim e nte : unul p e ntru ap sare , unul p e ntru e lib e rare i unul p e ntru tastare . In func ie d e ne c e a s t sit ile ap lic atie p ute m sc rie c od p e ntru tratare a e c rui e v e nim e nt p arte . at a n

E venim entele sem antice re p re z int inte rac iune a c u o c om p one nt a t a G U I: ap sare a unui b uton, se le c tare a unui artic ol d intr-o list, e tc . Clase le a a c are d e sc riu ac e ste tip uri d e e v e nim e nte sunt: ActionEvent AdjustmentEvent ItemEvent TextEvent A c ionare t A justare a une i v alori S ch im b are a strii a S ch im b are a te x tului

9 .4 . T RAT ARE A E V E NIM E NT E L O R

225

U rm torul tab e l p re z int c om p one nte le A W T i tip urile d e e v e nim e nte a a s g e ne rate , p re z e ntate sub form a inte rfe e lor c ore sp unz toare . E v id e nt, e v e nit a m e nte le g e ne rate d e o sup e rc las, c um ar Component, se v or re g si i p e ntru a a s toate sub c lase le sale . Component ComponentListener FocusListener KeyListener MouseListener MouseMotionListener ContainerListener WindowListener ActionListener

Container Window Button List MenuItem TextField Choice Checkbox List CheckboxMenuItem Scrollbar TextField TextArea

ItemListener

AdjustmentListener TextListener

Ob se rv ati c d e i e x ist o sing ur c las MouseEvent, e x ist d ou inte rfe e a s a a a a a t asoc iate MouseListener i MouseMotionListener. A c e st luc ru a fost fc ut s a d e oare c e e v e nim e nte le le g ate d e d e p lasare a m ouse -ului sunt g e ne rate foarte fre c v e nt i re c e p ionare a lor p oate av e a un im p ac t ne g ativ asup ra v ite z e i d e s t e x e c utie , situatia c nd tratare a ac e stora nu ne inte re se az i d orim s n a a s a tratm d oar e v e nim e nte d e tip c lick , d e e x e m p lu. a

Oric e c las c are trate az e v e nim e nte tre b uie s im p le m e nte z e ob lig atoriu a a a m e tod e le inte rfe e lor c ore sp unz toare . T ab e lul d e m ai jos p re z int, p e ntru t a a e c are inte rfat, m e tod e le p use la d isp oz itie i c are tre b uie im p le m e ntate d e a s c tre c lasa asc ulttor. a a

226

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Interfat a ActionListener AdjustmentListener ComponentListener

ContainerListener FocusListener ItemListener KeyListener

MouseListener

MouseMotionListener TextListener

WindowListener

M etode actionPerformed(ActionEvent e) adjustmentValueChanged(AdjustmentEvent e) componentHidden(ComponentEvent e) componentMoved(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e) componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e) focusGained(FocusEvent e) focusLost(FocusEvent e) itemStateChanged(ItemEvent e) keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) textValueChanged(TextEvent e) windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e)

In c az ul c are un ob ie c t liste ne r trate az e v e nim e nte d e ac e la i tip p rov on a s c ate d e c om p one nte d ife rite , e ste ne c e sar s p ute m a a, c ad rul une ia d in a n m e tod e le d e m ai sus, c are e ste sursa e v e nim e ntului p e c are tratm p e nl a tru a p ute a re ac iona c onse c int. T oate tip urile d e e v e nim e nte m o te ne sc t n a s m e tod a g etS ource c are re turne az ob ie c tul re sp onsab il c u g e ne rare a e v e nia m e ntului. In c az ul c are d orim s d ife re ntie m d oar tip ul c om p one nte i surs, n a a

9 .4 . T RAT ARE A E V E NIM E NT E L O R p ute m folosi op e ratorul 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 } ... } }

227

P e l ng getSource, ob ie c te le c e d e sc riu e v e nim e nte p ot p une la d isp oz itie a a i alte m e tod e sp e c ic e c are p e rm it a are a d e inform atii le g ate d e e v e nim e ns tul g e ne rat. D e e x e m p lu, ActionEvent c ontine m e tod a getActionCommand c are , im p lic it, re turne az e tich e ta b utonului c are a fost ap sat. A stfe l d e a a p artic ularit i v or p re z e ntate m ai d e taliat se c iunile d e d ic ate e c re i at n t a c om p one nte p arte . n

9 .4 .3

F olosirea adaptorilor i a claselor anonim e s

A m v az ut c o c las c are trate az e v e nim e nte d e un anum it tip tre b uie s im a a a a p le m e nte z e inte rfata c ore sp unz toare ac e lui tip . A c e asta am n c tre b uie a nse a a s im p le m e nte z e ob lig atoriu toate m e tod e le d e nite d e ac e a inte rfat, ch iar a a d ac nu sp e c ic nic i un c od p e ntru une le d intre e le . S unt a situatii c nd a a ns a ac e st luc ru p oate d e v e ni sup rator, m ai ale s atunc i c nd nu ne inte re se az a a a d e c t o sing ura m e tod a inte rfe e i. a a t U n e x e m p lu sug e stiv e ste urm torul: o fe re astr c are nu are sp e c ic at c od a a p e ntru tratare a e v e nim e nte lor sale nu p oate nch is c u b utonul stand ard a

228

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

m arc at c u x d in c oltul d re ap ta sus i nic i c u c om b inatia d e taste A lt+ F4. s P e ntru a re aliz a ac e st luc ru tre b uie inte rc e p tat e v e nim e ntul d e nch id e re a fe re stre i m e tod a windoClosing i ap e lat m e tod a dispose d e n s a nch id e re a fe re stre i, sau System.exit p e ntru te rm inare a p rog ram ului, c az ul c nd n a e ste v orb a d e fe re astra p rinc ip al a ap lic atie i. A c e asta am n c tre b uie a nse a a s im p le m e ntm inte rfata WindowListener c are are nu m ai p utin d e apte a a s m e tod e . L isting 9.11: Im p le m e ntare a inte rfe e i WindowListener t
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 se rv ati c tre b uie s im p le m e ntm toate m e tod e le inte rfe e i, ch iar d ac a a a t a nu sc rie m nic i un c od p e ntru une le d intre e le . S ing ura m e tod c are ne inte re a se az e ste windowClosing, c are sp e c ic m c e tre b uie fc ut atunc i c nd a n a a a utiliz atorul d ore ste s a nch id fe re astra. P e ntru a e v ita sc rie re a inutil a a a

9 .4 . T RAT ARE A E V E NIM E NT E L O R

229

ac e stor m e tod e , e x ist o se rie d e c lase c are im p le m e nte az inte rfe e le d e tip a a t liste ne r fr a sp e c ic a nic i un c od p e ntru m e tod e le lor. A c e ste c lase se aa num e sc adaptori. U n a d a p to r e ste o c las ab strac t c are im p le m e nte az o anum it inte rfat a a a a a fr a sp e c ic a c od nic i une i m e tod e a inte rfe e i. aa t S c op ul une i astfe l d e c lase e ste c a la c re are a unui asc ulttor d e e v e nia m e nte , loc s im p le m e nt o anum it inte rfat i im p lic it toate m e tod e le n a a a a s sale , s e x tind e m ad ap torul c ore sp unz tor inte rfe e i re sp e c tiv e (d ac are !) a a t a i s sup rad e nim d oar m e tod e le c are ne inte re se az (c e le c are v re m s s a a n a sc rie m o anum it se c v e nt d e c od ). a a D e e x e m p lu, ad ap torul inte rfe e i WindowListener e ste WindowAdapter t iar folosire a ac e stuia e ste d at e x e m p lul d e m ai jos: a n L isting 9.12: E x tind e re a 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 e ste i m od alit i d e tratare a e v e nim e nte lor e ste re at d uc e re a c od ului p rog ram ului, ac e sta d e v e nind m ult m ai liz ib il. Ins e x ist i a as d ou d e z av antaje m ajore . D up c um ati ob se rv at fatd e e x e m p lul ante rior, a a a

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 e oare c e e a e x tind e d e ja c lasa Frame i d in ac e st m otiv am c onstruit o nou c las num it Ascultator. s a a a V om v e d e a a c ac e st d e z av antaj p oate e lim inat p rin folosire a une i c lase ns a anonim e . U n alt d e z av antaj e ste c oric e g re e al d e sintax d e c larare a une i m e tod e a s a a n a inte rfe e i nu v a p rod uc e o e roare d e c om p ilare d ar nic i nu v a sup rad e ni t m e tod a inte rfe e i c i, p ur i sim p lu, v a c re a o m e tod a c lase i re sp e c tiv e . t s a 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 inte rfe e lor d e tip liste ne r t - se ob e rv c o inte rfat XXXListener are un ad ap tor d e tip ul XXXAdapter. a a a Inte rfe e le c are nu au un ad ap tor sunt c e le c are d e ne sc o sing ur m e tod i t a as p rin urm are c re are a une i c lase ad ap tor nu are rostul. si Interfata ActionListener AdjustemnrListener ComponentListener ContainerListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener A daptor nu are nu are ComponentAdapter ContainerAdapter FocusAdapter nu are KeyAdapter MouseAdapter MouseMotionAdapter nu are WindowAdapter

S tim c o c las inte rn e ste o c las d e c larat c ad rul alte i c lase , iar a a a a a n c lase le anonim e sunt c lase inte rne folosite p e ntru instantie re a unui sing ur ob ie c t d e un anum it tip . U n e x e m p lu tip ic d e folosire a lor e ste instantie re a

9 .4 . T RAT ARE A E V E NIM E NT E L O R

231

ad ap torilor d ire c t c orp ul une i c lase c are c ontine c om p one nte ale c ror n a e v e nim e nte tre b uie tratate . L isting 9.13: Folosire a ad ap torilor i a c lase lor anonim e s
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 . ad dM ous eM oti on Li ste ne r ( 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) ; } }) ;

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 c um am v z ut sup rafe e le d e a are ale c om p one nte lor sunt e x te nsii a a t s ale c lase i Container. O c ate g orie ap arte a ac e stor c ontaine re o re p re z int a fe re stre le . A c e ste a sunt d e sc rise d e c lase d e riv ate d in W indow , c e le m ai utiliz ate ind F ram e i D ialog . s O ap lic atie J av a c u inte fat g rac v a form at d in una sau m ai m ulte a a a fe re stre , una d intre e le ind num it ferea stra p rin cip a l . a a

9 .5 .1

Clasa W indow

Clasa Window e ste rar utiliz at m od d ire c t d e oare c e p e rm ite d oar c re are a a n unor fe re stre c are nu au ch e nar i nic i b ar d e m e niuri. E ste util atunc i s a a c nd d orim s a am fe re stre c are nu inte rac ione az c u utiliz atorul c i d oar a a s t a ofe r anum ite inform atii. a M e tod e le m ai im p ortante ale c lase i Window, c are sunt d e altfe l m o te nite s d e toate sub c lase le sale , sunt d ate d e m ai jos: show - fac e v iz ib il fe re astra. Im p lic it, o fe re astr nou c re at nu e ste a a a v iz ib il; a hide - fac e fe re astra inv iz ib il fr a o d istrug e a; p e ntru a re d e v e ni a aa ns v iz ib ila se p oate ap e la m e tod a show;

9 .5 . F O L O SIRE A F E RE ST RE L O R isShowing - te ste az d ac fe re astra e ste v iz ib il sau nu; a a a

233

dispose - nch id e ) fe re astra i i e lib e re az toate re surse le ac e ste ia; s s a pack - re d im e nsione az autom at fe re astra la o sup rafata op tim c are a a s c up rind toate c om p one nte le sale ; tre b uie ap e lat g e ne ral d up a a a n a ad ug are a tuturor c om p one nte lor p e sup rafata fe re stre i. a getFocusOwner - re turne az c om p one nta fe re stre i c are are foc us-ul a (d ac fe re astra e ste ac tiv ). a a

9 .5 .2

Clasa F ram e

E ste d e riv at a c lase i Window i e ste folosit p e ntru c re are a d e fe re stre ind e a s a p e nd e nte i func ionale , e v e ntual c ontin nd o b ar d e m e niuri. Oric e ap lic atie s t a a c u inte rfat g rac c onttine c e l p utin o fe re astr, c e a m ai im p ortant ind a a a a num it i ferea stra p rin cip a l . as a Construc torii uz uali ai c lase i Fram e p e rm it c re are a une i fe re stre c u sau fr titlu, initial inv iz ib il. P e ntru c a o fe re astr s d e v in v iz ib il se v a aa a a a a a ap e la m e tod a show d e nit sup e rc lasa Window. a n import java.awt.*; public class TestFrame { public static void main(String args[]) { Frame f = new Frame("Titlul ferestrei"); f.show(); } } Cre are a fe re stre lor p rin instantie re a d ire c t a ob ie c te lor d e tip Frame e ste a m ai p utin folosit. D e ob ic e i, fe re stre le unui p rog ram v or d e nite c lase a n se p arate c are e x tind c lasa Frame, c a e x e m p lul d e m ai jos: n import java.awt.*; class Fereastra extends Frame{ // Constructorul public Fereastra(String titlu) { super(titlu); ... }

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 e st m otiv , m om e ntul c are fe re astra e ste c re at d ar nic i o c om p on n a ne nt g rac nu e ste ad ug at, sup rafata d e a are a fe re tre i v a d e te rm ia a a a s nat autom ota d e g e stionarul d e p oz ittionare i v a ofe ri d oar sp atiul ne c e sar a s a rii b are i fe re stre i i g rup ului d e b utoane p e ntru m inim iz are , m ax im iz are sa s i s nch id e re . A c e la i e fe c t v om ob ine d ac o re d im e nionam i ap e lm ap oi s l t a s a m e tod a pack c are d e te rm in d im e niune a sup rafe e i d e a are func ie d e a t s n t c om p one nte le ad ug ate . a S e ob se rv d e ase m e ne a c b utonul d e a a nch id e re a fe re stre i nu e ste func ional. t T ratare a e v e nim e nte lor fe re stre i se fac e p rin im p le m e ntare a inte rfe e i WindowListener t sau, m ai uz ual, p rin folosire a unui ad ap tor d e tip WindowAdapter. S truc tura g e ne ral a une i fe re stre e ste d e sc ris d e c lasa Fereastra d in a a e x e m p lul d e m ai jos: L isting 9.14: S truc tura g e ne ral a une i fe re stre a
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) ; } }) ;

9 .5 . F O L O SIRE A F E RE ST RE L O R
// 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 () ; } }

235

P e l ng m e tod e le m o te nite d in c lasa Window, e x ist o se rie d e m e tod e a a s a sp e c ic e c lase i Fram e . D intre c e le m ai folosite am intim : getFrames - m e tod static c e re turne az lista tuturor fe re stre lor d e a a a sch ise ale une i ap lic atii; setIconImage - se te az ic onita fe re stre i; a setMenuBar - se te az b ara d e m e niuri a fe re stre i (v e z i Folosire a m e a niurilor ); setTitle - se te az titlul fe re stre i; a

236

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

setResizable - stab ile te d ac fe re astra p oate re d im e nionat d e utis a a liz ator;

9 .5 .3

Clasa D ialog

T oate inte rfe e le g rac e ofe r un tip sp e c ial d e fe re stre d e stinate p re lurii t a a unor inform atii sau a unor d ate d e la utiliz ator. A c e ste a se num e sc ferestre d e d ia lo g sau ca sete d e d ia lo g i sunt im p le m e ntate p rin inte rm e d iul c lase i s D ialog , sub c las d ire c t a c lase i Window. a a D ife re nta m ajor d intre fe re stre le d e d ialog i fe re stre le d e tip Frame a s c onst fap tul c o fe re astr d e d ialog e ste d e p e nd e nt d e o alt fe re astra a n a a a a (norm al sau tot fe re astr d e d ialog ), num it i ferea stra p rin te. Cu alte a a a s a c uv inte , fe re stre le d e d ialog nu au o e x iste nt d e sine stttoare . C nd fe ra aa a e astra p rinte e ste d istrus sunt d istruse i fe re stre le sale d e d ialog , c nd e ste a a s a m inim iz at fe re stre le sale d e d ialog sunt fc ute inv iz ib ile iar c nd e ste re staua a a rat ac e ste a sunt ad use la stare a c are se g se au m om e ntul m inim iz rii a n a n a fe re stre i p rinte . a Fe re stre le d e d ialog p ot d e d ou tip uri: a m odale: c are b loch e az ac c e sul la fe re astra p arinte m om e ntul d e a n sch id e rii lor, c um ar fe re stre le d e introd uc e re a unor d ate , d e ale g e re a unui ie r, d e se le c tare a une i op iuni, m e saje d e av e rtiz are , e tc ; s t nem odale: c are nu b loch e az ux ul d e intrare c tre fe re astra p rinte a a a - d e e x e m p lu, d ialog ul d e c utare a unui c uv nt a a ntr-un ie r, e tc . s Im p lic it, o fe re astr d e d ialog e ste ne m od al i inv iz ib il, a e x ist c ona as a ns a struc tori c are s sp e c ic e i ac e ti p aram e tri. Construc torii c lase i Dialog a s s sunt: 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)

9 .5 . F O L O SIRE A F E RE ST RE L O R

237

P aram e trul p rinte re p re z int re fe rinta la fe re astra p rinte , titlu a a a re p re z int titlul fe re stre i iar p rin arg um e ntul m od al sp e c ic m d ac fe ra a a a e astra d e d ialog c re at v a m od al (true) sau ne m od al (false - v aloare a a a a im p lic it). a Cre are a une i fe re stre d e d ialog e ste re lativ sim p la i se re aliz e az p rin s a d e riv are a c lase i Dialog. Com unic are a d intre fe re astra d e d ialog i fe re astra s sa p rinte , p e ntru c a ac e asta d in urm s p oat folosi d ate le introd use (sau a a a a op iune a sp e c ic ata) c ase ta d e d ialog , se p oate re aliz a folosind una d in t n urm toare le ab ord ri g e ne rale : a a ob ie c tul c are re p re z int d ialog ul p oate s trate z e e v e nim e nte le g e ne rate a a d e c om p one nte le d e p e sup rafata s i s se te z e v alorile unor v ariab ile as a ac c e sib ile ale fe re stre i p rinte m om e ntul c are d ialog ul e ste a n n nch e iat; ob ie c tul c are c re e az d ialog ul (fe re astra p rinte ) s se g istre z e c a a a a nre asc ulttor al e v e nim e nte lor d e la b utoane le c are d e te rm in a a nch e ie re a d ialog ului, iar fe re astra d e d ialog s ofe re m e tod e p ub lic e p rin c are a d ate le introd use s e p re luate d in e x te rior; a S c re m , d e e x e m p lu, o fe re astr d e d ialog m od al p e ntru introd uc e re a a a a a unui ir d e c arac te re . Fe re astra p rinc ip al a ap lic atie i v a p rinte le c ase te i s a a d e d ialog , v a p rim i irul d e c arac te re introd us i v a m od ic a titlul c a ind s s si ac e sta. D e sch id e re a fe re stre i d e d ialog se v a fac e la ap sare a unui b uton al a fe re stre i p rinc ip ale num it S ch im b a titlul . Ce le d ou fe re stre v or arta c a a a im ag inile d e m ai jos: n Fe re astra p rinc ip al a Fe re astra d e d ialog

L isting 9.15: Folosire a une i fe re stre d e d ialog


import java . awt .*; import java . awt . event .*; // Fereastra principala class FerPrinc extends Frame implements ActionListener {

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 " ) ;

9 .5 . F O L O SIRE A F E RE ST RE L O R
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 () ; } }

239

9 .5 .4

Clasa F ileD ialog

P ach e tul java.awt p une la d isp oz itie i un tip d e fe re astr d e d ialog folosit s a a p e ntru se le c tare a unui num e d e ie r v e d e re a rc rii sau salv rii unui s n nc a a a ie r: c lasa FileDialog, d e riv at d in Dialog. Instante le ac e ste i c lase au un s a c om p ortam e nt c om un d ialog urilor d e ac e st tip d e p e m ajoritate a p latform e lor d e luc ru, d ar form a c are v or a ate e ste sp e c ic p latform e i p e c are n s a rule az ap lic atia. a Construc torii c lase i sunt: FileDialog(Frame parinte)

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 e trul p rinte re p re z int re fe rinta fe re stre i p rinte , titlu re p re z int a a a a titlul fe re stre i iar p rin arg um e ntul m od sp e c ic m d ac rc m sau a a nc a a salv m un ie r; v alorile p e c are le p oate lua ac e st arg um e nt sunt: a s FileDialog.LOAD - p e ntru rc are , re sp e c tiv nc a FileDialog.SAVE - p e ntru 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 c re are a unui ob ie c t FileDialog ac e sta nu e ste im p lic it v iz ib il. D ac a a are a sa se fac e c u show, c ase ta d e d ialog v a m od al. D ac a are a s a a s se fac e c u setVisible(true), atunc i v a ne m od al. D up se le c tare a unui a a ie r e a v a fac ut autom at inv iz ib il. s a a P e l ng m e tod e le m o te nite d e la sup e rc lasa Dialog c lasa FileDialog a a s m ai c ontine m e tod e p e ntru ob ine re a num e lui ie rului sau d ire c torului se t s le c tat getFile, getDirectory, p e ntru stab ilire a unui c rite riu d e ltrare setFilenameFilter, e tc . S c onsid e rm un e x e m p lu c are v om ale g e , p rin inte rm e d iul unui ob ie c t a a n FileDialog, un ie r c u e x te nsia jav a . D ire c torul initial e ste d ire c torul s c ure nt, iar num e le im p lic it e ste TestFileDialog.java. N um e le ie rului s ale s v a a at la c onsol. s a L isting 9.16: Folosire a une i fe re stre 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 () {

9 .5 . F O L O SIRE A F E RE ST RE L O R
public void windowClosing ( WindowEvent e ) { System . exit (0) ; } }) ; Button b = new Button ( " Alege fisier " ) ; add (b , BorderLayout . CENTER ) ; pack () ; b . addActionListener ( this ) ; }

241

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 folosit m ai rar d e oare c e S w ing e x ist c lasa a n a JFileChooser c are ofe r m ai m ulte fac ilit i i p rin urm are v a c onstitui a at s p rim a op iune t ntr-o ap lic atie c u inte fat g rac . a a

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 e ose b ire d e c e le lalte ob ie c te g rac e c are d e riv d in c lasa Component, a c om p one nte le unui m e niu re p re z int instante ale unor c lase d e riv ate d in sua p e rc lasa ab strac t M enuCom ponent. A c e ast e x c e p ie e ste fac ut d e oare c e a a t a une le p latform e g rac e lim ite az c ap ab ilit ile unui m e niu. a at M e niurile p ot g rup ate d ou c ate g orii: n a M eniuri x e (v iz ib ile p e rm ane nt): sunt g rup ate ntr-o b ar d e m e niuri a c e c ontine c te un m e niu p e ntru e c are intrare a sa. L a r nd ul lor, a a ac e ste m e niuri c ontin artic ole c e p ot se le c tate , c om utatoare sau alte m e niuri (sub m e niuri). O fe re astr p oate av e a un sing ur m e niu x . a M eniuri de contex t (p op up ): sunt m e niuri inv iz b ile asoc iate une i fe re stre i c are se ac tiv e az uz ual p rin ap sare a b utonului d re p t al s a a m ouse -ului. O alt d ife re nt fat d e m e niurile x e c onst fap tul a a a a n c m e niurile d e c onte x t nu sunt g rup ate a ntr-o b ar d e m e niuri. a In g ura d e m ai jos e ste p us e v id e nt alc tuire a unui m e niu x : a n a a

E x e m p lul d e m ai sus c ontine o b ar d e m e niuri form at d in d ou m e niuri a a a p rinc ip ale F ile i E d it. M e niul E d it c ontine la r nd ul lui alt m e niu (sub m e niu) s a Op tio n s, artic olul U n d o i d ou c om utatoare B o ld i Ita lic. P rin ab uz d e s a s lim b aj, v om re fe ri une ori b ara d e m e niuri a une i fe re stre c a ind m e niul fe re stre i. In m od e lul A W T ob ie c te le c are re p re z int b are d e m e niuri sunt re p re z e na tate c a instante al c lase i M enuB ar. U n ob ie c t d e tip MenuBar c ontine ob ie c te d e tip M enu, c are sunt d e fap t m e niurile d e rulante p rop riu-z ise . L a r nd ul a lor, ac e ste a p ot c ontine ob ie c te d e tip M enuItem , Ch eck B ox M enuItem , d ar i alte ob ie c te d e tip Menu (sub m e niuri). s

9 .6 . F O L O SIRE A M E NIURIL O R

243

P e ntru a p ute a c ontine un m e niu, o c om p one nt tre b uie s im p le m e nte z e a a inte rfata M enuContainer. Ce l m ai ad e se a, m e niurile sunt ata ate fe re s stre lor, m ai p re c is ob ie c te lor d e tip Frame, ac e ste a im p le m e nt nd inte rfat a a MenuContainer. A ta are a une i b are d e m e niuri la o fe re astr se fac e p rin s a m e tod a addM enuB ar a c lase i Frame.

9 .6 .1

Ierarh ia claselor ce descriu m eniuri

S v e d e m c ontinuare c are e ste ie rarh ia c lase lor folosite luc rul c u m e niuri a n n i s analiz m p e r nd ac e ste c lase : s a a a

Clasa M enuCom ponent e ste o c lasa ab strac t d in c are sunt e x tinse a toate c e le lalte c lase folosite la c re are a d e m e niuri, ind sim ilar c e le ilalte a sup e rc lase ab strac te Component. MenuComponent c ontine m e tod e c u c arac te r g e ne ral, d intre c are am intim getName, setName, getFont, setFont, c u sintax a i se m nic atiile uz uale . s

Clasa M enuB ar p e rm ite c re are a b are lor d e m e niuri asoc iate une i fe re stre c ad ru d e tip Frame, ad ap t nd c onc e p tul d e b ar d e m e niuri la p latform a a a c ure nt d e luc ru. D up c um am m ai sp us, p e ntru a le g a b ara d e m e niuri la a a o anum it fe re astra tre b uie ap e lat m e tod a setMenuBar d in c lasa Frame. a a // Crearea barei de meniuri MenuBar mb = new MenuBar();

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 artic ol al unui m e niu tre b uie s e o instanta a c lase i M enua Item . Ob ie c te le ac e ste i c lase d e sc riu a ad ar op iunile ind iv id uale ale m e s t niurilor d e rulante , c um sunt Op e n , Close , E x it , e tc . O instant a a c lase i MenuItem re p re z int d e fap t un b uton sau un c om utator, c u o anum it a a e tich e t c are v a ap re a m e niu, it e v e ntual d e un ac c e le rator (ob ie c t a a n nsot a d e tip MenuShortcut) c e re p re z int c om b inatia d e taste c u c are artic olul a p oate ap e lat rap id (v e z i A c c e le ratori ).

Clasa M enu p e rm ite c re are a unui m e niu d e rulant ntr-o b ar d e m e niuri. a Op ional, un m e niu p oate d e c larat c a ind tea r-o , c e e a c e am n c t nse a a p oate d e sch is i d e p lasat c u m ouse -ul (d rag g e d ) s ntr-o alt p oz itie d e c t a a c e a orig inal ( rup t d in p oz itia sa). A c e st m e c anism e ste d e p e nd e nt d e a p latform i p oate ig norat p e une le d intre e le . Fie c are m e niu are o e tich e t, as a c are e ste d e fap t num e le su c e v a a at p e b ara d e m e niuri. A rtic ole le a s d intr-un m e niu tre b uie s ap artin c lase i MenuItem, c e e a c e am n c p ot a a nse a a instante ale une ia d in c lase le MenuItem, Menu sau CheckboxMenuItem.

Clasa Ch eck b ox M enuItem im p le m e nte az a ntr-un m e niu artic ole d e tip c om utator - c are au d ou stri log ic e (v alid at/ ne v alid at), ac ionare a ara a t tic olului d e te rm in nd tre c e re a sa d intr-o stare alta. L a v alid are a unui a n c om utator d re p tul e tich e te i sale v a a at un sim b ol g rac c are ind ic n s a ac e st luc ru; la inv alid are a sa, sim b olul g rac re sp e c tiv v a d isp re a. Clasa a CheckboxMenuItem are ac e e a i func ionalitate c u c e a a c ase te lor d e v alid are s t d e tip Checkbox, am b e le im p le m e nt nd inte rfata ItemSelectable. a

9 .6 . F O L O SIRE A M E NIURIL O R

245

S v e d e m c ontinuare c um ar arta un p rog ram c are c onstruie te un a n a s m e niu c a g ura p re z e ntat ante rior: n a

L isting 9.17: Cre are a unui m e niu


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 () ; } }

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 re a une i op iuni d intr-un m e niu se g e ne re az e un e v e nim e nt d e tip t a A ctionE vent d ac artic olul re sp e c tiv e ste d e tip MenuItem, e Item E vent a p e ntru c om utatoare le CheckboxMenuItem. A ad ar, p e ntru a ac tiv a op iunile s t unui m e niu tre b uie im p le m e ntate inte rfate le A ctionL istener sau/ i Item s L istener c ad rul ob ie c te lor c are tre b uie s sp e c ic e c od ul c e v a e x e c utat n a la ale g e re a une i op iuni i im p le m e ntate m e tod e le actionPerformed, re sp e c t s tiv itemStatChanged. Fie c rui m e niu p ute m asoc ia un ob ie c t re c e p tor a i d ife rit, c e e a c e u ure az m unc a c az ul c are ie rarh ia d e m e niuri e ste c om s a n n p le x . P e ntru a re aliz a le g tura a a ntre ob ie c tul m e niu i ob ie c tul d e tip liste ne r s tre b uie s ad aug m re c e p torul lista d e asc ulttori a m e niului re sp e c tiv , a a n a ntoc m ai c a p e oric e c om p one nt, folosind m e tod e le addActionListener, a re sp e c tiv addItemListener. A ad ar, tratare a e v e nim e nte lor g e ne rate d e ob ie c te d e tip MenuItem e ste s id e ntic c u tratare a b utoane lor, c e e a c e fac e p osib il c a unui b uton d e p e a sup rafata d e a are s c ore sp und o op iune d intr-un m e niu, am b e le c u s a i a t ac e la i num e , tratare a e v e nim e ntului c ore sp unz tor ap sarii b utonului, sau s a a ale g e rii op iunii, fc nd u-se o sing ur d at t a a a a ntr-o c las c are e ste g istrat a nre a c a re c e p tor at t la b uton c t i la m e niu. a a s Ob ie c te le d e tip CheckboxMenuItem tip se g se sc a ntr-o c ate g orie c om un a c u List, Choice, CheckBox, toate im p le m e nt nd inte rfata ItemSelectable a i d e c i tratare a lor v a fc ut la fe l. T ip ul d e op e ratie se le c tare / d e se le c tare s a a e ste c od ic at e v e nim e ntul g e ne rat d e c m p urile static e ItemEvent.SELECTED n a i ItemEvent.DESELECTED. s L isting 9.18: T ratare a e v e nim e nte lor unui m e niu
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 " ) ;

9 .6 . F O L O SIRE A M E NIURIL O R
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 () ; } }

247

9 .6 .3

M eniuri de contex t (popup)

A u fost introd use e p nd c u A W T 1.1 i sunt im p le m e ntate p rin inte rm e d iul nc a s c lase i P opupM enu, sub c las d ire c t a c lase i Menu. S unt m e niuri inv iz ib ile a a c are sunt ac tiv ate uz ual p rin ap sare a b utonului d re p t al m ouse -ului, ind a

248

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

a ate la p oz itia la c are se g se a m ouse -ul m om e ntul ap srii b utonului s a n aa su d re p t. M e tod e le d e ad ug are a artic ole lor unui m e niu d e c onte x t sunt a a m o te nite s ntoc m ai d e la m e niurile x e . PopupMenu popup = new PopupMenu("Options"); popup.add(new MenuItem("New")); popup.add(new MenuItem("Edit")); popup.addSeparator(); popup.add(new MenuItem("Exit")); A are a m e niului d e c onte x t se fac e p rin m e tod a sh ow : s popup.show(Component origine, int x, int y) i e ste d e ob ic e i re z ultatul ap sarii unui b uton al m ouse -ului, p e ntru a av e a s a ac c e s rap id la m e niu. A rg um e ntul orig ine re p re z int c om p one nta fat d e a a orig inile c re ia se v a c alc ula p oz itia d e a are a m e niului p op up . D e ob ic e i, a s re p re z int instanta fe re stre i c are se v a a a m e niul. D e oare c e inte rac iune a a n s t c u m ouse -ul e ste d e p e nd e nt d e p latform a d e luc ru, e x ist o m e tod c are a a a d e te rm in d ac un e v e nim e nt d e tip MouseEvent p oate re sp onsab il c u a a d e sch id e re a unui m e niu d e c onte x t. A c e asta e ste isPopupTrigger i e ste s d e nit c lasa MouseEvent. P oz itionare a i a are a m e niului e ste a a n s s ns re sp onsab ilitate a p rog ram atorului. M e niurile d e c onte x t nu se ad aug la un alt m e niu (b ar sau sub -m e niu) a a c i se ata e az la o c om p one nt (d e ob ic e i la o fe re astr) p rin m e tod a add s a a a a ac e ste ia. In c az ul c nd av e m m ai m ulte m e niuri p op up p e c are v re m s a a le folosim ntr-o fe re astr, tre b uie s le d e nim p e toate i, la un m om e nt a a s d at, v om ad ug a fe re stre i m e niul c ore sp unz tor d up c are v om fac e v iz ib il. a a a l D up a nch id e re a ac e stuia, v om rup e le g tura a ntre fe re astr i m e niu p rin as instruc iune a rem ove: t fereastra.add(popup1); ... fereastra.remove(popup1); fereastra.add(popup2); In e x e m p lul d e m ai jos, v om c re a un m e niu d e c onte x p e c are v om ac tiv a l la ap sare a b utonului d re p t al m ouse -ului p e sup rafata fe re stre i p rinc ip ale . a T ratare a e v e nim e nte lor g e ne rate d e un m e niu p op up se re aliz e az id e ntic c a a p e ntru m e niurile x e .

9 .6 . F O L O SIRE A M E NIURIL O R L isting 9.19: Folosire a unui m e niu d e c onte 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) ;

249

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 e ntru artic ole le unui m e nu e ste p osib il sp e c ic are a unor c om b inatii d e a taste num ite a ccelera to ri (sh ortc uts) c are s p e rm it ac c e sare a d ire c t, p rin a a a inte rm e d iul tastaturii, a op iunilor d intr-un m e niu. A stfe l, oric rui ob ie c t t a d e tip MenuItem p oate asoc iat un ob ie c t d e tip ac c e le rator, d e nit p rin i inte rm e d iul c lase i M enuS h ortcut. S ing ure le c om b inatii d e taste c are p ot juc a rolul ac c e le ratorilor sunt: Ctrl + Tasta sau Ctrl + Shift + Tasta. A trib uire a unui ac c e le rator la un artic ol al unui m e niu p oate re aliz at p rin a c onstruc torul ob ie c te lor d e tip MenuItem form a: n MenuItem(String eticheta, MenuShortcut accelerator), c a e x e m p le le n d 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 c ontinuare v or d ate e x e m p le d e folosire ale c om p one nte lor A W T , c are n s e p use e v id e ntt c t m ai m ulte d in p artic ularit ile ac e stora, p re c um a n a a at i m od ul d e tratare a e v e nim e nte lor g e ne rate . s

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 (e tich e t) re p re z int o c om p one nt p e ntru p lasare a a a a unui te x t p e o sup rafata d e a are . O e tich e t e ste form at d intr-o sing ur s a a a linie d e te x t static c e nu p oate m od ic at d e c tre utiliz ator, d ar p oate a m od ic at d in p rog ram .

L isting 9.20: Folosire a 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 ) ;

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 int o c om p one nt p e ntru p lasare a unui b ua a ton e tich e tat p e o sup rafata d e a are . T e x tul e tich e te i e ste form at d intr-o s sing ur linie . a

L isting 9.21: Folosire a 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) ) ;

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T
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 () ; } }

253

9 .7 .3

Clasa Ch eck b ox

U n ob ie c t d e tip Checkbox (c om utator) re p re z int o c om p one nt c are se a a p oate g si d ou stri: se le c tat sau ne se le c tat (on/ o ). A c iune a a n a a a a t utiliz atorului asup ra unui c om utator tre c e p e ac e sta stare a c om p le m e nl n tar c e le i c are se g se a. E ste folosit p e ntru a p re lua o anum it op iune d e a n a a t la utiliz ator.

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: Folosire a 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 ) ;

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 e ne te un g rup d e c om utatoare d in c are s d oar unul p oate se le c tat. U z ual, ac e ste c om p one nte se m ai num e sc bu to a n e ra d io . A c e ast c las nu e ste d e riv at d in Component, ofe rind d oar o a a a m od alitate d e g rup are a c om p one nte lor d e tip Checkbox.

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: Folosire a 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 ) ;

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T
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 () ; } }

257

9 .7 .5

Clasa Ch oice

U n ob ie c t d e tip Choice d e ne te o list d e op iuni d in c are utiliz atorul s a t p oate se le c ta una sing ur. L a un m om e nt d at, d in a ntre ag a list d oar o sina g ur op iune e ste v iz ib il, c e a se le c tat m om e ntul c ure nt. O c om p one nt a t a a n a Choice e ste it d e un b uton e tich e tat c u o sag e at v e rtic al la ap sare a nsot a a a a c ruia e ste a at a s a ntre ag a sa list d e e le m e nte , p e ntru c a utiliz atorul s a a p oat se le c ta o anum it op iune . a a t

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: Folosire a 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 ) ;

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T
} } } public class TestChoice { public static void main ( String args []) { Fereastra f = new Fereastra ( " Choice " ) ; f . show () ; } }

259

9 .7 .6

Clasa L ist

U n ob ie c t d e tip List d e ne te o list d e op iuni c are p oate se tat astfe l s a t a t utiliz atorul s p oat se le c ta o sing ur op iune sau m ai m ulte . T oate nc a a a a t e le m e nte le liste i sunt v iz ib ile lim ita d im e nsiunilor g rac e ale c om p one nte i. n

L isting 9.25: Folosire a 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 () {

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 () ; } }

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 e ne te o b ar d e d e lare p e v e rtic al sau s a a oriz ontal. E ste util p e ntru p une re a la d isp oz itia utiliz atorului a une i a a m od alit i sug e stiv e d e a ale g e o anum it v aloare d intr-un inte rv al. at a

L isting 9.26: Folosire a 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 . add Adjus tmen tList ener ( this ) ; } // Metoda interfetei AdjustmentListener

262

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

public void ad ju stm en tV alu eC han ge d ( 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 ata are a unor b are d e d e lare (oris z ontal si/ sau v e rtic al) oric re i c om p one nte g rac e . A c e st luc ru e ste util as a a p e ntru ac e le c om p one nte c are nu au im p le m e ntat func ionalitate a d e d e a t lare autom at, c um ar liste le (ob ie c te d in c lasa List). a

L isting 9.27: Folosire a 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) ;

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T
} }) ; 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 () ; } }

263

9 .7 .9

Clasa T ex tF ield

U n ob ie c t d e tip TextField d e ne te un c ontrol d e e d itare a te x tului p e o s sing ur linie . E ste util p e ntru inte rog are a utiliz atorului asup ra unor v alori. a

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: Folosire a 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 ) ; }

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 e ne te un c ontrol d e e d itare a te x tului p e m ai s m ulte linii. E ste util p e ntru e d itare a d e te x te , introd uc e re a unor c om e ntarii, e tc .

L isting 9.29: Folosire a c lase i TextArea


import java . awt .*;

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 . S C RO L L BA R S _ VE R T IC A L _ ON L Y ) ; 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 ) ;

9 .7 . F O L O SIRE A CO M PO NE NT E L O R AW T
} // 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 () ; } }

267

268

CAPIT O L UL 9 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

Capitolul 10 D esenarea
10 .1 Conceptul de desenare

U n p rog ram J av a c are are inte rfat g rac c u utiliz atorul tre b uie s d e se ne z e a a a p e e c ran toate c om p one nte le sale c are au o re p re z e ntare v iz ual. A c e ast a a d e se nare inc lud e c om p one nte le stand ard folosite ap lic atie p re c um i c e le n s d e nite d e c tre p rog ram ator. D e se nare a c om p one nte lor se fac e autom at i a s e ste un p roc e s c are se e x e c ut urm toare le situatii: a n a la a are a p e ntru p rim a d at a une i c om p one nte ; s a la op e ratii d e m inim iz are , m ax im iz are , re d im e nsionare a sup rafe e i d e t a are ; s c a rsp uns al une i solic itri e x p lic ite a p rog ram ului. a a M e tod e le c are c ontrole az p roc e sul d e d e se nare se g se sc c lasa Component a a n i sunt urm toare le : s a void paint(G raph ics g ) - D e se ne az o c om p one nt. E ste o m e tod a a a sup rad e nit d e e c are c om p one nt p arte p e ntru a furniz a re p re z e ntare a a a n sa g rac sp e c ic . M e tod a e ste ap e lat d e e c are d at c nd c ontinutul a a a a a c om p one nte i tre b uie d e se nat sau re d e se nat i nu v a ap e lat e x p lic it. s a void update(G raph ics g ) - A c tualiz e az stare a g rac a une i c om a a p one nte . A c iune a ac e ste i m e tod e se re aliz e az tre i p a i: t a n s 1. te rg e c om p one nta p rin sup rad e se nare a e i c u c uloare a fund alului; s 269

270

CAPIT O L UL 1 0 . D E SE NARE A 2. stab ile te c uloare a (fore g round ) a c om p one nte i; s 3. ap e le az m e tod a paint p e ntru a re d e se na c om p one nta. a

void repaint() - E x e c ut e x p lic it un ap e l al m e tod e i update p e ntru a a ac tualiz a re p re z e ntare a g rac a une i c om p one nte . a D up c um se ob se rv , sing urul arg um e nt al m e tod e lor paint i update a a s e ste un ob ie c t d e tip G raph ics. A c e sta re p re z int co n textu l gra c c are se a n e x e c ut d e se nare a c om p one nte lor (v e z i Conte x tul g rac d e d e se nare - c lasa a G rap h ic s ).

A tentie T oate d e se ne le c are tre b uie s ap ar p e o sup rafata d e d e se nare se re ala a iz e az m e tod a paint a une i c om p one nte , g e ne ral ap e lat autom at sau a n n a e x p lic it c u m e tod a repaint ori d e c te ori c om p one nta re sp e c tiv tre b uie a a re d e se nat. E x ist p osib ilitate a d e a d e se na i afara m e tod e i paint, a a a s n ns ac e ste d e se ne se v or p ie rd e la p rim a op e ratie d e m inim iz are , m ax im iz are , re d im e nsionare a sup rafe e i d e a are . t s

10 .1.1

M etoda paint

D up c um am sp us, toate d e se ne le c are tre b uie s ap ar p e o sup rafat d e a a a a a are se re aliz e az m e tod a paint a une i c om p one nte . M e tod a paint e ste s a n d e nit sup e rc lasa Component a nu are nic i o im p le m e ntare i, d in ac e st a n ns s m otiv , oric e ob ie c t g rac c are d ore te s se d e se ne z e tre b uie s o sup rad e s a a ne asc p e ntru a- i c re a p rop ria sa re p re z e ntare . Com p one nte le stand ard a s A W T au d e ja sup rad e nit ac e ast m e tod d e c i nu tre b uie s ne p re oc up e a a a a d e se nare a lor, a p ute m m od ic a re p re z e ntare a lor g rac p rin c re are a ns a une i sub c lase i sup rad e nire a m e tod e i paint, av nd a g rij s ap e lm i s a ns a a a s m e tod a sup e rc lase i c are se oc up c u d e se nare a e fe c tiv a c om p one nte i. a a In e x e m p lul d e m ai jos, re d e nim m e tod a paint p e ntru un ob ie c t d e tip Frame, p e ntru a c re a o c las c e instantiaz fe re stre p e ntru o ap lic atie a a d e m onstrativ ( c oltul st ng a sus e ste a at te x tul A p lic atie D E M O ). a n a s

1 0 .1 . CO NCE PT UL D E D E SE NARE L isting 10.1: S up rad e nire a m e tod 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 () ; } }

271

Ob se rv ati c la oric e re d im e nsionare a fe re stre i te x tul A p lic atie D E M O a v a re d e se nat. D ac d e se nare a ac e stui te x t ar fost fac ut oriund e alt a a n a p arte d e c t m e tod a paint, la p rim a re d im e nsionare a fe re stre i ac e sta s-ar a n p ie rd e . A ad ar, d e se nare a J av a tre b uie s se fac d oar c ad rul m e tod e lor s n a a n paint ale c om p one nte lor g rac e .

10 .1.2

S uprafete de desenare - clasa Canvas

In afara p osib ilit ii d e a utiliz a c om p one nte g rac e stand ard , J av a ofe r at a i p osib ilitate a c ontrolului la niv e l d e p unc t (p ix e l) p e d isp oz itiv ul g rac , s re sp e c tiv d e se nare a a d ife rite form e g rac e d ire c t p e sup rafata une i c om p o ne nte . D e i e ste p osib il, g e ne ral nu se d e se ne az la niv e l d e p ix e l d ire c t s n a p e sup rafata fe re stre lor sau a altor c ontaine re , c i v or folosite c lase d e d ic ate ac e stui sc op . In A W T a fost d e nit un tip sp e c ial d e c om p one nt num it Canvas a a (p nz d e p ic tor), al c re i sc op e ste d e a e x tins p e ntru a im p le m e nta a a a a

272

CAPIT O L UL 1 0 . D E SE NARE A

ob ie c te g rac e c u o anum it a i are . A ad ar, Canvas e ste o c las g e ne ric a nft s s a a d in c are se d e riv e az sub c lase p e ntru c re are a sup rafe e lor d e d e se nare (p lan e ). a t s P lan e le nu p ot c ontine alte c om p one nte g rac e , e le ind utiliz ate d oar c a s sup rafe e d e d e se nat sau c a fund al p e ntru anim atie . D e se nare a p e o p lan a t s se fac e p rin sup rad e nire a m e tod e i paint a ac e ste ia. Conc re t, o p la n e ste o sup rafat d re p tung h iular d e c uloare alb , p e sa a a a c are se p oate d e se na. D im e nsiunile sale im p lic ite sunt 0 i, d in ac e st m os tiv , e ste re c om and at c a o p lan a s re d e ne asc a m e tod a getPreferredSize, s a e v e ntual i getMinimumSize, getMaximumSize, d e oare c e ac e ste a v or ap e late s d e c tre g e stionarii d e p oz itionare . a E tap e le uz uale c are tre b uie p arc urse p e ntru c re are a unui d e se n, sau m ai b ine z is a une i c om p one nte c u o anum it a i are , sunt: a nft s c re are a une i p lan e d e d e se nare , ad ic o sub c las a lui Canvas; s a a re d e nire a m e tod e i paint d in c lasa re sp e c tiv ; a re d e nire a m e tod e lor getPreferredSize, e v e ntual getMinimumSize, getMaximumSize; ad ug are a p lan e i p e un c ontaine r c u m e tod a add. a s tratare a e v e nim e nte lor d e tip FocusEvent, KeyEvent, MouseEvent, ComponentEvent, d ac e ste c az ul. a D e nire a g e ne ric a une i p lan e are urm torul form at: a s a 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

1 0 .1 . CO NCE PT UL D E D E SE NARE return ...; } public Dimension getMinimumSize() { return ... } public Dimension getMaximumSize() { return ... } // Implementarea metodelor interfetelor de tip Listener ... }

273

S d e nim o p lan p e c are d e se nm un p trat i c e rc ul su c irc um sc ris, a sa a a s a c olorate d ife rite . L a e c are c lick d e m ouse , v om inte rsch im b a c e le d ou c ulori a ntre e le . L isting 10.2: Folosire a 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 () {

274
return dim ; } }

CAPIT O L UL 1 0 . D E SE NARE A

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 ra c de desenare

Inainte c a utiliz atorul s p oat d e se na, e l tre b uie s ob in un c onte x t g rac a a a t a d e d e se nare p e ntru sup rafata c re ia ap artine re g iune a p e c are se v a d e se na. a i U n co n text gra c e ste , d e fap t, un ob ie c t p rin inte rm e d iul c ruia p ute m a c ontrola p roc e sul d e d e se nare a unui ob ie c t. In g e ne ral, d e se nare a se p oate fac e : p e o p ortiune d e e c ran, la im p rim ant sau a ntr-o z on v irtual d e m e m orie . a a U n c onte x t g rac e ste sp e c ic at p rin inte rm e d iul unui ob ie c t d e tip G raph ics p rim it c a p aram e tru m e tod e le paint i update. In func ie d e d isp oz in s t tiv ul z ic p e c are se fac e a are a (e c ran, im p rim ant, p lotte r, e tc ) m e tod e le s a d e d e se nare au im p le m e ntri inte rne d ife rite , transp are nte utiliz atorului. a Clasa Graphics p une la d isp oz itie m e tod e p e ntru: p rim itiv e g rac e : d e se nare a d e g uri g e om e tric e , te x te i im ag ini s stab ilire a p rop rie t ilor c onte x tului g rac , ad ic stab ilire a: at a

1 0 .2 . CO NT E X T UL G RAF IC D E D E SE NARE c ulorii i fontului c ure nte c u c are se fac e d e se nare a, s orig inii c oord onate lor sup rafe e i d e d e se nare , t sup rafe e i c are sunt v iz ib ile c om p one nte lor d e se nate , t n m od ului d e d e se nare .

275

10 .2 .1

P ropriet ile contex tului g ra c at

L a oric e tip d e d e se nare p aram e trii le g ati d e c uloare , font, e tc . v or sp e c ic ati p e ntru c onte x tul g rac c are se fac e d e se nare a i nu v or trim i i c a arn s s g um e nte m e tod e lor re sp e c tiv e d e d e se nare . In c ontinuare , e num e rm ac e ste a p rop rie t i i m e tod e le asoc iate lor d in c lasa Graphics. at s P roprietate Culoare a d e d e se nare Fontul d e sc rie re a te x te lor Orig ine a c oord onate lor Z ona d e d e c up are (z ona c are sunt v iz ib ile d e se ne le ) n M od ul d e d e se nare M etode Color getColor() void setColor(Color c) Font getFont() void setFont(Font f) translate(int x, int y) Shape getClip() void setClip(Shape s) void setXorMode(Color c) void setPaintMode(Color c)

10 .2 .2

P rim itive g ra ce

P rin p rim itive gra ce ne v om re fe ri c ontinuare la m e tod e le c lase i Graphics, n c are p e rm it d e se nare a d e g uri g e om e tric e i te x te . s D esenarea tex telor se fac e c u uz ual c u m e tod a drawString c are p rim e te s c a arg um e nte un ir i c oltul d in st ng a-jos al te x tului. T e x tul v a d e se nat s s a c u fontul i c uloare a c ure nte ale c onte x tului g rac . s // Desenam la coordonatele x=10, y=20; drawString("Hello", 10, 20); D esenarea g urilor g eom etrice se re aliz e az c u urm toare le m e tod e : a a

276 F ig ur g eom etric a a L inie D re p tung h i sim p lu

CAPIT O L UL 1 0 . D E SE NARE A M etode drawLine drawPolyline drawRect fillRect clearRect draw3DRect fill3DRect drawRoundRect fillRoundRect drawPolygon fillPolygon drawOval fillOval drawArc fillArc

D re p tung h i c u ch e nar rid ic at sau ad nc it a D re p tung h i c u c olturi re tunjite P olig on Ov al (E lip s a A rc c irc ular sau e lip tic

M e tod e le c are e p c u ll v or d e se na g uri g e om e tric e c are au inte rinc orul c olorat, ad ic um p lut c u c uloare a c ure nt a c onte x tului d e d e se nare , a a tim p c e m e tod e le c are e p c u d raw v or d e se na d oar c onturul g urii n nc re sp e c tiv e .

10 .3

F olosirea fonturilor

D up c um v az ut, p e ntru a sc rie un te x t p e e c ran av e m d ou p osib ilit i. a a at P rim a d intre ac e ste a e ste s folosim o c om p one nt orie ntat-te x t, c um ar a a a Label, iar a d oua s ap e lm la m e tod e le c lase i Graphics d e d e se nare a a a te x te lor, c um ar drawString. Ind ife re nt d e m od alitate a ale as, p ute m a sp e c ic a p rin inte rm e d iul fonturilor c um s arate te x tul re sp e c tiv , ac e st luc ru a re aliz nd u-se p rin m e tod a setF ont e d in c lasa Component, e d in Graphics. a Ce i m ai im p ortanti p aram e tri c e c arac te riz e az un font sunt: a N um e le fontului: H e lv e tic a B old , A rial B old Italic , e tc . Fam ilia d in c are fac e p arte fontul: H e lv e tic a, A rial, e tc . D im e nsiune a fontului: altim e a sa; n S tilul fontului: ro at (b old), n clin a t (ita lic); ng s

1 0 .3 . F O L O SIRE A F O NT URIL O R M e tric a fontului.

277

Clase le c are ofe r sup ort p e ntru luc rul c u fonturi sunt F ont i F ontM etrics, a s c ontinuare ind p re z e ntate m od alit ile d e luc ru c u ac e ste a. n at

10 .3 .1

Clasa F ont

U n ob ie c t d e tip Font ap sule az inform atii d e sp re toti p aram e trii unui nc a font, m ai p utin d e sp re m e tric a ac e stuia. Construc torul uz ual al c lase i e ste c e l c are p rim e te c a arg um e nt num e le fontului, d im e nsiune a i stilul ac e stuia: s s Font(String name, int style, int size) S tilul unui font e ste sp e c ic at p rin inte rm e d iul c onstante lor: Font.PLAIN, Font.BOLD, Font.ITALIC iar d im e nsiune a p rintr-un ntre g , c a e x e m p le le n d e m ai jos: new Font("Dialog", Font.PLAIN, 12); new Font("Arial", Font.ITALIC, 14); new Font("Courier", Font.BOLD, 10); Folosire a unui ob ie c t d e tip Font se re aliz e az uz ual astfe l: a // 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 d e luc ru are instalate , la un m om e nt d at, o se rie a ntre ag d e a fonturi c are sunt d isp onib ile p e ntru sc rie re a te x te lor. L ista ac e stor fonturi se p oate ob ine astfe l: t Font[] fonturi = GraphicsEnvironment. getLocalGraphicsEnvironment().getAllFonts(); E x e m p lul urm ator a e az lista tuturor fonturilor d isp onib ile p e p lats a form a c ure nt d e luc ru. T e x tul e c rui num e d e font v a sc ris c u fontul su a a a c ore sp unz tor. a

278

CAPIT O L UL 1 0 . D E SE NARE A L isting 10.3: L uc rul c u fonturi

import java . awt .*; class Fonturi extends Canvas { private Font [] fonturi ; Dimension canvasSize = new Dimension (400 , 400) ; public Fonturi () { fonturi = GraphicsEnvironment . g e t L o c a l G r a p h i c s E n v i r o n m e n t () . 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 () ; } }

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 a are a unui ir c u m e tod a drawString tre b uie s sp e c ic m p oz itia la s s a a c are s ap ar te x tul re sp e c tiv p e e c ran. In m om e ntul c are av e m d e a at a a n s m ai m ulte iruri c onse c utiv , sau une le sub alte le , tre b uie s c alc ulm p oz itiile s a a lor d e a are func ie d e lung im e a i im e a p ix e li a c e lorlalte te x te . s n t s nalt n P e ntru ac e asta e ste folosit c lasa F ontM etrics. U n ob ie c t d in ac e ast c las a a a se c onstruie te p ornind d e la un ob ie c t d e tip Font i p une la d isp oz itie s s inform atii d e sp re d im e nsiunile p ix e li p e c are le au c arac te re le fontului n re sp e c tiv ntr-un anum it c onte x t d e d e se nare . A ad ar, un ob ie c t d e tip FontMetrics ap sule az inform atii d e sp re s nc a m etrica unui font, c u alte c uv inte d e sp re d im e nsiunile p ix e li ale c arac n te re lor sale . U tilitate a p rinc ip al a ac e ste i c lase c onst fap tul c p e rm ite a a n a p oz itionare a p re c is a te x te lor p e o sup rafat d e d e se nare , ind ife re nt d e fontul a a folosit d e ac e ste a. M e tric a unui font c onst urm toare le atrib ute p e c are le au c arac te re le a n a sale : L inia d e b az : e ste linia d up c are sunt aliniate c arac te re le unui font; a a L inia d e asc e nd e nt: linia sup e rioara p e c are nu o d e p ase ste nic i un a c arac te r d in font L inia d e d e sc e nd e nt: linia infe rioar sub c are nu c ob oar nic i un c ara a a ac te r d in font; A sc e nd e ntul: d istanta ntre linia d e b az i linia d e asc e nd e nt; as a D e sc e nd e ntul: d istanta ntre linia d e b az i linia d e d e sc e nd e nt; as a L im e a: l im e a unui anum it c arac te r d in font; at at D istanta ntre linii ( le ad ing ): d istanta op tim a ntre d ou linii d e te x t a sc rise c u ac e la i font. s Inltim e a: d istanta d intre liniile d e b az (le ad ing + asc e nt+ d e sc e nt); a a Fig ura d e m ai jos p re z int o im ag ine re p re z e ntativ asup ra m e tric ii unui a a font:

280

CAPIT O L UL 1 0 . D E SE NARE A

R e am intim c la m e tod a drawString(String s, int x, int y) arg ua m e nte le x i y re p re z nit c oltul d in stng a-jos al te x tului. Ca s m m ai s a a a p re c i i, y re p re z int p oz itia linie i d e b az a te x tului c are v a sc ris. s a a U n c onte x t g rac p une la d isp oz itie o m e tod sp e c ial getFontMetrics a a d e c re are a unui ob ie c t d e tip FontMetrics, p ornind d e la fontul c ure nt al c onte x tului g rac : public void paint(Graphics g) { Font f = new Font("Arial", Font.BOLD, 11); FontMetrics fm = g.getFontMetrics(); } Ce le m ai folosite m e tod e ale c lase i FontMetrics sunt: getHeight - d e te rm in altim e a une i linii p e c are v or sc rise c arac te re a n ale unui font; stringWidth - d e te rm in l im e a total p ix e li a unui ir d e c arac te re a at a n s sp e c ic at; charWidth - d e te rm in l im e a unui anum it c arac te r d in font. a at In e x e m p lul urm tor sunt a ate p e e c ran z ile le sp tm nii i lunile ana s a a a s ului:

1 0 .3 . F O L O SIRE A F O NT URIL O R L isting 10.4: Folosire a c lase i FontM e tric 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)

281

282
text += " , " ; g . drawString ( text , x , y ) ; x += fm . stringWidth ( text ) ;

CAPIT O L UL 1 0 . D E SE NARE A

} } 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 c uloare e ste form at p rin c om b inatia c ulorilor stand ard ro u (re d ), a s v e rd e (g re e n) i alb astru (b lue ), la c are se ad aug un anum it g rad d e transp are nt s a a (alp h a). Fie c are d in ac e ti p atru p aram e tri p oate v aria s ntr-un inte rv al c up rins e ntre 0 i 255 (d ac d orim s sp e c ic m v alorile p rin num e re s a a a ntre g i), e ntre 0.0 i 1.0 (d ac d orim s sp e c ic m v alorile p rin num e re s a a a re ale ). O c uloare e ste re p re z e ntat p rintr-o instant a c lase i Color sau a sub a a c lase i sale S y stem Color. P e ntru a c re a o c uloare av e m d ou p osib ilit i: a at S folosim una d in c onstante le d e nite c e le d ou c lase ; a n a S folosim unul d in c onstruc torii c lase i Color. a S v e d e m m ai ai c are sunt c onstante le d e nite ac e ste c lase : a nt n

1 0 .4 . F O L O SIRE A CUL O RIL O R Color b lack b lue c y an d ark G ray g ray g re e n lig h tG ray m ag e nta orang e p ink re d w h ite y e llow S y stem Color ac tiv e Cap tion ac tiv e Cap tionB ord e r ac tiv e Cap tionT e x t c ontrol c ontrolH ig h lig h t c ontrolS h ad ow c ontolT e x t d e sk top m e nu te x t te x tH ig h lig h t w ind ow ...

283

Ob se rv ati c c lasa Color sunt d e nite c ulori uz uale d in p ale ta stand ard a n d e c ulori, tim p c e c lasa SystemColor sunt d e nite c ulorile c om p one nn n te lor stand ard (fe re stre , te x te , m e niuri, e tc ) ale p latform e i c ure nte d e luc ru. Folosire a ac e stor c onstante se fac e c a e x e m p le le d e m ai jos: n Color rosu = Color.red; Color galben = Color.yellow; Color fundal = SystemColor.desktop; D ac nic i una d in ac e ste c ulori p re d e nite nu c ore sp und e p re fe rinte lor noasa tre , atunc i p ute m c re a noi c ulori p rin inte rm e d iul c onstruc torilor 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 e ntru ro u, v e rd e , alb astru i s s transp are nt iar p aram e trul rg b d e la ultim ul c onstruc tor re p re z int un a a ntre g form at d in: b itii 16-23 ro u, 8-15 v e rd e , 0-7 alb astru. s V alorile arg um e nte lor v ariaz a ntre 0 255 p e ntru tip ul int, re sp e c tiv 0.0 1.0 p e ntru tip ul float. V aloare a 255 (sau 1.0) p e ntru transp are nt a sp e c ic fap tul c re sp e c tiv a c uloare e ste c om p le t op ac , iar v aloare a 0 (sau a a a 0.0) sp e c ic transp are nt total. Im p lic it, c ulorile sunt c om p le t op ac e . a a a

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 darker getRed getGreen getBlue getAlpha getRGB Cre e az o noua v e rsiune a c ulorii c ure nte a m ai d e sch is, re sp e c tiv m ai a nch is a D e te rm in p aram e trii d in c are a e ste alc atuit c uloare a a D e te rm in v aloare a c e re p re z int c uloare a a a re sp e c tiv (b itii 16-23 ro u, 8-15 v e rd e , 0-7 alb astru) a s

S c onsid e rm o ap lic atie c u ajutorul c re ia p ute m v iz ualiz a d inam ic c ua a a lorile ob inute p rin d ife rite c om b inatii ale p aram e trilor c e form e az o c uloare . t a A p lic atia v a arta astfe l: a

L isting 10.5: Folosire a 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 ) ;

1 0 .4 . F O L O SIRE A CUL O RIL O R


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 ; } }

285

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) ;

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 . add Adjus tment List ener ( this ) ; gValue . add Adjus tment List ener ( this ) ; bValue . add Adjus tment List ener ( this ) ; aValue . add Adjus tment List ener ( this ) ;

} public void ad ju stm en tV alu eC han ge d ( 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 e asta e ste o im ag ine :

1 0 .5 . F O L O SIRE A IM AG INIL O R

287

In A W T e ste p osib il folosire a im ag inilor c re ate e x te rn form at gif sau a n jp eg . Oric e im ag ine v a re p re z e ntat c a o instant a c lase i Im ag e. A c e asta a a nu e ste o c las d e c om p one nte (nu e x tind e Component) c i im p le m e nte az a a ob ie c te c are p ot d e se nate p e sup rafata unor c om p one nte c u m e tod e sp e c ic e unui c onte x t g rac p e ntru c om p one nta re sp e c tiv a (sim ilar m od ului c um se d e se ne az o linie sau un c e rc ). a

10 .5 .1

A area im ag inilor s

A are a une i im ag ini p re sup une re aliz are a urm toarilor d oi p a i: s a s 1. Cre are a unui ob ie c t d e tip Image; 2. A are a p rop riu-z is s a ntr-un c onte x t g rac ; Cre are a unui ob ie c t d e tip Image se fac e folosind o im ag ine d intr-un ie r s e a at p e m a ina p e c are se luc re az , e a at la o anum it ad re s W e b s a a a (U R L ). M e tod e le p e ntru rc are a une i im ag ini d intr-un ie r se g se sc nc a s a c lase le Applet i Toolkit, av nd a ac e e a i d e num ire g etIm ag e i n s a ns s s urm toare le form ate : a A pplet getImage(URL url) getImage(URL url, String fisier) T oolk it getImage(URL url) getImage(String fisier)

P e ntru a ob ine un ob ie c t d e tip Toolkit se v a folosi m e tod a getDefaultToolkit, t c a e x e m p lul d e m ai jos: n Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image1 = toolkit.getImage("poza.gif"); Image image2 = toolkit.getImage( new URL("http://www.infoiasi.ro/~acf/poza.gif"));

288

CAPIT O L UL 1 0 . D E SE NARE A

M e tod a getImage nu v e ric d ac ie rul sau ad re sa sp e c ic ata re p re z int a a s a o im ag ine v alid i nic i nu arc e fe c tiv im ag ine a m e m orie , ac e ste op e ratiuni as nc a n ind fc ute ab ia m om e ntul c are se v a re aliz a a are a im ag inii p e ntru a n n s p rim a d at. M e tod a nu fac e d e c t s c re e z e un ob ie c t d e tip Image c are fac e a a a re fe rint la o anum it im ag ine e x te rn. a a a

A are a une i im ag ini s ntr-un c onte x t g rac se re aliz e az p rin inte rm e d iul a m e tod e i draw Im ag e d in c lasa Graphics i, g e ne ral, v a fac ut m e tod a s n a n paint a une i c om p one nte . Ce le m ai uz uale form ate ale m e tod e i sunt: boolean drawImage(Image img, int boolean drawImage(Image img, int ImageObserver observer) boolean drawImage(Image img, int ImageObserver observer) boolean drawImage(Image img, int Color bgcolor, ImageObserver und e : im g e ste ob ie c tul c e re p re z int im ag ine a; a x, y sunt c oord onate le st ng a-sus la c are v a a at im ag ine a, re lativ e a s a la sp atiul d e c oord onate al c onte x tului g rac ; obser v er e ste un ob ie c t c are ob se rv rc are a im ag inii i v a ina nc a s form at p e m sura d e rulrii ac e ste ia; a a w id th , h eig th re p re z int im e a i l im e a la c are tre b uie sc alat a nalt s at a im ag ine a (d ac lip se sc , im ag ine a v a a at la d im e nsiunile e i re ale ); a s a bg Color re p re z int c uloare a c u c are v or c olorati p ix e lii transp are nti a ai im ag inii (p oate s lip se asc ). a a In e x e m p lul urm tor a am ac e e a i im ag ine d e tre i ori, folosind form e a s s d 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); x, int y, ImageObserver observer) x, int y, Color bgcolor, x, int y, int width, int height, x, int y, int width, int height, observer)

1 0 .5 . F O L O SIRE A IM AG INIL O R

289

M e tod a drawImage re turne az true d ac im ag ine a a fost a at a a s a n ntre g im e i false c az c ontrar, c u alte c uv inte m e tod a nu a te p t c a o im ag ine s s n s a a e c om p le t a at c i se te rm in im e d iat c e p roc e sul d e a are a e p ut. In s a a s nc se c iune a urm toare v om d e talia ac e st asp e c t. t a

10 .5 .2

M onitoriz area arc rii im ag inilor nc a

In c az ul c are se a e az o im ag ine c are se g se te p e Inte rne t sau im ag ine a n s a a s a ata e ste d e d im e nsiuni m ari se v a ob se rv a c ac e asta nu ap are c om p le t d e s a la e p ut c i e ste d e se nat tre p tat, fr inte rv e ntia p rog ram atorului. A c e st nc a aa luc ru se am p l d e oare c e m e tod a drawImage nu fac e d e c t s d e c lan e z e nt a a a s p roc e sul d e rc are i d e se nare a im ag inii, d up c are re d im e d iat c onnc a s a a trolul ap e lantului, luc ru d e ose b it d e util ntruc t p roc e sul d e rc are a a nc a une i im ag ini p oate d ura m ult i nu e ste d e d orit c a ac e st inte rv al d e tim p s n (p n la rc are a c om p le t a im ag inii) ap lic atia s e b loc at. Ca urm are , a a nc a a a a la ap e lul m e tod e i drawImage v a d e se nat num ai p ortiune a d e im ag ine c are a e ste d isp onib il la m om e ntul initial i c are p oate inc om p le t. D e ac e e a a s a tre b uie s e x iste un m e c anism p rin c are c om p one nta s e re d e se nat aua a a tom at m om e ntul c are au m ai sosit inform atii le g ate d e im ag ine , p n la n n a a a are a sa c om p le t. A c e st m e c anism e ste re aliz at p rin inte rm e d iul inte rfe e i s a t Im ag eO b server, im p le m e ntat d e c lasa Component i d e c i d e toate c om p oa s ne nte le . A c e ast inte rfat d e sc rie ob ie c te c are au e p ut s utiliz e z e o im ag a a nc a ine inc om p le t i c are tre b uie anuntate d e noile d ate ob inute le g atur c u as t n a im ag ine a re sp e c tiv . a Inte rfata ImageObserver are o sing ur m e tod num it im ag eU pdate, a a a c e v a ap e lat p e riod ic d e rul d e e x e c utie (c re at autom at) c are se oc up a a c u rc are a im ag inii. Form atul ac e ste i m e tod e e ste : nc a boolean imageUpdate (Image img, int flags, int x, int y, int w, int h ) Im p le m e ntare a im p lic it c onst d intr-un ap e l la m e tod a repaint p e ntru a a d re p tung h iul sp e c ic at la ap e l i c are re p re z int z ona d in im ag ine p e ntru c are s a se c unosc noi inform atii. Intre g ul f lag s furniz e az inform atii d e sp re stare a a transfe rului. A c e ste inform atii p ot a ate p rin inte rm e d iul c onstante lor d e nite d e inte rfat: a

290 ABORT

CAPIT O L UL 1 0 . D E SE NARE A Inc rc are a im ag inii a fost a ntre rup t, a nainte d e c om p le tare a sa ALLBITS Im ag ine a a fost arc at c om p le t nc a ERROR A ap rut o e roare tim p ul a n rc rii im ag inii nc a a FRAMEBITS T oti b itii c ad rului c ure nt sunt d isp onib ili HEIGHT Inltim e a im ag inii e ste d isp onib il a a PROPERTIES P rop rie t ile im ag inii sunt d isp onib ile at SOMEBITS A u fost re c e p ionati noi p ix e li ai im ag inii t WIDTH L im e a im ag inii e ste d isp onib il at a

P re z e nta p aram e trul f lag s a unui b it d e v aloare 1 p e p oz itia re p re z e n n tata d e o c onstant am n c re sp e c tiv a c ond itie e ste e p linit. a nse a a nd a // Imaginea este completa (flags & ALLBITS) != 0 // Eroare sau transferul imaginii a fost intrerupt (flags & ERROR | ABORT ) != 0 M e tod a imageUpdate p oate re d e nt d e o c om p one nt p e ntru a p e ra a sonaliz a p roc e sul d e a are al im ag inii. A c e asta v a ap e lat ap e lat asinc ron s a a d e e c are d at c nd sunt d isp onib ili noi p ix e li. a a 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 e ne a, se ob se rv c m e tod e le c lase i Image p e ntru d e te rm inare a a a d im e nsiunilor une i im ag ini au c a arg um e nt un ob ie c t d e tip ImageObserver. int getHeight(ImageObserver observer) int getWidth(ImageObserver observer) D ac d e se nare a se fac e folosind c lasa Canvas, atunc i arg um e ntul obser v er a al m e tod e lor re fe ritoare la im ag ini v a th is.

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 u ering

T e h nic a d e d oub le -b u e ring im p lic re aliz are a unui d e se n m e m orie i ap oi a n s transfe rul su p e e c ran, p e ntru a e lim ina e fe c tul ne p lc ut d e c lip ire ( ick a a e ring ) re z ultat atunc i c nd sunt e fe c tuate re d e se nri re p e tate la inte rv ale a a m ic i d e tim p . O situatie fre c v e nt c are se ap e le az la d oub le -b u e ring e ste a n a c re are a d e anim atii. S e c v e nta g e ne ral d e im p le m e ntare a m e c anism ului d e d oub le -b u e ring a e ste urm toare a: a // 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 form at JP E G n

P ach e tul com.sun.image.codec.jpeg d in d istrib utia stand ard J av a ofe r a sup ort p e ntru salv are a une i im ag ini a ate m e m orie n ntr-un ie r fors n

292

CAPIT O L UL 1 0 . D E SE NARE A

m at J P E G . O c las re sp onsab il c u re aliz are a ac e ste i op e ratiuni ar p ute a a a d e nit astfe l: a import import import import com.sun.image.codec.jpeg.*; java.awt.image.BufferedImage; java.awt.*; 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 m em orie n

In c az ul c are d orim s folosim o anum it im ag ine c re at d ire c t d in p ron a a a g ram i nu arc at d intr-un ie r v om folosi c lasa M em ory Im ag eS ource, s nc a s a ata p ach e tul java.awt.image. P e ntru ac e asta v a tre b ui s d e nim un n a

1 0 .6 . T IPARIRE A

293

v e c tor d e num e re ntre g i c are v om sc rie v alorile n ntre g i (R G B ) ale c ulorilor p ix e lilor c e d e ne sc im ag ine a noastr. D im e nsiune a v e c torului v a a altim e a ultit c u l im e a p ix e li a im ag inii. Construc torul c lase i n nm a at n MemoryImageSource e ste : MemoryImageSource(int w, int h, int[] pixeli, int off, int scan) und e : w , h re p re z int d im e nsiunile im ag inii (l im e a i altim e a); a at s n p ixeli[] e ste v e c torul c u c ulorile im ag inii; of f , scan re p re z int m od alitate a d e c onstruire a m atric ii im ag inii p ornind a d e la v e c torul c u p ix e li, norm al ac e ste v alori sunt o = 0, sc an = w In e x e m p lul urm ator v om c re a o im ag ine c u p ix e li d e c ulori ale atorii i o s v om a a p e e c ran: s 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 ip rirea a

T ip rire a J av a e ste tratat ac e e a i m anie r c a i d e se nare a, sing urul a n a n s a s luc ru d ife rit ind c onte x tul g rac c are se e x e c ut op e ratiile . P ach e tul n a c are ofe r sup ort p e ntru tip rire e ste java.aw t.print, iar c lasa p rinc ip al a a a c are c ontrole az p roc e sul d e tip rire e ste P rinterJob . O ap lic atie v a ap e la a a m e tod e ale ac e ste i c lase p e ntru:

294

CAPIT O L UL 1 0 . D E SE NARE A

Cre are a une i se siuni d e tip rire (job ); a Inv oc are a d ialog ului c u utiliz atorul p e ntru sp e c ic are a unor p aram e tri le g ati d e tip rire ; a T ip rire a e fe c tiv . a a Oric e c om p one nt c are p oate a at p e e c ran p oate i tip rit. In g e na s a s a a e ral, oric e inform atii c are tre b uie at t a ate c t i tip rite , v or ap sulate a s a s a nc ntr-un ob ie c t g rac - c om p one nt, c are are o re p re z e ntare v iz ual d e sc ris a a a d e m e tod a paint i c are v a sp e c ic a i m od alitate a d e re p re z e ntare a sa la s s im p rim ant. a U n ob ie c t c are v a tip rit tre b uie s im p le m e nte z e inte rfata P rintab le, a a c are c ontine o sing ur m e tod print, re sp onsab il c u d e sc rie re a m od alit ii a a a at d e tip rire a ob ie c tului. In c az ul c nd im ag ine a d e p e e c ran c oinc id e c u a a im ag ine a d e la im p rim ant, m e tod e le paint i print p ot sp e c ic a ac e e a i a s s se c v e nt d e c od . In g e ne ral, m e tod a print are urm torul form at: a a 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 a ii c are tre b uie e fe c tuati p e ntru tip rire a unui ob ie c t sunt: s a 1. Cre are a une i se siuni d e tip rire : PrinterJob.getPrinterJob a 2. S p e c ic are a ob ie c tului c are v a tip rit: setPrintable; ac e sta tre b uie a s im p le m e nte z e inte rfata Printable; a 3. Op ional, initie re a unui d ialog c u utiliz atorul p e ntru p re c iz are a unor t p aram e tri le g ati d e tip rire : printDialog; a

1 0 .6 . T IPARIRE A 4. T ip rire a e fe c tiv : print. a a

295

In e x e m p lul urm tor v om d e ni un ob ie c t c are are ac e e a i re p re z e ntare a s p e e c ran c t i la im p rim ant (un c e rc c irc um sc ris unui p trat, a s a a nsotite d e un te x t) i v om tip ri ob ie c tul re sp e c tiv . s a L isting 10.6: T ip rire a une i c om p one nte a
import import import import java . io .*; java . awt .*; java . awt . event .*; 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 ) {

296
System . exit (0) ; } }) ;

CAPIT O L UL 1 0 . D E SE NARE A

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 () ; } }

1 0 .6 . T IPARIRE A

297

T iparirea tex telor O alt v ariant p e ntru tip rire a d e te x te e ste d e sch id e re a unui ux c tre a a a a d isp oz itiv ul sp e c ial re p re z e ntat d e im p rim ant i sc rie re a inform atiilor, linie as c u linie , p e ac e st ux . In siste m ul d e op e rare W ind ow s, im p rim anta p oate re fe rit p rin lpt1 , iar U nix p rin / dev/ lp . Ob se rv ati c ac e ast a n a a ab ord are nu e ste p ortab il, d e oare c e ne c e sit tratare sp e c ial func ie d e a a a n t siste m ul d e op e rare folosit. L isting 10.7: T ip rire a te x te lor a
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 () ; } }

298

CAPIT O L UL 1 0 . D E SE NARE A

Capitolul 11 S w ing
11.1
11.1.1

Introducere
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 a Found ation Classe s) c are p une la d isp oz itie o se rie ntre ag d e fac ilit i p e na at tru sc rie re a d e ap lic atii c u o inte rfat g rac m ult b og it func ional i a a m at a t s e ste tic fat d e v e ch iul m od e l A W T . In J FC sunt inc luse urm toare le : a a Com ponente S w ing S unt c om p one nte c e nloc uie sc i ac e la i tim p e x tind v e ch iul se t ofe rit s n s d e m od e lul A W T . L ook -and-F eel P e rm ite sch im b are a a i rii i a m od ului d e inte rac iune c u ap lic atia nft sa s t func ie d e p re fe rinte le e c ruia. A c e la i p rog ram p oate utiliz a d in t a s v e rse m od uri L ook -and -Fe e l, c um ar c e le stand ard W ind ow s, M ac , J av a, M otif sau alte le ofe rite d e d iv e r i d e z v oltatori, ac e ste a p ut nd s a inte rsch im b ate d e c tre utiliz ator ch iar la m om e ntul e x e c utie i . a A ccessib ility A P I P e rm ite d e z v oltare a d e ap lic atii c are s c om unic e c u d isp oz itiv e uti a liz ate d e c tre p e rsoane c u d iv e rse tip uri d e h and ic ap , c um ar c ititoare a d e e c ran, d isp oz itiv e d e re c unoa te re a v oc ii, e c rane B raille , e tc . s Java 2 D A P I Folosind J av a 2D p ot c re ate ap lic atii c are utiliz e az g rac la un a a 299

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 re are a d e d e se ne c om p le x e , e fe c tuare a d e op e ratii g e om e tric e (rotiri, sc alri, translatii, e tc .), a p re luc rare a d e im ag ini, tip rire , e tc . a

D rag -and-D rop Ofe r p osib ilitate a d e a e fe c tua op e ratii d rag -and -d rop a ntre ap lic atii J av a i ap lic atii nativ e . s Internationaliz are Inte rnationaliz are a i loc aliz are a ap lic atiilor sunt d ou fac ilit i e x tre m s a at d e im p ortante c are p e rm it d e z v oltare a d e ap lic atii c are s p oat c on a a g urate p e ntru e x p loatare a lor d iv e rse z one ale g lob ului, utiliz nd n a lim b a i p artic ularit ile le g ate d e form atare a d ate i, num e re lor sau a s at m one d e i d in z ona re sp e c tiv . a In ac e ste c ap itol v om fac e o p re z e ntare sc urt a c om p one nte lor S w ing , a d e oare c e p re z e ntare a d e taliata a tuturor fac ilit ilor ofe rite d e J FC ar ofe ri at suc ie nt m ate rial p e ntru un v olum d e sine stttor. aa

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 s p un la a a d isp oz itie un se t d e c om p one nte G U I e x te nsib ile c are s p e rm it d e z v oltare a a a rap id d e ap lic atii J av a c u inte rfat g rac c om p e titiv d in p unc t d e v e d e re a a a a c om e rc ial. P e ntru a re aliz a ac e st luc ru, A P I-ul ofe rit d e S w ing e ste d e ose b it d e c om p le x av nd 17 p ach e te c are se g se sc sute d e c lase i inte rfe e . L ista a n a s t c om p le t a p ac e h e te lor d in d istrib utia stand ard 1.4 e ste d at tab e lul d e a a n m ai jos: javax.accessibility javax.swing.text.html javax.swing.plaf.basic javax.swing.border javax.swing.text.rtf javax.swing.plaf.multi javax.swing.event javax.swing.undo javax.swing.text javax.swing.plaf javax.swing javax.swing.text.parser javax.swing.plaf.metal javax.swing.colorchooser javax.swing.tree javax.swing.table javax.swing.filechooser

1 1 .1 . INT RO D UCE RE

301

E v id e nt, nu toate ac e ste p ach e te sunt ne c e sare la d e z v olatare a une i ap lic atii, c e l m ai im p ortant i c are c ontine c om p one nte le d e b az ind javax .sw ing . s a

Com p one nte le folosite p e ntru c re are a inte rfe e lor g rac e S w ing p ot g rut p ate astfe l: Com ponente atom ice JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar, JSlider, JProgressBar, JSeparator Com ponente com plex e JTable, JTree, JComboBox, JSpinner, JList, JFileChooser, JColorChooser, JOptionPane Com ponente pentru editare de tex t JTextField, JFormattedTextField, JPasswordField, JTextArea, JEditorPane, JTextPane M eniuri JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem Containere interm ediare JPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane, JToolBar Containere de nivel nalt JFrame, JDialog, JWindow, JInternalFrame, JApplet

11.1.3

A sem n ri i deoseb iri cu A W T a a s

N u se p oate sp une c S w ing a nloc uie te m od e lul A W T c i e x tind e p e ac e sta s l d in urm ad ug nd u-i noi c om p one nte c are e a a a nloc uie sc une le v e ch i e sunt c u totul noi. O c onv e ntie g e ne ral re sp e c tat e ste p re x are a num e lui une i n a c lase A W T c u lite ra J p e ntru a d e num i c lasa c ore sp ond e nt d in S w ing . a A stfe l, loc ul 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 c on m and at c a o ap lic atie c u inte rfat g rac s folose asc e c om p one nte A W T , a a a a e S w ing , am e ste c are a lor ind m ai p utin uz ual. a

302

CAPIT O L UL 1 1 . SW ING

A p lic atiile G U I v or av e a c ontinuare ne v oie d e p ach e tul java.awt d e oare c e n aic i sunt d e nite une le c lase utilitare c um ar Color, Font, Dimension, e tc . c are nu au fost re sc rise S w ing . n D e ase m e ne a, p ach e tul java.awt.event rm ne c ontinuare e se ntial a a n p e ntru tratare a e v e nim e nte lor g e ne rate at t d e c om p one nte A W T c t i d e a a s c e le d in S w ing . P e l ng ac e sta m ai p oate ne c e sar i javax.swing.event a a s c are d e sc rie tip uri d e e v e nim e nte sp e c ic e unor c om p one nte S w ing , m e c anism ul d e tratare a lor ind a ac e la i c a A W T . ns s n P oz itionare a c om p one nte lor e ste p re luat d in A W T , ind ad ug ate a a a ns noi c lase c are d e sc riu g e stionari d e p oz itionare c om p le tare a c e lor e x is n te nte , c um ar BoxLayout i SpringLayout. D ife r a m od ul d e luc ru c u s a ns c ontaine re , d up c um v om v e d e a se c iune a d e d ic at ac e stora. a n t a M ajoritate a c om p one nte lor S w ing c are p e rm it a are a unui te x t c a p arte s a re p re z e ntrii lor G U I p ot sp e c ic a ac e l te x t e m od norm al folosind un a n anum it font i o anum it c uloare c e p ot se tate c u m e tod e le setFont i s a s setColor, e p rin inte rm e d iul lim b ajului H T M L . Folosire a H T M L ad uc e o e x ib ilitate a d e ose b it re aliz are a inte rfe e i g rac e , a n t ntruc t p ute m ap lic a a form atri m ultip le unui te x t, d e sc om p une re a ac e stuia p e m ai m ulte linii, e tc ., a sing urul d e z av antaj ind e tinire a e tap e i d e a are a c om p one nte lor. nc s JButton simplu = new JButton("Text simplu"); JButton html = new JButton( "<html><u>Text</u> <i>formatat</i></html>"); S d e sc rie m o ap lic ie sim p l folosind A W T i ap oi S w ing , p e ntru a ne a t a s c re a o p rim im p re sie asup ra d ife re nte lor i ase m nrilor d intre c e le d ou a s a a a m od e le . L isting 11.1: O ap lic atie sim p l A W T a
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 ) ;

1 1 .1 . INT RO D UCE RE
add ( b ) ; pack () ; show () ; } public void actionPerformed ( ActionEvent e ) { System . exit (0) ; } public static void main ( String args []) { new ExempluAWT ( " Hello " ) ; } }

303

L isting 11.2: A p lic atia re sc ris folosind S w ing a


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 " ) ; }

304
}

CAPIT O L UL 1 1 . SW ING

11.2

F olosirea ferestrelor

P e ntru a a ate p e e c ran c om p one nte le g rac e ale une i ap lic atii tre b uie s p lasate p e o sup rafat d e a are (c ontaine r). Fie c are c om p one nt p oate a s a c ontinut d oar a ntr-un sing ur c ontaine r, ad ug are a e i p e o sup raft nou a a a d e a are d e te rm in nd e lim inare a e i d e p e v e ch iul c ontaine r p e c are fuse se s a p lasat. Intruc t c ontaine re le p ot ap sulate alte c ontaine re , o c om a a nc n p one nt v a fac e p arte la un m om e nt d at d intr-o ie rarh ie . R d c ina ac e ste i a a a ie rarh ii tre b uie s e un a a num it co n ta in er d e n ivel n a lt, c are e ste re p re z e na s tat d e una d in c lase le JF ram e, JD ialog sau JA pplet. Intruc t d e ap p le turi a ne v om oc up a se p arat, v om analiz a c ontinuare p rim e le d ou c lase . n a In g e ne ral oric e ap lic atie J av a ind e p e nd e nt b az at p e S w ing c ontine a a c e l p utin un c ontaine r d e niv e l nalt re p re z e ntat d e fe re astra p rinc ip al a a p rog ram ului, instant a c lase i JFrame. a S im p lic at, un ob ie c t c are re p re z int o fe re astr S w ing c ontine o z on a a a c are e ste re z e rv at b are i d e m e niuri i c are e ste situat d e ob ie c i p arte a sa a s a n sup e rioar i c orp ul fe re stre i p e c are v or p lasate c om p one nte le . Im ag ine a as d e m ai jos p une e v id e nt ac e ast se p arare , v alab il d e altfe l p e ntru oric e n a a a c ontaine r d e niv e l nalt:

Corp ul fe re stre i e ste o instant a c lase i Container c e p oate ob inut c u a t a m e tod a g etContentP ane. P lasare a i aranjare a c om p one nte lor p e sup rafata s

1 1 .2 . F O L O SIRE A F E RE ST RE L O R

305

fe re stre i se v a fac e d e c i folosind ob ie c tul d e tip Container i nu d ire c t fe re ass tra. A ad ar, d e i e ste d e riv at d in Frame, c lasa JFrame e ste folosit s s a a ntr-un m od d ife rit fat d e p rinte le su: a a a 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 e ose b ire d e Frame, un ob ie c t JFrame are un c om p ortam e nt im p lic it la nch id e re a fe re stre i c are c onst asc und e re a fe re stre i atunc i c nd utiliz aa n a torul ap as b utonul d e a nch id e re . A c e st c om p ortam e nt p oate m od ic at p rin ap e lare a m e tod e i setD efaultCloseO peration c are p rim e te c a arg us m e nt d iv e rse c onstante c e se g se sc e c lasa WindowConstants, e ch iar a n JFrame. n jf.setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); jf.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); A d ug are a une i b are d e m e niuri se re aliz e az c u m e tod a setJM enuB ar, a a c are p rim e te o instant d e tip JMenuBar. Cre are a m e niurilor e ste sim ilar s a a c u m od e lul A W T .

11.2 .1

F erestre interne

D in p unc tul d e v e d e re al folosirii fe re stre lor, ap lic atiile p ot p rtite m a n d ou c ate g orii: a S D I (S in gle D o cu m en t In terfa ce) M D I (M u ltip le D o cu m en t In terfa ce) P rog ram e le d in p rim a c ate g orie g e stione az la un m om e nt d at o sing ur a a fe re astr c are se g se sc c om p one nte le c u c are inte rac ione az utiliz atorul. a n a t a In a d oua c ate g orie , fe re astra p rinc ip al a ap lic atie i lob e az la r nd ul e i a ng a a alte fe re stre , uz ual c u func ionalit i sim ilare , c e p e rm it luc rul c onc ure nt p e t at m ai m ulte p lanuri.

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 a c re a fe re stre c ad rul altor fe re stre . Fe re stre le inte rne au ap rox im ativ ac e e a i n s a i are i func ionalitate c u fe re stre le d e tip JFrame, sing ura d ife re nt ind nft s s t a m od ul d e g e stionare a ac e stora. U z ual, ob ie c te le d e tip JInternalFrame v or p lasate p e un c ontaine r d e tip D esk topP ane, c are v a ap oi p lasat p e o fe re astr d e tip JFrame. a Folosire a c lase i DesktopPane e ste ne c e sar d e oare c e ac e asta tie c um s a s a g e stione z e fe re stre le inte rne , av nd v e d e re c ac e ste a se p ot sup rap une i a n a s la un m om e nt d at d oar una sing ur e ste ac tiv . a a E x e m p lul urm tor p une e v id e nt m od e lul g e ne ral d e c re are i a are a n a s s a fe re stre lor inte rne : L isting 11.3: Folosire a fe re stre lor inte rne
import javax . swing .*; import java . awt .*; class FereastraPrincipala extends JFrame { public FereastraPrincipala ( String titlu ) { super ( titlu ) ; setSize (300 , 200) ; s e tD e f au l t C lo s e Op e r a ti o n ( 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 ) ,

1 1 .3 . CL ASA J CO M PO NE NT
true , // resizable true , // closable true , // maximizable true ) ; // iconifiable setLocation ( x *n , y * n ) ; setSize ( new Dimension (200 , 100) ) ;

307

} } public class TestInternalFrame { public static void main ( String args []) { new FereastraPrincipala ( " Test ferestre interne " ) . show () ; } }

Fe re stre le c re ate d e ac e st p rog ram v or arta c a g ura d e m ai jos: a n

11.3

Clasa JCom ponent

JComponent e ste sup e rc lasa tuturor c om p one nte lor S w ing , m ai p utin a c e lor c are d e sc riu c ontaine re d e niv e l nalt JFrame, JDialog, JApplet. D e oare c e JComponent e x tind e c lasa Container, d e c i i Component, e a m o te ne te func ionalitate a s s s t g e ne ral a c ontaine re lor i c om p one nte lor A W T , furniz nd b ine e le s i o se a s a nt s rie ntre ag d e noi fac ilit i. a at D intre nout ile ofe rite d e JComponent am intim : at T oolT ips Folosind m e tod a setToolTip p oate ata at une i c om p one nte un te x t s c u e x p lic atii le g ate d e c om p one nta re sp e c tiv . C nd utiliz atorul tre c e a a

308

CAPIT O L UL 1 1 . SW ING c u m ouse -ul d e asup ra c om p one nte i v a a at, p e ntru o p e rioad d e s a tim p , te x tul ajuttor sp e c ic at. a

Ch enare Oric e c om p one nt S w ing p oate av e a unul sau m ai m ulte ch e nare . S p e c ia c are a unui ch e nar se re aliz e az c u m e tod a setBorder. a S uport pentru plasare i dim ensionare s Folosind m e tod e le setPreferredSize, setMinimumSize, setMaximumSize, setAlignmentX, setAlignmentY p ot c ontrolati p aram e trii folositi d e g e stionarii d e p oz itionare p e ntru p lasare a i d im e nsionare a autom at s a a c om p one nte lor c ad rul unui c ontaine r. n Controlul opacit ii at Folosind m e tod a setOpaque v om sp e c ic a d ac o c om p one nt tre b uie a a sau nu s d e se ne z e toti p ix e lii d in inte riorul su. Im p lic it, v aloare a a a p rop rie t ii d e op ac itate e ste false, c e e a c e am n c e ste p osib il at nse a a s nu e d e se nati unii sau ch iar toti p ix e lii, p e rm it nd p ix e lilor d e sub a a c om p one nt s rm n v iz ib ili (c om p one nta nu e ste op ac ). V aloare a a a a a a a p rop rie t ii p e ntru c lase le d e riv ate d in J Com p one nt d e p ind e g e ne ral at n d e L ook -and -Fe e l-ul folosit. A socierea de actiuni tastelor P e ntru c om p one nte le S w ing e x ist p osib ilitate a d e sp e c ic a anum ite a ac iuni c are s se e x e c ute atunc i c nd utiliz atorul ap as o anum it t a a a a c om b inatie d e taste i c om p one nta re sp e c tiv e ste ac tiv (are foc us s a a ul). A c e ast fac ilitate sim p lic v arianta initial d e luc ru, i anum e a a a s tratare a e v e nim e nte lor d e tip KeyEvent p rintr-un ob ie c t KeyListener. D oub le-B u ering T e h nic a d e d oub le -b u e ring , c are im p lic d e se nare a c om p one nte i a n m e m orie i ap oi transfe rul s ntre g ului d e se n p e e c ran, e ste im p le m e ntat a autom at d e c om p one nte le S w ing , sp re d e ose b ire d e c e le A W T und e tre b uia re aliz at m anual d ac e ra c az ul. a a E x e m p lul urm tor ilustre az m od ul d e folosire a c torv a d intre fac ilit ile a a a at am intite m ai sus: L isting 11.4: Fac ilit i ofe rite d e c lasa JComponent at

1 1 .3 . CL ASA J CO M PO NE NT
import import import import javax . swing .*; javax . swing . border .*; java . awt .*; java . awt . event .*;

309

class Fereastra extends JFrame { public Fereastra ( String titlu ) { super ( titlu ) ; getContentPane () . setLayout ( new FlowLayout () ) ; s e tD e f au l t C lo s e Op e r at i o n ( JFrame . EXIT_ON_CLOSE ) ; // Folosirea chenarelor Border lowered , raised ; TitledBorder title ; lowered = BorderFactory . c r e at e L o we r e dB e v e lB o r de r () ; raised = BorderFactory . c re a te Ra i se dB e ve lB o rd er () ; 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 " ) ;

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 11.5

A rh itectura m odelului S w ing F olosirea m odelelor

M od e lul S w ing e ste b az at p e o arh ite c tur ase m ntoare c u M V C (m od ela a a view -co n tro ller). A rh ite c tura M V C sp e c ic d e sc om p une re a une i ap lic atii a v iz uale tre i p rti se p arate : n a M o d elu l - c are v a re p re z e nta d ate le ap lic atie i.

1 1 .5 . F O L O SIRE A M O D E L E L O R P rezen ta rea - m od ul d e re p re z e ntare v iz ual a d ate lor. a

311

C o n tro lu l - transform are a ac iunilor utiliz atorului asup ra c om p one nt te lor v iz uale e v e nim e nte c are s ac tualiz e z e autom at m od e lul ac e sn a tora (d ate le ). D in m otiv e p rac tic e , S w ing p rtile d e p re z e ntare i c ontrol au fost c un a s p late d e oare c e e x ista o le g tur p re a str ns a a a a ntre e le p e ntru a c onc e p ute c a e ntit i se p arate . A ad ar, arh ite c tura S w ing e ste d e fap t o arh ite c tur at s a c u m o d el sep a ra bil, c are d ate le c om p one nte lor (m od e lul) sunt se p arate d e n re p re z e ntare a lor v iz ual. A c e ast ab ord are e ste log ic i d in p e rsp e c tiv a a a a s fap tului c , g e ne ral, m od ul d e c onc e p e re a une i ap lic atii tre b uie s e oria n a e ntat asup ra re p re z e ntrii i m anip ulrii inform atiilor i nu asup ra inte rfe e i a s a s t g rac e c u utiliz atorul. P e ntru a re aliz a se p arare a m od e lului d e p re z e ntare , e c rui ob ie c t c ore a sp unz tor une i c lase c e d e sc rie o c om p one nt S w ing e ste asoc iat un ob ie c t a a i c are g e stione az d ate le sale i c are im p le m e nte az o inte rfat c are re p re z int a s a a a m od e lul c om p one nte i re sp e c tiv e . D up c um se ob se rv d in tab e lul d e m ai a a jos, c om p one nte c u re p re z e ntri d ife rite p ot av e a ac e la i tip d e m od e l, d ar a s e x ist i c om p one nte c are au asoc iate m ai m ulte m od e le : as M odel ButtonModel Com ponent a JButton, JToggleButton, JCheckBox, JRadioButton, JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtomMenuItem ComboBoxModel JProgressBar, JScrollBarm, JSlider SingleSelectionModel JList JList TableModel TableColumnModel TreeModel TreeSelectionModel JEditorPane, JTextPane, JTextArea, JTextField, JPasswordField

JComboBox BoundedRangeModel JTabbedPane ListModel ListSelectionModel JTable JTable JTree JTree Document

Fie c are c om p one nt are un m od e l initial im p lic it, a are p osib ilitate a a ns d e a-l nloc ui c u unul nou atunc i c nd e ste c az ul. M e tod e le c are ac c e se az a a

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, c u arg um e nte sp e c ic e e c re i c om p one nte p arte . Cre are a une i c lase c are s re p re z inte a n a un m od e l se v a fac e e x tinz nd inte rfata c ore sp unz toare i im p le m e nt nd a a s a m e tod e le d e nite d e ac e asta sau e x tinz nd c lasa im p lic it ofe rit d e A P I-ul a a a S w ing i sup rad e nind m e tod e le c are ne inte re se az . P e ntru m od e le le m ai s a c om p le x e , c um ar c e le asoc iate c lase lor JTable, JTree sau JList e x ist a c lase ab strac te c are im p le m e nte az inte rfata c e d e sc rie m od e lul re sp e c tiv D e a e x e m p lu, inte rfata m od e l a c lase i JList e ste ListModel c are e ste im p le m e ntat d e c lase le DefaultListModel i AbstractListModel. In func ie a s t d e ne c e sit i, oric are d in ac e ste c lase p oate e x tins p e ntru a c re a un nou at a m od e l. L isting 11.5: Folosire a m ai m ultor m od e le p e ntru o c om p one nta
import import import import javax . swing .*; javax . swing . border .*; java . awt .*; 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 ) ; s e tD e f au l t C lo s e Op e r a ti o n ( 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 ) ;

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 c om p one nte S w ing furniz e az m e tod e c are s ob in stare a ob ie c a a t a tului fr a m ai ne v oie s ob ine m instanta m od e lului i s ap e lm m e tod e le aa a t s a a

314

CAPIT O L UL 1 1 . SW ING

ac e ste ia. U n e x e m p lu e ste m e tod a getValue a c lase i JSlider c are e ste d e fap t un ap e l d e g e nul getModel().getValue(). In m ulte situatii a, m ai ns ale s p e ntru c lase c um ar JTable sau JTree, folosire a m od e le lor ad uc e e x ib ilitate sp orit p rog ram ului i e ste re c om and at utiliz are a lor. a s a

11.5 .1

T ratarea evenim entelor

M od e le le c om p one nte lor tre b uie s notic e ap aritia unor sch im b ri ale d ate lor a a g e stionate astfe l t s p oat re ac tualiz at p re z e ntare a lor sau s e e x nc a a a a a e c utat un anum ti c od c ad rul unui ob ie c t d e tip listen er. In S w ing , ac e ast n a notic are e ste re aliz at d ou m od uri: a n a 1. Inform ativ (lig h tw eig h t) - M od e le le trim it un e v e nim e nt p rin c are sunt inform ati asc ulttorii c a surv e nit o anum it sch im b are a d ate lor, fr a a a aa a inc lud e e v e nim e nt d e talii le g ate d e sch im b are a surv e nit. Ob ie c te le n a d e tip liste ne r v or tre b ui s ap e le z e m e tod e sp e c ic e c om p one nte lor p e na tru a a a ce a n u m e s-a sch im b at. A c e st luc ru se re aliz e az p rin inte fata a Ch ang eL istener iar e v e nim e nte le sunt d e tip Ch ang eE vent, m od e le le c are sup ort ac e ast ab ord are ind BoundedRangeModel, ButtonModel i a a s SingleSelectionModel.
Model BoundedRangeModel ButtonModel S ingleS elec tionModelModel L C C C isten er h angeL istener h angeL istener h angeL istener T C C C ip E v en im en t h angeE v ent h angeE v ent h angeE v ent

Inte rfata ChangeListener are o sing ur m e tod : a a public void stateChanged(ChangeEvent e), sing ura inform atie c ontinut e v e nim e nt ind c om p one nta surs. a n a Inre g istrare a i e lim inare a ob ie c te lor d e tip liste ne r se re aliz e az c u m e tod e le s a 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

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 e ntru u urinta p rog ram rii, p e ntru a nu luc ra d ire c t c u instanta m od e lus a lui, une le c lase p e rm it g istrare a asc ulttorilor d ire c t p e ntru c om p one nta nre a sine , sing ura d ife re nt fat d e v arianta ante rioar c onst nd fap tul c n a a a a n a sursa e v e nim e ntului e ste ac um d e tip ul c om p one nte i i nu d e tip ul m od e lului. s S e c v e nta d e c od d e m ai sus p oate re sc ris astfe l: a 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 inte rfe e sp e c ial t iz ate i tip uri d e e v e nim e nte sp e c ic e c e inc lud toate inform atiile le g ate d e s sch im b are a d ate lor.
Model L istModel L istS elec tionModel C om b oBox Model T reeModel T reeS elec tionModel T ab leModel T ab leC olum nModel D oc um ent D oc um ent L isten er L istD ataL istener L istS elec tionL istener L istD ataL istener T reeModelL istener T reeS elec tionL istener T ab leModelL istener T ab leC olum nModelL istener D oc um entL istener U ndoab leE ditL istener T ip E v en im en t L istD ataE v ent L istS elec tionE v ent L istD ataE v ent T reeModelE v ent T reeS elec tionE v ent T ab leModelE v ent T ab leC olum nModelE v ent D oc um entE v ent U ndoab leE ditE v ent

Folosire a ac e stor inte rfe e nu d ife r c u nim ic d e c az ul g e ne ral: t a String culori[] = {"rosu", "galben", "albastru"); JList list = new JList(culori); ListSelectionModel sModel = list.getSelectionModel(); sModel.addListSelectionListener(

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 atorit c om p le x it ii m od e lului S w ing , ac e ast se c ttiune nu v om e rc a a at n a nc o ab ord are e x h austiv a m od ului d e utiliz are a tuturor c om p one nte lor, c i v om a p une e v id e nt d oar asp e c te le sp e c ic e ac e stui m od e l, sub liniind d ife re nte le n a i b unt irile fat A W T . s m a at a

11.6 .1

Com ponente atom ice

In c ate g oria c om p one nte lor atom ic e inc lud e m c om p one nte le S w ing c u func ionalitate t sim p l, a c ror folosire e ste g e ne ral ase m ntoare c u a e ch iv ale nte lor d in a a n a a A W T . A ic i inc lud e m : E tich e te : JLabel B utoane sim p le sau c u d ou stri: JButton, JCheckBox, JRadioButton, a a JToggleButton; m ai m ulte b utoane rad io p ot g rup ate folosind c lasa ButtonGroup, p e ntru a p e rm ite se le c tare a d oar a unuia d intre e le . Com p one nte p e ntru p rog re s i d e rulare : JSlider, JProgressBar, JScrollBar s S e p aratori: JSeparator D e oare c e utiliz are a ac e stora e ste g e ne ral fac il, nu v om analiz a p arte n a n ac e ste c om p one nte .

11.6 .2

Com ponente pentru editare de tex t

Com p one nte le S w ing p e ntru a are a i e d itare a te x te lor sunt g rup ate s s ntr-o ie rarh ie c e are c a rd c in c lasa JT ex tCom ponent d in p ach e tul javax.swing.text. a a a

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R

317

D up c um se ob se rv d in im ag ine a d e m ai sus, c lase le p ot p rtite a a m a n tre i c ate g orii, c ore sp unz toare tip ului te x tului e d itat: a T e x t sim p lu p e o sing ur linie a JT ex tF ield - P e rm ite e d itare a unui te x t sim p lu, p e o sing ur a linie . JP assw ordF ield - P e rm ite e d itare a d e p arole . T e x tul ac e stora v a asc uns, loc ul c arac te re lor introd use ind a at un c arac te r n s sim b olic , c um ar * . JF orm attedT ex tF ield - P e rm ite introd uc e re a unui te x t c are s a re sp e c te un anum it form at, ind foarte util p e ntru c itire a d e a num e re , d ate c ale nd aristic e , e tc . E ste folosit p re un c u c lase a m a utilitare p e ntru form atare a te x te lor, c um ar NumberFormatter, DateFormatter, MaskFormatter, e tc . V aloare a c ontinut d e o a astfe l d e c om p one nt v a ob inut/ se tat c u m e tod e le g etV alue, a t a a re sp e c tiv setV alue i nu c u c e le uz uale getText, setText. s T e x t sim p lu p e m ai m ulte linii JT ex tA rea - P e rm ite e d itare a unui te x t sim p lu, p e m ai m ulte linii. Oric e atrib ut le g at d e stil, c um ar c uloare a sau fontul, se ap lic a ntre g ului te x t i nu p oate sp e c ic at d oar une i anum ite s p ortiuni. U z ual, o c om p one nt d e ac e st tip v a inc lus a a ntr-un c ontaine r JScrollPane, p e ntru a p e rm ite nav ig are a p e v e rtic al a

318

CAPIT O L UL 1 1 . SW ING i oriz ontal d ac te x tul introd us nu ap e sup rafata aloc at s a a nc n a ob ie c tului. A c e st luc ru e ste v alab il p e ntru toate c om p one nte le S w ing p e ntru c are are se ns notiune a d e nav ig are p e oriz ontal a sau v e rtic al, nic i una ne ofe rind sup ort intrinse c p e ntru ac e ast a a op e ratiune .

T e x t c u stil b og it p e m ai m ulte linii m at JE ditorP ane - P e rm ite a are a i e d itare a d e te x te sc rise c u stils s uri m ultip le i c are p ot inc lud e im ag ini sau ch iar d iv e rse ale t c om s p one nte . Im p lic it, urm toare le tip uri d e te x te sunt re c unosc ute : a tex t/ plain, tex t/ h tm l i tex t/ rtf. U na d in utiliz rile c e le m ai s a sim p le ale ac e ste i c lase e ste se tare a d oc um e ntului c e v a a at s c u m e tod a setP ag e, c e p rim e te c a arg um e nt un U R L c are p oate s re fe ri un ie r te x t, H T M L sau R T F. s JT ex tP ane - A c e ast c las e x tind e JEditorPane, ofe rind d iv e rse a a fac ilit i sup lim e ntare p e ntru luc rul c u stiluri i p arag rafe . at s Clasa JTextComponent e arc s p stre z e c t m ai m ulte sim ilitud ini c u nc a a a a c lasa TextComponent d in A W T , a e x ist d ife re nte notab ile ns a ntre c e le d ou, a c om p one nta S w ing av nd c arac te ristic i m ult m ai c om p le x e c um ar sup ort a p e ntru op e ratii d e u n d o i red o , tratare a e v e nim e nte lor g e ne rate d e c ursor s (c are t), 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 e num ire a d e d ocu m en t, c are g e stione az stare a a c om p one nte i. O re fe rint la m od e l p oate ob inut c u m e tod a getDocument, a t a c e re turne az un ob ie c t d e tip Document. a O reprez entare, c are e ste re sp onsab il c u a are a te x tului. a s U n controller, c unosc ut sub num e le d e ed ito r kit c are p e rm ite sc rie re a i c itire a te x tului i c are p e rm ite d e nire a d e ac iuni ne c e sare e d itrii. s s t a E x ist d ife re nt fat d e A W T i la niv e lul tratrii e v e nim e nte lor g e ne rate a a s a d e c om p one nte le p e ntru e d itare a d e te x te . D intre e v e nim e nte le c e p ot g e ne rate am intim : A ctionE vent - Com p one nte le d e riv ate d in JTextField v or g e ne ra un e v e nim e nt d e ac e st tip la ap sare a taste i E nte r c suta d e e d itare a a n a te x tului. Inte rfata c are tre b uie im p le m e ntat e ste A ctionL istener. a

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 e nim e ntul g e ne rat la d e p lasare a c ursorului c e g e stione az p oz itia c ure nt te x t. Inte rfata c ore sp unz toare CaretL isa a n a tener c ontine o sing ur m e tod : caretUpdate c e v a ap e lat ori d e a a a c te ori ap are o sch im b are . a

D ocum entE vent - E v e nim e nte le d e ac e st tip sunt g e ne rate la oric e sch im b are a te x tului, sursa lor ind d oc um e ntul (m od e lul) c om p one nte i i nu c om p one nta sine . Inte rfata c ore sp unz toare e ste D ocus n a m entL istener, c e c ontine m e tod e le :

insertUpdate - ap e lat la ad ug are a d e noi c arac te re ; a a removeUpdate - ap e lat d up o op e ratiune d e te rg e re ; a a s changedUpdate - ap e lat la sch im b are a unor atrib ute le g ate d e a stilul te x tului.

P roperty Ch ang eE vent - E ste un e v e nim e nt c om un tuturor c om p one nte lor d e tip J av aB e an, ind g e ne rat la oric e sch im b are a une i p rop rie t i a c om p one nte i. Inte rfata c ore sp unz toare e ste P roperty at a Ch ang eL istener, c e c ontine m e tod a propertyChange.

11.6 .3

Com ponente pentru selectarea unor elem ente

In ac e ast c ate g orie v om inc lud e c lase le c are p e rm it se le c tare a unor v alori a (e le m e nte ) d intr-o se rie p re stab ilit. A c e ste a sunt: JL ist, JCom b oB ox i a s JS pinner.

Clasa JL ist Clasa JList d e sc rie o list d e e le m e nte d isp use p e una sau m ai m ulte c oloane , a d in c are utiliz atorul p oate se le c ta unul sau m ai m ulte . U z ual un ob ie c t d e ac e st tip v a inc lus ntr-un c ontaine r d e tip JScrollPane.

320

CAPIT O L UL 1 1 . SW ING

Initializ are a une i liste se re aliz e az m ai m ulte m od alit i: a n at Folosind unul d in c onstruc torii c are p rim e sc c a arg um e nt un v e c tor d e e le m e nte . Object elemente[] = {"Unu", "Doi", new Integer(3), new Double(4)}; JList lista = new JList(elemente); Folosind c onstruc torul fr arg um e nte i ad ug nd ap oi e le m e nte m od aa s a a 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, re sp onsab il c u furniz are a e le m e nte lor liste i. A c e sta e ste un ob ie c t d intr-o c las c e tre b uie s im p le m e nte z e a a inte rfata L istM odel, uz ual ind folosit e x tind e re a c lase i p re d e nite a A b stractL istM odel i sup rad e nire a m e tod e lor: getElementAt c are s furniz e az e le m e ntul d e p e o anum it p ositie d in list, re sp e c tiv getSize a a a c are tre b uie s re turne z e num rul total d e e le m e nte d in list. E v id e nt, a a a ac e ast v ariant e ste m ai c om p le x , ofe rind e x ib ilitate sp orit lua a a a n c rul c u liste . ModelLista model = new ModelLista(); JList lista = new JList(model);

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 stiune a artic ole lor se le c tate d intr-o list se re aliz e az p rin inte rm e d iul a a unui m od e l, ac e sta ind un ob ie c t d e tip L istS electionM odel. Ob ie c te le d e tip JList g e ne re az e v e nim e nte d e tip L istS electionE vent, inte rfata c ore a sp unz toare ind L istS electionL istener c e c ontine m e tod a valueCh ang ed a ap e lat ori d e c te ori v a sch im b at se le c ia e le m e nte lor d in list. a a a t a 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();

322 ... } }

CAPIT O L UL 1 1 . SW ING

E v id e nt, c lasa ofe r m e tod e p e ntru se le c tare a unor e le m e nte d in c ad rul a p rog ram ului setSelectedIndex, setSelectedIndices, etc. i p e ntru ob ine re a s t c e lor se le c tate la un m om e nt d at getSelectedIndex, getSelectedIndices, etc..

O fac ilitate e x tre m d e im p ortant p e c are o au liste le e ste p osib ilitate a d e a a stab ili un ren d erer p e ntru e c are artic ol p arte . Im p lic it toate e le m e nte le n liste i sunt a ate ac e la i fe l, a ac e st luc ru p oate sch im b at p rin c re are a s n s ns une i c lase c e im p le m e nte az inte rfata L istCellR enderer i p e rsonaliz e az a s a re p re z e ntare a e le m e nte lor liste i func ie d e d iv e r i p aram e tri. Inte rfata n t s ListCellRenderer c ontine o sing ur m e tod g etL istCellR endererCom a a ponent c e re turne az un ob ie c t d e tip Component. M e tod a v a ap e lat a a n p arte p e ntru re p re z e ntare a e c rui e le m e nt al liste i. a 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 tare a unui anum it ren d erer p e ntru o list se re aliz e az c u m e tod a setCella a R enderer.

Clasa JCom b oB ox Clasa JComboBox e ste sim ilar c u JList, c u d e ose b ire a c p e rm ite d oar se a a le c tare a unui sing ur artic ol, ac e sta ind i sing urul p e rm ane nt v iz ib il. L ista s

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R

323

c e lorlalte e le m e nte e ste a at d oar la ap sare a unui b uton m arc at c u o s a a sg e at, c e fac e p arte inte g rant d in c om p one nt. a a a a

JComboBox func ione az d up ac e le a i p rinc ip ii c a i c lasa JList. t a a s s Initializ are a se fac e d intr-un v e c tor sau folosind un m od e l d e tip ul Com b oB ox M odel, e c are e le m e nt p ut nd d e ase m e ne a re p re z e ntat d ife rit p rin a inte rm e d iul unui ob ie c t c e im p le m e nte az ac e e a i inte fat c a i c az ul lisa s a s n te lor: L istCellR enderer. O d ife re nt notab il c onst m od ul d e se le c tare a unui artic ol, d e oare c e a a a n JComboBox p e rm ite i e d itare a e x p lic it a v alorii e le m e ntului, ac e st luc ru ind s a c ontrolat d e m e tod a setEditable. E v e nim e nte le g e ne rate d e ob ie c te le JComboBox sunt d e tip ItemEvent g e ne rate la nav ig are a p rin list, re sp e c tiv ActionEvent g e ne rate la se le c tare a a e fe c tiv a unui artic ol. a

Clasa JS pinner Clasa JSpinner ofe r p osib ilitate a d e a se le c ta o anum it v aloare (e le m e nt) a a d intr-un d om e niu p re stab ilit, lista e le m e nte lor ne ind a v iz ib il. E ste ns a folosit atunc i c nd d om e niul d in c are p oate fc ut se le c ia e ste foarte m are a a a t sau ch iar ne m rg init; d e e x e m p lu: num e re intre g i intre 1950 si 2050. Com a p one nta c ontine d ou b utoane c u c are p oate se le c tat urm torul, re sp e c tiv a a p re d e c e sorul e le m e nt d in d om e niu.

JSpiner se b az e az e x c lusiv p e folosire a unui m od e l. A c e sta e ste un a ob ie c t d e tip S pinnerM odel, e x ist nd o se rie d e c lase p re d e nite c e im p le a m e nte az ac e ast inte rfat c um ar SpinnerListModel, SpinnerNumberModel a a a sau SpinnerDateModel c e p ot utiliz ate .

324

CAPIT O L UL 1 1 . SW ING

Com p one nte le d e ac e st tip p e rm it i sp e c ic are a unui anum it tip d e s e d itor p e ntru v alorile e le m e nte lor sale . A c e sta e ste instalat autom at p e ntru e c are d in m od e le le stand ard am intite m ai sus, ind re p re z e ntat d e una d in c lase le JSpinner.ListEditor, JSpinner.NumberEditor, re sp e c tiv JSpinner.DateEditor, toate d e riv ate d in JSpinner.DefaultEditor. Fie c are d in e d itoare le am intite p e rm ite d iv e rse form atri sp e c ic e . a E v e nim e nte le g e ne rate d e ob ie c te le d e tip JSpinner sunt d e tip ChangeEvent, g e ne rate la sch im b are a strii c om p one nte i. a

11.6 .4

T ab ele

Clasa JT ab le p e rm ite c re are a d e c om p one nte c are s a e z e o se rie d e e le a s m e nte ntr-un form at tab e lar, artic ole le ind d isp use p e linii i c oloane . U n s tab e l p oate folosit d oar p e ntru a are a form atat a unor d ate , d ar e ste s a p osib il i e d itare a inform atie i d in c e lule le sale . D e ase m e ne a, liniile tab e luas lui p ot m arc ate c a se le c tate , tip ul se le c ie i ind sim p lu sau c om p us, tab e le le t e x tinz nd astfe l func ionalitate a liste lor. a t

D e i c lasa JTable se g se te p ach e tul javax.swing, o se rie d e c lase i s a s n s inte rfe e ne c e sare luc rului c u tab e le se g se sc p ach e tul javax .sw ing .tab le, t a n ac e sta tre b uind a ad ar im p ortat. s Initializ are a unui tab e l p oate fc ut m ai m ulte m od uri. a a n Ce a m ai sim p l v ariant e ste s folosim unul d in c onstruc torii c are p rim e sc a a a c a arg um e nte e le m e nte le tab e lului sub form a une i m atric i sau a une i c ole c ii t d e tip Vector i d e num irile c ap urilor d e c oloan: s a 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 c um se ob se rv , tip ul d e d ate al e le m e nte lor d e p e o c oloan e ste a a a d e tip re fe rint i p oate oric are . In c az ul c are c e lule le tab e lului sunt a s n

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R

325

e d itab ile tre b uie s e x iste un e d itor p otriv it p e ntru tip ul e le m e ntului d in a c e lula re sp e c tiv . D in m otiv e d e e c ie nt, im p le m e ntare a ac e ste i c lase e ste a a orie ntat la niv e l d e c oloan, c e e a c e am n c artic ole d e p e o c oloan a a nse a a a v or re p re z e ntate la fe l i v or av e a ac e la i tip d e e d itor. s s A d oua v ariant d e c re are a unui tab e l e ste p rin im p le m e ntare a m od e lua lui ac e stuia ntr-o c las se p arat i folosire a c onstruc torului c ore sp unz tor. a as a Inte rfata c are d e sc rie m od e lul c lase i JTable e ste T ab leM odel i c ontine s m e tod e le c are v or inte rog ate p e ntru ob ine re a inform atie i d in tab e l. U z ual, t c re are a unui m od e l se fac e p rin e x tind e re a c lase i p re d e nite A b stractT ab leM odel, c are im p le m e nte az d e ja TableModel. T ot c e e a c e tre b uie s fac e m a a e ste s sup rad e nim m e tod e le c are ne inte re se az , c e le m ai utiliz ate ind a a (p rim e le tre i tre b uie ob lig atoriu sup rad e nite , e le ind d e c larate ab strac te n c lasa d e b az ): a g etR ow Count - re turne az num rul d e linii ale tab e lului; a a g etColum nCount - re turne az num rul d e c oloane ale tab e lului; a a g etV alueA t - re turne az e le m e ntul d e la o anum it linie i c oloan; a a s a g etColum nN am e - re turne az d e num ire a e c re i c oloane ; a a isCellE ditab le - sp e c ic d ac o anum it c e lul e ste e d itab il. a a a a a M od e lul m ai c ontine i m e tod a setV alueA t c are p oate folosit p e ntru s a se tare a e x p lic it a v alorii une i c e lule . a 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() {

326 return elemente.length;

CAPIT O L UL 1 1 . SW ING

} 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 e ne ra un e v e nim e nt d e tip T ab leM odelE vent. P e ntru a trata ac e ste e v e nim e nte v a tre b ui s im p le m e ntm a a inte rfata T ab leM odelL istener c e c ontine m e tod a tab leCh ang ed. Inre g istrare a unui liste ne r v a fc ut p e ntru m od e lul tab e lului: a a

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); ... } }

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R

327

T ab e le ofe r p osib ilitate a d e a se le c ta una sau m ai m ulte linii, nu ne ap rat a a c onse c utiv e , g e stiune a liniilor se le c tate ind re aliz at p rin inte rm e d iul unui a m od e l. A c e sta e ste o instant c e im p le m e nte az , a a ntoc m ai c a la liste , inte rfata L istS electionM odel. T ratare a e v e nim e nte lor g e ne rate d e sch im b are a se le c ie i t tab e l se re aliz e az p rin g istrare a unui asc ulttor d e tip L istS electionn a nre a 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 c um am sp us, c e lule une i c oloane v or re p re z e ntare la fe l, e c are a c oloan av nd asoc iat un ob ie c t ren d erer re sp onsab il c u c re are a c om p one na a

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 e nte az inte rfata a T ab leCellR enderer, c are are o sing ur m e tod g etT ab leCellR endera a erCom ponent, ac e asta ind re sp onsab il c u c re are a c om p one nte lor c e v or a a ate c e lule le une i c oloane . Im p lic it, e x ist o se rie d e tip uri d e d ate s n a c u re p re z e ntri sp e c ic e , c um ar : Boolean, Number, Double, Float, a Date, ImageIcon, Icon, re stul tip urilor av nd o re p re z e ntare stand ard c e a c onst a ntr-o e tich e t c u re p re z e ntare a ob ie c tului c a ir d e c arac te re . S p e c ia s c are a unui ren d erer p rop riu se re aliz e az c u m e tod a setD efaultR enderer, a c e asoc iaz un anum it tip d e d ate c u un ob ie c t d e tip TableRenderer. a public class MyRenderer extends JLabel implements TableCellRenderer { public Component getTableCellRendererComponent(...) { ... return this; } }

O situatie sim ilar o re g sim la niv e lul e d itorului asoc iat c e lule lor d intr-o a a anum it c oloan. A c e sta e ste un ob ie c t c e im p le m e nte az inte rfata T reea a a CellE ditor, c e e x tind e inte rfata CellE ditor c are g e ne raliz e az c onc e p tul a d e c e lul e d itab il p e c are v om m ai re g si la arb ori. Im p lic it, e x ist o a a l a a se rie d e e d itoare stand ard p e ntru tip urile d e d ate m e ntionate ante rior, d ar e ste p osib il sp e c ic are a unui e d itor p rop riu c u m e tod a setD efaultE ditor. a Cre are a unui e d itor p rop riu se re aliz e az c e l m ai sim p lu p rin e x tind e re a c lase i a utilitare A b stractCellE ditor, c are im p le m e nte az CellEditor, p lus im p le a m e ntare a m e tod e i sp e c ic e d in TreeCellEditor. public class MyEditor extends AbstractCellEditor implements TableCellEditor { // Singura metoda abstracta a parintelui public Object getCellEditorValue() { // Returneaza valoarea editata ... }

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R // Metoda definita de TableCellEditor public Component getTableCellEditorComponent(...) { // Returneaza componenta de tip editor ... } }

329

11.6 .5

A rb ori

Clasa JT ree p e rm ite a are a unor e le m e nte s ntr-o m anie r ie rarh ic . Ca a a oric e c om p one nt S w ing ne triv ial, un ob ie c t JTree re p re z int d oar o im ag ine a a a a d ate lor, inform atia sine ind m anip ulat p rin inte rm e d iul unui m od e l. n a L a niv e l struc tural, un arb ore e ste form at d intr-o r d cin , n o d u ri in tern e a a a c are au c e l p utin un u i n o d u ri fru n z - c are nu m ai au nic i un d e sc e nd e nt. s a

D e i c lasa JTree se g se te p ach e tul javax.swing, o se rie d e c lase i s a s n s inte rfe e ne c e sare luc rului c u arb ori se g se sc p ach e tul javax .sw ing .tree. t a n Clasa c are m od e le az notiune a d e nod al arb ore lui e ste D efaultM utab lea T reeN ode, ac e asta ind folosit p e ntru toate tip urile d e nod uri. Cre are a a unui arb ore p re sup une a ad ar c re are a unui nod (rd c ina), instantie re a unui s a a ob ie c t d e tip JTree c u rd c ina c re at i ad ug are a ap oi d e nod uri frunz c a a a as a a i ai unor nod uri e x iste nte . String text = "<html><b>Radacina</b></html>"; DefaultMutableTreeNode root = new DefaultMutableTreeNode(text); DefaultMutableTreeNode numere = new DefaultMutableTreeNode("Numere"); DefaultMutableTreeNode siruri =

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 c um se ob se rv , nod urile arb ore lui p ot d e tip uri d ife rite , re p re z e ntare a a a lor im p lic it ind ob inutp rin ap e lare a m e tod e i toString p e ntru ob ie c tului a t a c ontinut. D e ase m e ne a, e ste p osib il sp e c ic are a unui te x t form at H T M L a n c a v aloare a unui nod , ac e sta ind re p re z e ntat c a atare . D ac v arianta ad ug rii e x p lic ite a nod urilor nu e ste p otriv it, se p oate a a a a im p le m e nta o c las c are s d e sc rie m od e lul arb ore lui. A c e asta tre b uie s a a a im p le m e nte z e inte fata T reeM odel. S c op ul une i c om p one nte d e tip arb ore e ste g e ne ral se le c tare a unui nod n al ie rarh ie i. Ca i c az ul liste lor sau a tab e le lor, g e stiune a e le m e nte lor s n se le c tate se re aliz e az p rintr-un m od e l, ac e ast situatie inte rfata c ore a n a sp unz toare ind T reeS electionM odel. A rb orii p e rm it g istrare a unor a nre ob ie c te listen er, d e tip T reeS electionL istener, c are s trate z e e v e nim e nte le a g e ne rate la sch im b are a se le c ie i arb ore . t n class Test implements TreeSelectionListener { ... public Test() { ... // Stabilim modul de selectie tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); // Adaugam un ascultator tree.addTreeSelectionListener(this); ... }

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 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(); ... } }

331

Fie c are nod al arb ore lui e ste re p re z e ntar p rin inte rm e d iul une i c lase ren d erer. A c e asta im p le m e nte az inte rfata T reeCellR enderer, c e a folosit a a im p lic it ind D efaultT reeCellR enderer. P rin im p le m e ntare a inte rfe e i t sau e x tind e re a c lase i im p lic ite p ot c re ate m od alit i d e p e rsonaliz are a at nod urilor arb ore lui func ie d e tip ul sau v aloare a ac e stora. n t E x ist a i d iv e rse m e tod e d e a sch im b a a i are a unui arb ore fr s a ns s nft s aa a c re m noi c lase d e tip TreeCellRenderer. A c e ste a sunt: a setRootVisible - S p e c ic d ac rd c ina e v iz ib il sau nu; a a a a a setShowsRootHandles - S p e c ic d ac nod urile d e p e p rim ul niv e l au a a sim b oluri c are s p e rm it e x p and are a sau re str ng e re a lor. a a a putClientProperty - S tab ile te d iv e rse p rop rie t i, c um ar m od ul s at d e re p re z e ntare a re latiilor (liniilor) d intre nod urile p rinte i u: a s tree.putClientProperty("JTree.lineStyle", "Angled"); // sau "Horizontal", "None" S p e c ic are a une i ic onite p e ntru nod urile frunz sau inte rne : a ImageIcon leaf = createImageIcon("img/leaf.gif"); ImageIcon open = createImageIcon("img/open.gif"); ImageIcon closed = createImageIcon("img/closed.gif");

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 c um tim , c ontaine re le re p re z int sup rafe d e a are p e c are p ot a s a t s p lasate ale c om p one nte , e v e ntual ch iar alte c ontaine re . S up e rc lasa c om p one nte lor d e ac e st tip e ste Container, c las d e sp re c are am m ai d isc utat a n c ap itolul d e d ic at m od e luli A W T . Containe re le p ot ortite d ou c ate g orii: m a n a 1. Containere de nivel nalt - A c e ste a sunt JFrame, JDialog, JApplet i re p re z int rd c inile ie rarh iilor d e c om p one nte ale une i ap lic atii. s a a a 2. Containere interm ediare - R e p re z int sup rafe e d e a are c u ajua t s torul c rora p ot org aniz ate m ai e c ie nt c om p one nte le ap lic atie i, p ut nd a a im b ric ate . Ce le m ai im p ortante c lase c are d e sc riu astfe l d e c ontaine re sunt: JPanel JScrollPane JTabbedPane JSplitPane JLayeredPane JDesktopPane JRootPane JP anel are ac e e a i func ionalitate c a i c lasa Panel d in A W T , ind folosit s t s p e ntru g rup are a m ai m ultor c om p one nte S w ing i p lasare a lor p re un s m a p e o alt sup rafat d e a are . G e stionarul d e p oz itionare im p lic it e ste a a s FlowLayout, ac e sta p ut nd sch im b at a ch iar m om e ntul c onstruirii a ns n

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 ulte rior c u m e tod a setLayout. A d ug are a d e c om p oa ne nte se re aliz e az c a p e ntru oric e c ontaine r, folosind m e tod a add. a 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 las foarte im p ortant arh ite c tura m od e lului a a n S w ing , d e oare c e ofe r sup ort p e ntru d e rulare a p e oriz ontal i v e rtic al a a a s a c om p one nte lor a c ror re p re z e ntare c om p le t nu ap e sup rafata asoa a nc n c iat, nic i o c om p one nt S w ing ne ofe rind sup ort intrinse c p e ntru ac e ast a a a op 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 util p e ntru sup rap une re a m ai m ultor c ontaine re , a uz ual p anouri (ob ie c te d e tip JPanel), p e ac e la i sp atiu d e a are , se le c tare a s s

334

CAPIT O L UL 1 1 . SW ING

unuia sau altui p anou re aliz nd u-se p rin inte rm e d iul unor b utoane d isp use a p e p arte a sup e rioar a c om p one nte i, e c are p anou av nd un astfe l d e b ua a ton c ore sp unz tor. Ca func ionalitate , ofe r o im p le m e ntare ase m ntoare a t a a a g 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 re are a unui c ontaine r c are c ontine d ou c om p o a ne nte d isp use e una l ng c e alalt, e una sub alta i se p arare a ac e stora a a a s p rin inte rm e d iul une i b are c are s p e rm it c ong urare a sup rafe e i aloc ate a a t e c re i c om p one nte . a String elem[] = {"Unu", "Doi", "Trei" }; JList list = new JList(elem);

1 1 .6 . F O L O SIRE A CO M PO NE NT E L O R 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);

335

11.6 .7

D ialog uri

Clasa c are d e sc rie fe re stre d e d ialog e ste JDialog, c re are a unui d ialog re aliz nd u-se p rin e x tind e re a ac e ste ia, a ntoc m ai c a m od e lul A W T . In S w ing n e x ist a o se rie d e c lase p re d e nite c e d e sc riu anum ite tip uri d e d ialog uri, a ns e x tre m d e utile m ajoritate a ap lic atiilor. A c e ste a sunt: n JO ptionP ane - P e rm ite c re are a unor d ialog uri sim p le , folosite p e ntru a are a unor m e saje , re aliz are a unor inte rog ri d e c onrm are / re nuntare , s a

336

CAPIT O L UL 1 1 . SW ING e tc . sau ch iar p e ntru introd uc e re a unor v alori, c lasa ind e x tre m d e c ong urab il. M ai jos, sunt e x e m p lic ate d ou m od alit i d e utiliz are a a at a 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 c are p e rm ite nav ig are a p rin siste m ul d e ie re i se le c tare a unui anum it ie r p e ntru op e ratii d e d e sch id e re , s s s re sp e c tiv salv are . JColorCh ooser - D ialog stand ard p e ntru se le c tare a ntr-o m anie r a fac il a une i c ulori. a P rog ressM onitor - Clas utiliz at p e ntru m onitoriz are p rog re sului a a a une i op e ratii c onsum atoare d e tim p .

11.7
11.7 .1

D esenarea
M etode speci ce

D up c um tim , d e se nare a une i c om p one nte e ste un p roc e s c are se e x e c uta a s autom at ori d e c te ori e ste ne c e sar. P roc e sul sine e ste ase m ntor c e lui a n a a d in m od e lul A W T , a e x ist une le d ife re nte c are tre b uie m e ntionate . ns a Oric e c om p one nt se g se te a a s ntr-o ie rarh ie form at d e c ontaine re , rd c ina a a a ac e ste i ind un c ontaine r d e niv e l nalt, c um ar o fe re astr sau sup rafata a unui ap p le t. Cu alte c uv inte , c om p one nta e ste p lasat p e o sup rafat d e a a a are , c are la r nd ul e i p oate p lasat p e alt sup rafat i a a m ai d e p arte . s a a a a s s C nd e ste ne c e sar d e se nare a c om p one nte i re p se c tiv e , e la p rim a sa a are , a a s e c a urm are a unor ac iuni e x te rne sau inte rne p rog ram ului, op e ratia d e d e t se nare v a e x e c utat p e ntru toate c ontaine re le , e p nd c u c e l d e la niv e lul a nc a sup e rior.

1 1 .7 . D E SE NARE A

337

D e se nare a se b az e az p e m od e lul A W T , m e tod a c e a m ai im p ortant ind a a paint, ap e lat autom at ori d e c te ori e ste ne c e sar. P e ntru c om p one nte le a a S w ing , ac e ast m e tod are a o im p le m e ntare sp e c ic i nu treb uie a a ns a s suprade nit . A c e asta e ste re sp onsab il c u ap e lul m e tod e lor S w ing c e a a d e se ne az c om p one nta i anum e : a s paintCom ponent - E ste p rinc ip ala m e tod p e ntru d e se nare c e e ste a sup rad e nit p e ntru e c are c om p one nt S w ing p arte p e ntru a d e sc rie a a n re p re z e ntare a sa g rac . Im p lic it, c az ul c are c om p one nta e ste a n n op ac m e tod a d e se ne az sup rafata sa c u c uloare a d e fund al, d up c are a a a v a e x e c uta d e se nare a p rop riu-z is. a paintB order - D e se ne az ch e nare le c om p one nte i (d ac e x ist). N u a a a tre b uie sup rad e nit. a paintCh ildren - S olic it d e se nare a c om p one nte lor c ontinute d e ac e ast a a c om p one nt (d ac e x ist). N u tre b uie sup rad e nit. a a a a M e tod a paint e ste re sp onsab il c u ap e lul m e tod e lor am intite m ai sus i a s re aliz are a unor op tim iz ri le g ate d e p roc e sul d e d e se nare , c um ar im p le a m e ntare a m e c anism ului d e d o u ble-bu erin g. D e i e ste p osib il sup rad e nire a s a e i, ac e st luc ru nu e ste re c om and at, d in m otiv e le am intite m ai sus. Ca i A W T , d ac se d ore te re d e se nare a e x p lic it a une i c om p one nte s n a s a se v a ap e la m e tod a repaint. In c az ul c are d im e nsiune a sau p oz itia c om n p one nte 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 lui repaint.

A tentie Intoc m ai c a A W T , d e se nare a e ste re aliz at d e rul d e e x e c utie c are se n a oc up c u transm ite re a e v e nim e nte lor. P e p e rioad a c are ac e sta e ste oc up at a n c u transm ite re a unui m e saj nu v a fc ut nic i o d e se nare . D e ase m e ne a, a a d ac ac e sta e ste b loc at a ntr-o op e ratiune d e d e se nare c e c onsum m ult tim p , a p e p e rioad a re sp e c tiv nu v a transm is nic i un m e saj. a

338

CAPIT O L UL 1 1 . SW ING

11.7 .2

Consideratii g enerale

In c ontinuare v om p re z e nta c te v a c onsid e ratii g e ne rale le g ate d e d ife rite a asp e c te ale d e se nrii c ad rul m od e lului S w ing . a n

A area im ag inilor s In A W T a are a une i im ag ini e ra re aliz at uz ual p rin sup rad e nire a c lase i s a Canvas i d e se nare a im ag inii m e tod a paint a ac e ste ia. In S w ing , e x ist s n a c te v a solutii m ai sim p le p e ntru a are a une i im ag ini, c e a m ai utiliz at ind a s a c re are a une i e tich e te (JLabel) sau a unui b uton (JButton) c are s aib se a a tat o anum it im ag ine p e sup rafata sa. Im ag ine a re sp e c tiv tre b uie c re at a a a a folosind c lasa Im ag eIcon. ImageIcon img = new ImageIcon("smiley.gif"); JLabel label = new JLabel(img);

T ransparenta Cu ajutorul m e tod e i setOpaque p oate c ontrolat op ac itate a c om p one nte lor a S w ing . A c e asta e ste o fac ilitate e x tre m d e im p ortant d e oare c e p e rm ite a c re are a d e c om p one nte c are nu au form re c tang ular. D e e x e m p lu, un a a b uton c irc ular v a c onstruit c a ind transp are nt (setOpaque(false)) i v a s d e se na inte riorul su o e lip s um p lut c u o anum it c uloare . E v id e nt, e ste n a a a a ne c e sar im p le m e ntare a d e c od sp e c ic p e ntru a trata ap sare a ac e stui tip a a d e b uton. T rab sp are nta a v ine c u un anum it p re , d e oare c e p e ntru c om p one nte le ns t transp are nte v or tre b ui re d e se nate c ontaine re le p e c are se g se te ac e asta, a s e tinind astfe l p roc e sul d e a are . D in ac e st m otiv , d e e c are d at c nd nc s a a e ste c az ul, se re c om and se tare a c om p one nte lor c a ind op ac e a (setOpaque(true)).

D im ensiunile com ponentelor D up c um tim , oric e c om p one nt e ste d e nit d e o sup rafat re c tang ua s a a a lar. D im e nsiunile ac e ste i p ot ob inute c u m e tod e le getSize, getWidth, a t getHeight. A c e ste a inc lud a i d im sniunile ch e nare lor, e v id e nt d ac ac e sns s a te a e x ist. S up rafata oc up at d e ac e ste a p oate a at c u m e tod a g etInsets a a a

1 1 .7 . D E SE NARE A

339

c e v a re turna un ob ie c t d e tip Insets c e sp e c ic num rul d e p ix e li oc up ati a a c u ch e nare jurul c om p one nte i. n 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 ra ce A rg um e ntul m e tod e i paintComponent e ste d e tip G raph ics c e ofe r p rim a itiv e le stand ard d e d e se nare . In m ajoritate a c az urilor a, arg um e ntul e ste ns d e fap t d e tip G raph ics2 D , c las c e e x tind e Graphics i p une la d isp oz itie a s m e tod e m ai sositc ate d e d e se nare c unosc ute sub num e le d e J av a2D . P e ntru a av e a ac c e s la A P I-ul J av a2D , e ste suc ie nt s fac e m c onv e rsia arg um e ntului a c e d e sc rie c onte x tul g rac : public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; // Desenam apoi cu g2d ... } In S w ing , p e ntru a e c ie ntiz a d e se nare a, ob ie c tul d e tip Graphics p rim it c a arg um e nt d e m e tod a paintComponent e ste re folosit p e ntru d e se nare a c om p one nte i, a ch e nare lor i a ilor si. D in ac e st m otiv e ste foarte im p ortant s a c a atunc i c nd sup rad e nim m e tod a paintComponent s ne asig urm c la a a a a te rm inare a m e tod e i stare a ob ie c tului Graphics e ste ac e e a i c a la e p ut. s nc A c e st luc ru p oate re aliz at e e x p lic it, e folosind o c op ie a c onte x tului g rac p rim it c a arg um e nt: // 1.Explicit Graphics2D g2d = (Graphics2D)g; g2d.translate(x, y); // modificam contexul ... g2d.translate(-x, -y); // revenim la starea initiala

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 o o k a n d F eel (L & F ) v om e le g e m od ul c are sunt d e nt n se nate c om p one nte le S w ing i fe lul c are ac e ste a inte rac ione az c u utis n t a liz atorul. P osib ilitate a d e a ale g e ntre d ife rite m od uri L & F are av antajul d e a ofe ri p re z e ntare a une i ap lic atii ntr-o form g rac c are s c ore sp und a a a a p re fe rinte lor utiliz atorilor. In p rinc ip iu, v ariante le orig inale d e L & F furniz ate d istrib utia stand ard ofe re au m od alitate a c a o inte rfat S w ing e s se n a a ad re z e ansam b lul g rac al siste m ului d e op e rare folosit, e s aib un nc n a a asp e c t sp e c ic J av a. Oric e L & F e ste d e sc ris d e o c las d e riv at d in L ook A ndF eel. D istrib utia a a stand ard J av a inc lud e urm toare le c lase c e p ot utiliz ate p e ntru se le c tare a a unui L & F: javax.swing.plaf.metal.MetalLookAndFeel E ste v arianta im p lic it d e L & F i are un asp e c t sp e c ic J av a. a s com.sun.java.swing.plaf.windows.WindowsLookAndFeel V arianta sp e c ic siste m e lor d e op e rare W ind ow s. Inc e p nd c u v e rsia a une a 1.4.2 e x ist i im p le m e ntare a p e ntru W ind ow s XP . as com.sun.java.swing.plaf.mac.MacLookAndFeel V arianta sp e c ic siste m e lor d e op e rare M ac . a com.sun.java.swing.plaf.motif.MotifLookAndFeel S p e c ic inte rfata CD E / M otif. a com.sun.java.swing.plaf.gtk.GTKLookAndFeel G T K + re p re z int un stand ard d e c re are a inte rfe e lor g rac e d e z v oltat a t ind e p e nd e nt d e lim b ajul J av a. (G T K e ste ac ronim ul d e la G N U Im a ge M a n ip u la tio n P ro gra m T o o lkit). Folosind ac e st L & F e ste p osib il i a s

1 1 .8 . L O O K AND F E E L

341

sp e c ic are a une i anum ite te m e p rin inte rm e d iul unui ie r d e re surse s sau folosind v ariab ila swing.gtkthemefile, c a e x e m p lul d e m ai jos: n java -Dswing.gtkthemefile=temaSpecifica/gtkrc App S p e c ic are une i anum ite inte rfe e L & F p oate re aliz at p rin m ai m ulte t a m od alit i. at

F olosirea clasei U Im anag er Clasa UIManager p une la d isp oz itie o se rie d e m e tod e static e p e ntru se le c tare a la m om e ntul e x e c utie i a uni anum it L & F, p re c um i p e ntru ob ine re a s t unor v ariante sp e c ic e : getLookAndFeel - Ob ine v arianta c ure nt, re turn nd un ob ie c t d e tip t a a LookAndFeel. setLookAndFeel - S e te az m od ul c ure t L & F. M e tod a p rim e te c a ara s g um e nt un ob ie c t d intr-o c las d e riv at d in LookAndFeel, e un ir d e a a s c arac te re c u num e le c om p le t al c lase i L & F. getSystemLookAndFeelClassName - Ob ine v ariant sp e c ic siste m ut a a lui d e op e rare folosit. In c az ul c are nu e x ist nic i o astfe l d e c las, n a a re turne az v arianta stand ard . a getCrossPlatformLookAndFeelClassName - R e turne az inte rfata g rac a a stand ard J av a (J L F). // Exemple: UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName());

S etarea propriet ii sw ing .defaultlaf at E x ist p osib ilitate a d e a sp e c ic a v arianta d e L & F a ap lic atie d ire c t d e la a linia d e c om and p rin se tare a p rop rie t ii sw ing .defaultlaf: a at

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 alt v ariant d e a se ta ac e ast p rop rie tate e ste sch im b are a e i d ire c t a a a n ie rul swing.properties situat sub d ire c torul lib al d istrib utie i J av a. s n # Swing properties swing.defaultlaf= com.sun.java.swing.plaf.windows.WindowsLookAndFeel Ord ine a c are e ste ale as c lasa L & F e ste urm toare a: n a a 1. A p e lul e x p lic it al m e tod e i UIManager.setLookAndFeel nainte a c re rii a une i c om p one nte S w ing . 2. P rop rie tate a swing.defaultlaf sp e c ic at d e la linia d e c om and . a a 3. P rop rie tate a swing.defaultlaf sp e c ic at ie rul swing.properties. a n s 4. Clasa stand ard J av a (J L F).

E x ist p osib ilitate a d e a sch im b a v arianta d e L & F ch iar i d up a are a a s a s c om p one nte lor. A c e sta e ste un p roc e s c are tre b uie s ac tualiz e z e ie rarh iile a d e c om p one nte , e p nd c u c ontaine re le d e niv e l nc a nalt i v a re aliz at p rin s ap e lul m e tod e i S w ing U tilities.updateCom ponentT reeU I c e v a p rim i c a arg um e nt rd c ina une i ie rarh ii. S e c v e nta c are e fe c tue az ac e ast op e ratie a a a a p e ntru o fe re astr f e ste : a UIManager.setLookAndFeel(numeClasaLF); SwingUtilities.updateComponentTreeUI(f); f.pack();

Capitolul 12 F ire de ex ecutie


12 .1 Introducere

Fire le d e e x e c utie fac tre c e re a d e la p rog ram are a se c v e ntial la p rog ram are a a c onc ure nt. U n p rog ram se c v e ntial re p re z int m od e lul c lasic d e p rog ram : are a a un e p ut, o se c v e nt d e e x e c utie a instruc iunilor sale i un sf r it. Cu alte nc a t s as c uv inte , la un m om e nt d at p rog ram ul are un sing ur p unc t d e e x e c utie . U n p rog ram a at e x e c utie se num e te p ro ce s. U n siste m d e op e rare m onotask n s ing , c um ar M S -D OS , nu e ste c ap ab il s e x e c ute d e c t un sing ur p roc e s a a la un m om e nt d at, tim p c e un siste m d e op e rare m ultitask ing , c um ar n U N IX sau W ind ow s, p oate rula oric te p roc e se ac e la i tim p (c onc ure nt), a n s folosind d iv e rse strate g ii d e aloc are a p roc e sorului e c ruia d intre ac e ste a. a A m re am intit ac e st luc ru d e oare c e notiune a d e r d e e x e c utie nu are se ns d e c t c ad rul unui siste m d e op e rare m ultitask ing . a n U n r d e e x e c utie e ste sim ilar unui p roc e s se c v e ntial, se nsul c are n a un e p ut, o se c v e nt d e e x e c utie i un sf r it. D ife re nta d intre un r d e nc a s as e x e c utie i un p roc e s c onst fap tul c un r d e e x e c utie nu p oate rula s a n a ind e p e nd e nt c i tre b uie s rule z e c ad rul unui p roc e s. a n D e nitie U n r d e execu ie e ste o suc c e siune sc e v e ntial d e instruc iuni c are se t a t e x e c ut c ad rul unui p roc e s. a n

343

344 P rog ram (p roc e s)

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE P rog ram (p roc e s)

U n p rog ram si p oate d e ni a nu d oar un r d e e x e c utie c i oric te , c e e a ns a c e am n c c ad rul unui p roc e s se p ot e x e c uta sim ultan m ai m ulte re nse a a n d e e x e c utie , p e rm it nd e fe c tuare a c onc ure nt a sarc inilor ind e p e nd e nte ale a a ac e lui p rog ram . U n r d e e x e c utie p oate ase m nat c u o v e rsiune re d us a unui p roc e s, a a am b e le rul nd sim ultan i ind e p e nd e nt p e o struc tur se c v e ntial form at d e a s a a a instruc iunile lor. D e ase m e ne a, e x e c utia sim ultan a re lor c ad rul unui t a n p roc e s e ste sim ilar c u e x e c utia c onc ure nt a p roc e se lor: siste m ul d e op e rare a a v a aloc a p roc e sorul d up o anum it strate g ie e c rui r d e e x e c utie p n la a a a a a te rm inare a lor. D in ac e st m otiv re le d e e x e c utie m ai sunt num ite i p rocese s u so a re. Care ar a d e ose b irile ns ntre un r d e e x e c utie i un p roc e s ? In p rim ul, s r nd d e ose b ire a m ajor c onst fap tul c re le d e e x e c utie nu p ot rula d e c t a a a n a a c ad rul unui p roc e s. O alt d e ose b ire re z ult d in fap tul c e c are p roc e s n a a a are p rop ria sa m e m orie (p rop riul su sp atiu d e ad re se ) iar la c re are a unui nou a p roc e s (fork ) e ste re aliz at o c op ie e x ac t a p roc e sului p rinte : c od i d ate , a a a s tim p c e la c re are a unui r nu e ste c op iat d e c t c od ul p roc e sului p rinte , n a a toate re le d e e x e c utie av nd ac c e s la ac e le a i d ate , d ate le p roc e sului orig inal. a s A ad ar, un r m ai p oate p riv it i c a un co n text d e execu ie c ad rul unui s s t n p roc e s. Fire le d e e x e c utie sunt utile m ulte p riv inte , a uz ual e le sunt folosite n ns p e ntru e x e c utare a unor op e ratii c onsum atoare d e tim p fr a b loc a p roc e sul aa p rinc ip al: c alc ule m ate m atic e , a te p tare a e lib e rrii une i re surse , d e se nare a s a c om p one nte lor une i ap lic atii G U I, e tc . D e m ulte ori ori, re le si d e sf oar as a ac tiv itate a fund al a, e v id e nt, ac e st luc ru nu e ste ob lig atoriu. n ns

12 .2

Crearea unui r de ex ecutie

Ca oric e alt ob ie c t J av a, un r d e e x e c utie e ste o instant a une i c lase . Fire le a d e e x e c utie d e nite d e o c las v or av e a ac e la i c od i, p rin urm are , ac e e a i a s s s

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE

345

se c v e nta d e instruc iuni. Cre are a une i c lase c are s d e ne asc re d e e x e c utie t a a p oate fac ut p rin d ou m od alit i: a a at p rin e x tind e re a c lase i Thread. p rin im p le m e ntare a inte rfe e i Runnable. t Oric e c las ale c re i instante v or e x e c utate se p arat a a ntr-un r p rop riu tre b uie d e c larat c a ind d e tip R unnab le. A c e asta e ste o inte rfat c are a a c ontine o sing ur m e tod i anum e m e tod a run. A ad ar, oric e c las c e d e sc rie a as s a re d e e x e c utie v a c ontine m e tod a run c are e ste im p le m e ntat c od ul c e v a n rulat. Inte rfata Runnable e ste c onc e p ut c a ind un p rotoc ol c om un p e ntru a ob ie c te le c are d ore sc s e x e c ute un anum it c od p e d urata e x iste nte i lor. a Ce a m ai im p ortant c las c are im p le m e nte az inte rfata Runnable e ste a a a T h read. A c e asta im p le m e nte az un r d e e x e c utie g e ne ric c are , im p lic it, nu a fac e nim ic ; c u alte c uv inte , m e tod a run nu c ontine nic i un c od . Oric e r d e e x e c utie e ste o instant a c lase i Thread sau a une i sub c lase a sa. a

12 .2 .1

E x tinderea clasei T h read

Ce a m ai sim p l m e tod d e a c re a un r d e e x e c utie c are s re aliz e z e o anum it a a a a ac iune e ste p rin e x tind e re a c lase i Thread i sup rad e nire a m e tod e i run a t s ac e ste ia. Form atul g e ne ral al une i astfe l d e c lase e ste : 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 c lase i e ste c onstruc torul, c are p rim e te c a arg um e nt un a s ir c e v a re p re z e nta num e le rului d e e x e c utie . In c az ul c are nu v re m s s n a d m num e re lor p e c are le c re m , atunc i p ute m re nunta la sup rad e nire a a a

346

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

ac e stui c onstruc tor i s folosim c onstruc torul im p lic it, fr arg um e nte , c are s a aa c re e az un r d e e x e c utie fr nic i un num e . U lte rior, ac e sta p oate p rim i un a aa num e c u m e tod a setName. E v id e nt, se p ot d e ni i alti c onstruc tori, ac e tia s s ind e utili atunc i c nd v re m s trim ite m d iv e r i p aram e tri d e initializ are a a s rului nostru. A d ou m e tod e ste m e tod a run, inim a oric rui r d e a a a e x e c utie , c are sc rie m e fe c tiv c od ul c are tre b uie s se e x e c ute . n a U n r d e e x e c utie c re at nu e ste autom at p ornit, lansare a s ind re aliz e az a a d e m e tod a start, d e nit c lasa Thread. a n // Cream firul de executie FirExecutie fir = new FirExecutie("simplu"); // Lansam in executie fir.start(); S c onsid e rm c ontinuare un e x e m p lu c are d e nim un r d e e x e c utie a a n n c e a e az num e re le s a ntre g i d intr-un inte rv al, c u un anum it p as. L isting 12.1: Folosire a 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) ;

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE


// 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 } }

347

G nd ind se c v e ntial, s-ar c re d e c ac e st p rog ram v a a a p rim a d at nua a s a m e re le d e la 0 la 100 c u p asul 5, ap oi num e re le d e la 100 la 200 c u p asul 10, ntruc t p rim ul ap e l e ste c tre c ontorul fir1, d e c i re z ultatul a at p e e c ran a a s ar trb ui s e : a 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 re alitate a, re z ultatul ob inut v a o inte rc alare d e v alori p rod use d e ns t c e le d ou re c e rule az sim ultan. L a rulri d ife rite se p ot ob ine re z ultate a a a t d ife rite d e oare c e tim p ul aloc at e c rui r d e e x e c utie p oate s nu e ac e la i, a a s e l ind c ontrolat d e p roc e sor ntr-o m anie r ap are nt ale atoare . U n p osib il a re z ultat 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 a c nd d orim s c re m o c las c are instantiaz re d e e x e c utie ns a a a a a d ar ac e asta are d e ja o sup e rc las, tiind c J av a nu e ste p e rm is m o te nire a a s a n a s m ultip l ? a class FirExecutie extends Parinte, Thread // incorect ! In ac e st c az , nu m ai p ute m e x tind e c lasa Thread c i tre b uie s im p le m e ntm a a d ire c t inte rfata Runnable. Clasa Thread im p le m e nte az e a a i inte rfata a nss Runnable i, d in ac e st m otiv , la e x tind e re a e i ob ine am im p le m e ntare a ind is t re c t a inte rfe e i. A ad ar, inte rfat Runnable p e rm ite une i c lase s e ac tiv , a t s a a a fr a e x tind e c lasa Thread. aa Inte rfata Runnable se g se te p ach e tul java.lang i e ste d e nit astfe l: a s n s a

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 las c are instantiaz re d e e x e c utie p rin im p le m e ntare a a a inte rfe e i Runnable tre b uie ob lig atoriu s im p le m e nte z e m e tod a run. O astfe l t a d e c las se m ai num e te cla s a ctiv i are urm toare a struc tur: a s a a s a a public class ClasaActiva implements Runnable { public void run() { //Codul firului de executie ... } } S p re d e ose b ire d e m od alitate a ante rioar, se p ie rd e a tot sup ortul ofe rit a ns d e c lasa Thread. S im p la instantie re a une i c lase c are im p le m e ne az inte rfata a Runnable nu c re e az nic i un r d e e x e c utie , c re are a ac e stora tre b uind fc ut a a a e x p lic it. P e ntru a re aliz a ac e st luc ru tre b uie s instantie m un ob ie c t d e tip a Thread c e v a re p re z e nta rul d e e x e c utie p rop riu z is al c rui c od se g ase te a s c lasa noastr. A c e st luc ru se re aliz e az , c a p e ntru oric e alt ob ie c t, p rin n a a instruc iune a new, urm at d e un ap e l la un c onstruc tor al c lase i Thread, a t a ns nu la oric are d intre ac e tia. T re b uie ap e lat c onstruc torul c are s p rim e asc s a a d re p t arg um e nt o instant a c lase i noastre . D up c re are , rul d e e x e c utie a a p oate 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 e ratiuni p ot fc ute ch iar c ad rul c lase i noastre : a n public class FirExecutie implements Runnable { private Thread fir = null; public FirExecutie() if (fir == null) { fir = new Thread(this);

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE fir.start(); } } public void run() { //Codul firului de executie ... } }

349

S p e c ic are a arg um e ntului this c onstruc torul c lase i Thread d e te rm in n a c re are a unui r d e e x e c utie c are , la lansare a sa, v a ap e la m e tod a run d in c lasa c ure nt. A ad ar, ac e st c onstruc tor ac c e p t c a arg um e nt oric e instant a s a a a une i c lase R unnab le . P e ntru c lasa FirExecutie d at m ai sus, lansare a a rului v a fc ut autom at la instantie re a unui ob ie c t al c lase i: a a FirExecutie fir = new FirExecutie();

A tentie M e tod a run nu tre b uie ap e lat e x p lic it, ac e st luc ru re aliz nd u-se autom at a a 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 v a furniz a nic i o e roare , a ac e asta v a e x e c utat c a oric e alt m e tod a, i nu se p arat ns a a s ntr-un r.

S c onsid e rm urm torul a a a folosind inte rfata Runnable. anum it tip , p e o sup rafat d e a re d e e x e c utie c are v or rula sup rafata sa.

e x e m p lu c are c re m d ou re d e e x e c utie n a a Fie c are r v a d e se na g uri g e om e tric e d e un d e se nare d e tip Canvas. V om p orni ap oi d ou a c onc ure nt, d e se n nd g uri d ife rite , e c are p e a

L isting 12.2: Folosire a inte rfe e i Runnable t


import java . awt .*; import java . awt . event .*; class Plansa extends Canvas implements Runnable { // Deoarece Plansa extinde Canvas ,

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 ++) {

1 2 .2 . CRE ARE A UNUI F IR D E E X E CUT IE


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 () ; } }

351

352

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .3

Ciclul de viat al unui r de ex ecutie a

Fie c are r d e e x e c utie are p rop riul su c ic lu d e v iat: e ste c re at, d e v ine ac tiv a a p rin lansare a sa i, la un m om e nt d at, se te rm in. In c ontinuare , v om analiz a s a m ai e ap roap e strile c are se p oate g si un r d e e x e c utie . D iag ram a nd a n a d e m ai jos ilustre az g e ne ric ac e ste stri p re c um i m e tod e le c are p rov oac a a a s tranz itia d intr-o stare alta: n

A ad ar, un r d e e x e c utie se p oate g si una d in urm toare le p atru s a n a stri: a N e w T h re ad R unnab le N ot R unnab le D e ad

S tarea N ew T h read U n r d e e x e c utie se g se te ac e ast stare im e d iat d up c re are a sa, c u alte a s n a a c uv inte d up instantie re a unui ob ie c t d in c lasa Thread sau d intr-o sub c las a a a sa. Thread fir = new Thread(obiectActiv); // fir se gaseste in starea "New Thread"

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE

353

In ac e ast stare rul e ste v id , e l nu are aloc ate nic i un fe l d e re surse sisa te m i sing ura op e ratiune p e c are o p ute m e x e c uta asup ra lui e ste lansare a s e x e c utie , p rin m e tod a start. A p e lul oric re i alte m e tod e afar d e start n a n a nu are nic i un se ns i v a p rov oc a o e x c e p ie d e tip ul IllegalThreadStateException. s t

S tarea R unnab le D up ap e lul m e tod e i start un r v a tre c e stare a R unnab le , ad ic v a a n a e x e c utie . n fir.start(); //fir se gaseste in starea "Runnable" M e tod a start re aliz e z urm toare le op e ratiuni ne c e sare rulrii rului d e a a a e x e c utie : A loc re surse le siste m ne c e sare . a P lanic rul d e e x e c utie la p roc e sor p e ntru a lansat. a A p e le az m e tod a run a ob ie c tului ac tiv al rului. a U n r a at stare a R unnab le nu am n ne ap rat c se g e ste n nse a a a as e fe c tiv e x e c utie , ad ic instruc iunile sale sunt inte rp re tate d e p roc e sor. n a t A c e st luc ru se am p l d in c auz a c m ajoritate a c alc ulatoare lor au un sing ur nt a a p roc e sor iar ac e sta nu p oate rula sim ultan toate re le d e e x e c utie c are se g ase sc stare a R unnab le . P e ntru a re z olv a ac e asta p rob le m e x ist o n a a p lanic are c are s p artaje z e d inam ic i c ore c t p roc e sorul a s ntre toate re le d e e x e c utie c are sunt stare a R unnab le . A ad ar, un r c are rule az p oate n s a s- i a te p te d e fap t r nd ul la p roc e sor. as s a

S tarea N ot R unnab le U n r d e e x e c utie p oate ajung e ac e aat stare una d in urm toare le n a n a situatii: 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, a te p t nd c a o anum it c ond itie s e satisfas a a a c ut; a

354

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

E ste b loc at ntr-o op e ratie d e intrare / ie ire . s M e tod a sleep e ste o m e tod static a c lase i Thread c are p rov oac o a a a p auz tim p ul rulrii rului c ure nt a at e x e c utie , c u alte c uv inte a n a n l ad oarm e p e ntru un tim p sp e c ic at. L ung im e a ac e ste i p auz e e ste sp e c ic at a m ilise c und e i ch iar nanose c und e . Intruc t p oate p rov oc a e x c e p ii d e tip ul n s a t InterruptedException, ap e lul ac e ste i m e tod e se fac e ntr-un b loc d e tip try-cacth: try { // Facem pauza de o secunda Thread.sleep(1000); } catch (InterruptedException e) { ... } Ob se rv ati c m e tod a ind static ap e lul e i nu se fac e p e ntru o instant anum e a a a a c lase i Thread. A c e st luc ru e ste foarte norm al d e oare c e , la un m om e nt d at, un sing ur r e ste e x e c utie i d oar p e ntru ac e sta are se ns ad orm ire a sa. n s In inte rv alul c are un r d e e x e c utie d oarm e , ac e sta nu v a e x e c ut n ch iar d ac p roc e sorul d e v ine d isp onib il. D up e x p irare a inte rv alului sp e c ia a c at rul re v ine stare a R unnab le iar d ac p roc e sorul e ste c ontinuare n a n d isp onib il v a c ontinua e x e c utia. si P e ntru e c are tip d e intrare stare a N ot R unnab le , e x ist o se c v e nt n a a sp e c ic d e ie ire d in stare a re p e c tiv , c are re ad uc e rul d e e x e c utie stare a a s a n R unnab le . A c e ste a sunt: D ac un r d e e x e c utie a fost ad orm it , atunc i e l d e v ine R unnab le a d oar d up sc urg e re a inte rv alului d e tim p sp e c ic at d e instruc iune a a t sleep. D ac un r d e e x e c utie a te ap t o anum it c ond itie , atunc i un alt a s a a ob ie c t tre b uie s inform e z e d ac ac e a c ond itie e ste e p linit sau a l a nd a nu; ac e st luc ru se re aliz e az p rin instruc iunile notify sau notifyAll a t (v e z i S inc roniz are a re lor d e e x e c utie ). D ac un r d e e x e c utie e ste b loc at a ntr-o op e ratiune d e intrare / ie ire s atunc i e l re d e v ine R unnab le atunc i c nd ac e a op e ratiune s-a te rm ia nat.

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 stare a c are ajung e un r d e e x e c utie la te rm inare a sa. U n r nu n p oate op rit d in p rog ram p rintr-o anum it m e tod , c i tre b uie s se te rm ine a a a m od natural la n nch e ie re a m e tod e i run p e c are o e x e c ut. S p re d e ose b ire d e a v e rsiunile c ure nte ale lim b ajului J av a, v e rsiunile m ai v e ch i e x ista m e tod a n stop a c lase i Thread c are te rm ina fortat un r d e e x e c utie , a ac e asta a ns fost e lim inat d in m otiv e d e se c uritate . A ad ar, un r d e e x e c utie tre b uie a s s- i aranje z e sing ur p rop ria sa m oarte . as

12 .3 .1

T erm inarea unui r de ex ecutie

D up c um am v az ut, un r d e e x e c utie nu p oate te rm inat fortat d e c tre a a p rog ram c i tre b uie s- i aranje z e sing ur te rm inare a sa. A c e st luc ru p oate as re aliz at d ou m od alit i: n a at 1. P rin sc rie re a unor m e tod e run c are s- i te rm ine e x e c utia m od natas n ural. L a te rm inare a m e tod e i run se v a te rm ina autom at i rul d e s e x e c utie , ac e sta intr nd stare a D e ad . A m b e le e x e m p le ante riorare a n se ad re az ac e ast c ate g orie . nc a n a // Primul exemplu public void run() { for(int i = a; i <= b; i += pas) System.out.print(i + " " ); } D up a are a num e re lor d in inte rv alul sp e c ic at, m e tod a se te rm in a s a i, od at c u e a, se v a te rm ina i rul d e e x e c utie re p se c tiv . s a s 2. P rin folosire a une i v ariab ile d e te rm inare . In c az ul c nd m e tod a run a tre b uie s e x e c ute o b uc l innit atunc i ac e asta tre b uie c ontrolat a a a a p rintr-o v ariab il c are s op re asc c ic lul atunc i c nd d orim c a rul d e a a a a e x e c utie s se te rm ine . U z ual, v om folosi o v ariab il m e m b r a c lase i a a a c are d e sc rie rul d e e x e c utie c are e e ste p ub lic , e e ste asoc iat c u o a a m e tod p ub lic c are p e rm ite sch im b are a v alorii sale . a a S c onsid e rm e x e m p lul unui r d e e x e c utie c are tre b uie s num e re se a a a c und e le sc urse p n la ap sare a taste i E nte r. a a a

356

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE L isting 12.3: Folosire a 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 e ste ne c e sar d istrug e re a e x p lic it a unui r d e e x e c utie . S iste m ul a a J av a d e c ole c tare a g unoiului se oc up d e ac e st luc ru. S e tare a v alorii a null p e ntru v ariab ila c are re fe re a instanta rului d e e x e c utie v a u ura a s ns ac tiv itate a p roc e sului g c. M e tod a System.exit v a op rit fortat toate re le d e e x e c utie i v a te rm ina s ap lic atia c ure nt. a

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE

357

P e ntru a te sta d ac un r d e e x e c utie a fost p ornit d ar nu s-a te rm inat a p ute m folosi m e tod a isA live. M e tod a re turne az : nc a a true - d ac rul e ste una d in strile R unnab le sau N ot R unnab le a n a false - d ac rul e ste una d in starile N e w T h re ad sau D e ad a n Intre strile R unnab le sau N ot R unnab le , re p e c tiv N e w T h re ad a sau D e ad nu se p oate fac e nic i o d ife re ntie 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 e s e ste c onsid e rat e x e c utie d ac c ontine c e l p utin un r d e e x e c utie n a ac tiv . Cu alte c uv inte , la rulare a une i ap lic atii, m a ina v irtual J av a nu se v a s a op ri d e c t atunc i c nd nu m ai e x ist nic i un r d e e x e c utie ac tiv . D e m ulte ori a a a a d orim s folosim re c are s re aliz e z e d iv e rse ac tiv it i, e v e ntual p e riod ic , ns a a at p e toat d urata d e e x e c utie a p rog ram ului iar m om e ntul te rm inrii ac e stuia a n a s se te rm ine autom at i re le re sp e c tiv e . A c e ste re d e e x e c utie se num e sc a s d em o n i. D up c re are a sa, un r d e e x e c utie p oate fc ut d e m on, sau sc os d in a a ac e ast stare , c u m e tod a setD aem on. a L isting 12.4: Cre are a unui r d e e x c utie 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 ) {} }

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 priorit ilor de ex ecutie at

M ajoritate a c alc ulatoare lor au un sig ur p roc e sor, c e e a c e am n c re le nse a a d e e x e c utie tre b uie s- i p art ac c e sul la ac e l p roc e sor. E x e c utia a s m a ntr-o anum it ord ine a m ai m ultor re d e e x e c utie p e un num r lim itat d e p roc e soare a a se num e te p la n i ca re (sch ed u lin g). S iste m ul J av a d e e x e c utie a p rog ram e lor s im p le m e nte az un alg oritm sim p lu, d e te rm inist d e p lanic are , c unosc ut sub a num e le d e p la n i ca re cu p rio rit i xa te. at Fie c are r d e e x e c utie J av a p rim e te la c re are a sa o anum it p riori s a tate . O p rioritate e ste d e fap t un num r a ntre g c u v alori c up rinse ntre s MIN PRIORITY i MAX PRIORITY. Im p lic it, p rioritate a unui r nou c re at are v aloare a NORM PRIORITY. A c e ste tre i c onstante sunt d e nite c lasa Thread n 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 are a ulte rioar a p riorit ii unui r d e e x e c utie se re aliz e az c u m e tod a a at a setP riority a c lase i Thread. L a niv e lul siste m ului d e op e rare , e x ist d ou m od e le d e luc ru c u re d e a a e x e c utie :

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE

359

M o d elu l co o pera tiv, c are re le d e e x e c utie d e c id c nd s c e d e z e p ron a a c e sorul; d e z av antajul ac e stui m od e l e ste c une le re p ot ac ap ara p roa c e sorul, ne p e rm it nd i e x e c utia altora p n la te rm inare a lor. a s a a M o d elu l p reem p tiv , c are re le d e e x e c utie p ot n ntre rup te oric nd , a d up c e au fost lsate s rule z e o p e rioad , urm nd s e re luate d up a a a a a a a c e i c e le lalte re a ate e x e c utie au av ut ac c e s la p roc e sor; ac e st s n siste m se m ai num e te c u c uante d e tim p , d e z av antajul su ind s a ne v oia d e a sinc roniz a ac c e sul re lor la re surse le c om une . A ad ar, m od e lul c oop e rativ re le d e e x e c utie sunt re sp onsab ile c u p ars m tajare a tim p ului d e e x e c utie , tim p c e m od e lul p re e m p tiv e le tre b uie n n s p artaje z e re surse le c om une . D e oare c e sp e c ic atiile m a inii v irtuale J av a a s nu im p un folosire a unui anum it m od e l, p rog ram e le J av a tre b uie sc rise astfe l t s func ione z e c ore c t p e am b e le m od e le . In c ontinuare , v om m ai d e talia nc a a t p utin ac e ste asp e c te . P lanic atorul J av a luc re az m od ul urm ator: d ac la un m om e nt d at a n a sunt m ai m ulte re d e e x e c utie stare a R unnab le , ad ic sunt p re g atite n a p e ntru a rulate , p lanic atorul v a ale g e p e c e l c u p rioritate a c e a m ai l m are p e ntru a-l e x e c uta. D oar c nd rul d e e x e c utie c u p rioritate m ax im se a a te rm in, sau e ste susp e nd at d in d iv e rse m otiv e , v a ale s un r c u o p rioritate a m ai m ic . In c az ul c are toate re le au ac e e a i p rioritate e le sunt ale se p e a n s r nd , d up un alg oritm sim p lu d e tip round -rob in . D e ase m e ne a, d ac a a a un r c u p rioritate m ai m are d e c t rul c are se e x e c ut la un m om e nt d at a a solic it p roc e sorul, atunc i rul c u p rioritate m ai m are e ste im e d iat tre c ut a n e x e c utie iar c e lalalt tre c ut aste p tare . P lanic atorul J av a nu v a n ntre rup e a un r d e e x e c utie fav oare a altuia d e ac e e asi p rioritate , a ac e st luc ru ns n ns p oate fac e siste m ul d e op e rare c az ul c are ac e sta aloc p roc e sorul l n n a n c uante d e tim p (un astfe l d e S O e ste W ind ow s). A ad ar, un r d e e x e c utie J av a c e d e az p roc e sorul una d in situatiile : s a n un r d e e x e c utie c u o p rioritate m ai m are solic it p roc e sorul; a m e tod a sa run se te rm in; a fac e e x p lic it ac e st luc ru ap e l nd m e tod a yield; a tim p ul aloc at p e ntru e x e c utia s a e x p irat (p e S O c u c uante d e tim p ). a

360

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

A tentie In nic i un c az c ore c titud ine a unui p rog ram nu tre b uie s se b az e z e p e a m e c ansim ul d e p lanic are a re lor d e e x e c utie , d e oare c e ac e sta p oate d ife rit d e la un siste m d e op e rare la altul.

U n r d e e x e c utie d e lung d urat i c are nu c e d e az e x p lic it p roc e sorul la a as a anum ite inte rv ale d e tim p astfe l t s p oata e x e c utate i c e le lalte re d e nc a a s e x e c utie se num e te r d e e x e c utie ego ist. E v id e nt, tre b uie e v itat sc rie re a lor s a ntruc t ac ap are az p e te rm e n ne d e nit p roc e sorul, b loc nd e fe c tiv e x e c utia a a a c e lorlalte re d e e x e c utie p n la te rm inare a sa. U ne le siste m e le d e op e r a a are c om b at ac e st tip d e c om p ortam e nt p rin m e tod a aloc rii p roc e sorului a n c uante d e tim p e c rui r d e e x e c utie , a nu tre b uie s ne b az m p e ac e st a ns a a luc ru la sc rie re a unui p rog ram . U n r d e e x e c utie tre b uie s e c ore c t a fatd e c e le lalte re i s c e d e z e p e riod ic p roc e sorul astfe l t toate s aib a s a nc a a a p osib ilitate a d e a se e x e c uta. L isting 12.5: E x e m p lu d e r d e e x e c utie 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 ) ;

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE


s1 . start () ; s2 . start () ; } }

361

Firul d e e x e c utie s1 are p rioritate m ax im i p n nu- i v a te rm ina a s a a s e x e c utia nu-i v a p e rm ite rului s2 s e x e c ute nic i o instruc iune , ac ap ar nd a t a e fe c tiv p roc e sorul. R e z ultatul v a arta astfe l: a Firul Firul Firul ... Firul Firul Firul Firul ... Firul Firul 1 a ajuns la 100 1 a ajuns la 200 1 a ajuns la 300 1 1 2 2 a a a a ajuns ajuns ajuns ajuns la la la la 99900 100000 100 200

2 a ajuns la 99900 2 a ajuns la 100000

R e z olv are a ac e ste i p rob le m e se fac e e p rin inte rm e d iul m e tod e i static e yield a c lase i Thread, c are d e te rm in rul d e e x e c utie c ure nt s se op re asc te m a a a p orar, d nd oc az ia i altor re s se e x e c ute , e p rin ad orm ire a te m p orar a s a a a rului c ure nt c u ajutorul m e tod e i sleep. P rin m e tod a yield un r d e e x e c utie nu c e d e az p roc e sorul d e c t re lor d e e x e c utie c are au ac e e a i p ri a a s oritate c u a sa i nu c e lor c u p riorit i m ai m ic i. D e c om e nt nd linia c are s at a n ap e lm yeld d in e x e m p lul ante rior, e x e c utia c e lor d ou re se v a inte rc ala. a a ... Firul Firul Firul Firul Firul Firul ...

1 1 2 1 2 2

a a a a a a

ajuns ajuns ajuns ajuns ajuns ajuns

la la la la la la

31900 32000 100 32100 200 300

362

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .3 .4

S incroniz area relor de ex ecutie

P n ac um am v z ut c um p ute m c re a re d e e x e c utie ind e p e nd e nte i asa a a s inc rone , c u alte c uv inte c are nu d e p ind nic i un fe l d e e x e c utia sau d e n re z ultate le altor re . E x ist a num e roase situatii c nd re d e e x e c utie a ns a se p arate , d ar c are rule az c onc ure nt, tre b uie s c om unic e a a ntre e le p e ntru a ac c e sa d ife rite re surse c om une sau p e ntru a- i transm ite d inam ic re z uls tate le m unc ii lor. Ce l m ai e loc v e nt sc e nariu c are re le d e e x e c utie n tre b uie s se c om unic e a ntre e le e ste c unosc ut sub num e le d e p rob le m a p ro d u c to ru lu i/ co n su m a to ru lu i, c are p rod uc torul g e ne re az un ux d e d ate a n a a c are e ste p re luat i p re luc rat d e c tre c onsum ator. s a S c onsid e rm d e e x e m p lu o ap lic atie J av a c are un r d e e x e c utie (p roa a n d uc torul) sc rie d ate a ntr-un ie r tim p c e alt r d e e x e c utie (c onsum as n torul) c ite te d ate d in ac e la i ie r p e ntru a le p re luc ra. S au, s p re sup une m s s s a c p rod uc torul g e ne re az ni te num e re i le p lase az , p e r nd , a a a s s a a ntr-un b u e r iar c onsum atorul c ite te num e re le d in ac e l b u e r p e ntru a le p roc e sa. In am s b e le c az uri av e m d e -a fac e c u re d e e x e c utie c onc ure nte c are folose sc o re surs c om un: un ie r, re sp e c tiv o z on d e m e m orie i, d in ac e st m otiv , a a s a s e le tre b uie sinc roniz ate ntr-o m anie r c are s p e rm it d e c urg e re a norm al a a a a a ac tiv it ii lor. at

12 .3 .5

S cenariul produc tor / consum ator a

P e ntru a le g e m ai b ine m od alitate a d e sinc roniz are a d ou re d e e x e c utie nte a s im p le m e ntm e fe c tiv o p rob le m d e tip p rod uc tor/ c onsum ator. S c ona a a a a sid e rm urm toare a situatie : a a P ro d u c to ru l g e ne re az num e re le a a ntre g i d e la 1 la 10, e c are la un inte rv al ne re g ulat c up rins ntre 0 i 100 d e m ilise c und e . P e m sura c e s a le g e ne re az e arc s le p lase z e a nc a a ntr-o z on d e m e m orie (o v ariab il a a ntre ag a) d e und e s e c itite d e c tre c onsum ator. a a C o n su m a to ru l v a p re lua, p e r nd , num e re le g e ne rate d e c tre p roa a d uc tor i v a a a v aloare a lor p e e c ran. a s s P e ntru a ac c e sib il am b e lor re d e e x e c utie , v om ap sula v ariab ila c e v a a nc c ontine num e re le g e ne rate ntr-un ob ie c t d e sc ris d e c lasa Buffer i c are v a s av e a d ou m e tod e put (p e ntru p une re a unui num ar b u e r) i g et (p e ntru a n s ob tine re a num arului d in b u e r).

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE

363

Fr a folosi nic i un m e c anism d e sinc roniz are c lasa Buffer arat astfe l: aa a L isting 12.6: Clasa Buffer fr sinc roniz are aa
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 e nta ac um c lase le Producator i Consumator c are v or d e sc rie s c e le d ou re d e e x e c utie . A m b e le v or av e a o re fe rinta c om un la un ob ie c t a a d e tip Buffer p rin inte rm e d iul c ruia si c om unic v alorile . a a L isting 12.7: Clase le Producator i Consumator s
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 ;

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 c um ne a te p tam , re z ultatul rulrii ac e stui p rog ram nu v a re z olv a a s a nic i p e d e p arte p rob le m a p rop us d e noi, m otiv ul ind lip sa oric re i sina a c roniz ri a ntre c e le d ou re d e e x e c utie . M ai p re c is, re z ultatul v a c e v a d e a form a: Consumatorul Consumatorul Producatorul Consumatorul Consumatorul Consumatorul Consumatorul Consumatorul Consumatorul Consumatorul Consumatorul Producatorul Producatorul Producatorul Producatorul Producatorul a a a a a a a a a a a a a a a a primit: primit: pus: primit: primit: primit: primit: primit: primit: primit: primit: pus: pus: pus: pus: pus: -1 -1 0 0 0 0 0 0 0 0 0 1 2 3 4 5

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE Producatorul Producatorul Producatorul Producatorul a a a a pus: pus: pus: pus: 6 7 8 9

365

A m b e le re d e e x e c utie ac c e se az re sursa c om un, ad ic ob ie c tul d e tip a a a Buffer, ntr-o m anie r h aotic i ac e st luc ru se am p la d in d ou m otiv e : a as nt Consum atorul nu a te ap t s a nainte d e a c iti c a p rod uc torul s g e ne re z e a a un num r i v a p re lua d e m ai m ulte ori ac e la i num r. a s s a P rod uc torul nu a te ap t c onsum atorul s p re ia num rul g e ne rat a s a a a nainte d e a p rod uc e un altul, fe lul ac e sta c onsum atorul v a rata c u sig urant n a une le num e re ( c az ul nostru ap roap e p e toate ). n P rob le m a c are se rid ic ac e st m om e nt e ste : c ine tre b uie s se oc up e d e a n a sinc roniz are a c e lor d ou re d e e x e c utie : c lase le Producator i Consumator a s sau re sursa c om una Buffer ? R sp unsul e ste e v id e nt: re sursa c om un a a Buffer, d e oare c e e a tre b uie s p e rm ita sau nu ac c e sul la c ontinutul su i a a s nu re le d e e x e c utie c are o folose sc . In fe lul ac e sta e fortul sinc roniz rii e ste a transfe rat d e la p rod uc tor/ c onsum ator la un niv e l m ai jos, c e l al re surse i a c ritic e . A c tiv it ile p rod uc torului i c onsum atorului tre b uie sinc roniz ate la niv e lul at a s re surse i c om une d ou p riv inte : n a Ce le d ou re d e e x e c utie nu tre b uie s ac c e se z e sim ultan b u e r-ul; a a ac e st luc ru se re aliz e az p rin b loc are a ob ie c tului Buffer atunc i c nd a a e ste ac c e sat d e un r d e e x e c utie , astfe l t nic i nu alt r d e e x e c utie nc a s nu-l m ai p oat ac c e sa (v e z i M onitoare ). a a Ce le d ou re d e e x e c utie tre b uie s se c oord one z e , ad ic p rod uc torul a a a a tre b uie s g se asc o m od alitate d e a sp une c onsum atorului c a a a a a p lasat o v aloare b u e r, iar c onsum atorul tre b uie s c om unic e p ron a d uc torului c a p re luat ac e ast v aloare , p e ntru c a ac e sta s p oat g e na a a a a e ra o alta. P e ntru a re aliz a ac e asta c om unic are , c lasa Thread p une la d isp oz itie m e tod e le wait, notify, notifyAll. (v e z i S e m afoare ). Folosind sinc roniz are a c lasa Buffer v a arta astfe l: a

366

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE L isting 12.8: Clasa Buffer c u sinc roniz are

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 z ultatul ob tinut v a c e l sc ontat: Producatorul Consumatorul Producatorul Consumatorul ... Producatorul Consumatorul a a a a pus: primit: pus: primit: 0 0 1 1

a pus: 9 a primit: 9

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 e nitie U n se g m e nt d e c od c e g e stione az o re surs c om un m ai m ultor d e re d e a a a e x e c utie se p arate c onc ure nte se num e te sectiu n e critic . In J av a, o se c iune s a t c ritic p oate un b loc d e instruc iuni sau o m e tod . a t a Controlul ac c e sului ntr-o se c iune c ritic se fac e p rin c uv ntul ch e ie sy nt a a ch roniz ed. P latform a J av a asoc iaz un m onitor ( lac t ) e c rui ob ie c t al a a a unui p rog ram a at e x e c utie . A c e st m onitor v a ind ic a d ac re sursa c ritic n a a e ste ac c e sat d e v re un r d e e x e c utie sau e ste lib e r, c u alte c uv inte m ona a itoriz e az re sursa re sp e c tiv . In c az ul c are e ste ac c e sat, v a p une un a a n a lac t p e ac e asta, astfe l t s p ie d ic e ac c e sul altor re d e e x e c utie la e a. a nc a a m In m om e ntul c nd re sursa e ste e lib e rat lac tul v a e lim inat, p e ntru a a a a p e rm ite ac c e sul altor re d e e x e c utie . In e x e m p lul d e tip p rod uc tor/ c onsum ator d e m ai sus, se c iunile c ritic e a t sunt m e tod e le put i get iar re sursa c ritic c om un e ste ob ie c tul buffer. s a a Consum atorul nu tre b uie s ac c e se z e b u e r-ul c nd p rod uc atorul toc m ai a a p une o v aloare e l, iar p rod uc torul nu tre b uie s m od ic e v aloare a d in n a a b u e r m om e ntul c nd ac e asta e ste c itit d e c tre c onsum ator. n a a a public synchronized int get() { ... } public synchronized void put(int number) { ... } S ob se rv am c am b e le m e tod e au fost d e c larate c u m od ic atorul synchronized. a a Cu toate ac e ste a, siste m ul asoc iaz un m onitor une i instante a c lase i Buffer a i nu une i m e tod e anum e . In m om e ntul c are e ste ap e lat o m e tod sins n a a c roniz at, rul d e e x e c utie c are a fac ut ap e lul v a b loc a ob ie c tul a c re i m e tod a a a o ac c e se az , c e e a c e am n c c e le lalte re d e e x e c utie nu v or m ai p ute a a nse a a ac c e sa re surse le c ritic e ale ac e lui ob ie c t. A c e sta e ste un luc ru log ic , d e oare c e m ai m ulte se c iuni c ritic e ale unui ob ie c t g e stione az d e fap t o sing ur re surs t a a a c ritic . a In e x e m p lul nostru, atunc i c nd p rod uc atorul ap e le az m e tod a put p e na a tru a sc rie un num r, v a b loc a tot ob ie c tul buffer, astfe l c rul d e e x e c utie a a

368

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

c onsum ator nu v a av e a ac c e s la m e tod a get, i re c ip roc . s 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 ne A d e se ori, folosire a unui m onitor p e ntru ntre g ob ie c tul p oate p re a re stric tiv . D e c e s b loc m toate re surse le unui ob ie c t d ac un r d e e x e c utie a a a a nu d ore te d e c t ac c e sare a une ia sau a c torv a d intre e le ? D e oare c e oric e s a a ob ie c t are un m onitor, p ute m folosi ob ie c te c tiv e c a lac te p e ntru e c are a d in re surse le ob ie c tului nostru, c a e x e m p lul d e m ai jos: n 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 }

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE ... synchronized(xLacat) { synchronized(yLacat) { // Accesam x si y } } ... synchronized(this) { // Accesam x si y } } }

369

M e tod a d e m ai sus nu a fost d e c larat c u synchronized c e e a c e ar d e a te rm inat b loc are a tuturor re surse lor c om une la ac c e sare a ob ie c tului re sp e c tiv d e un r d e e x e c utie , c i au fost folosite m onitoare le unor ob ie c te c tiv e p e ntru a c ontrola folosire a e c re i re surs p arte . a a n

12 .3 .7

S em afoare

Ob ie c tul d e tip Buffer d in e x e m p lul ante rior are o v ariab il m e m b r p riv at a a a num it nu m ber , c are e ste m e m orat num rul p e c are c om unic p rod ua n a l a c atorul i p e c are p re ia c onsum atorul. D e ase m e ne a, m ai are o v ariab il s l a p riv at log ic av ailable c are ne d stare a b u e r-ului: d ac are v aloare a true a a a a am n c p rod uc torul a p us o v aloare b u e r i c onsum atorul nu a nse a a a n s p re luat-o a; d ac e ste false, c onsum atorul a p re luat v aloare a d in b u e r nc a d ar p rod uc torul nu a p us d e oc am d at alta la loc . D e c i, la p rim a v e d e re , a a m e tod e le c lase i Buffer ar tre b ui s arate astfe l: a 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) {

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 i p are c ore c t, nu e ste . A c e asta d e oare c e im s a p le m e ntare a m e tod e lor e ste se lsh , c e le d ou m e tod e aste ap t m od a si a n e g oist c ond itia d e te rm inare . Ca urm are , c ore c titud ine a func ionrii v a d e t a p ind e d e siste m ul d e op e rare p e c are p rog ram ul e ste rulat, c e e a c e re p re z int a o g re e al d e p rog ram are . s a P une re a c ore c t a unui r d e e x e c utie aste p tare se re aliz e az c u m e tod a a n a w ait a c lase i Thread, c are are urm toare le form e : a void wait( ) void wait( long timeout ) void wait( long timeout, long nanos ) D up ap e lul m e tod e i wait, rul d e e x e c utie c ure nt e lib e re az m onitorul a a asoc iat ob ie c tului re sp e c tiv i a te ap t c a una d in urm toare le c ond itii s e s s a a a e p linit: nd a U n alt r d e e x e c utie inform e az p e c e i c are a te ap t la un anum it a s a m onitor s se tre z e asc - ac e st luc ru se re aliz e az p rintr-un ap e l al a a a m e tod e i notify A ll sau notify . P e rioad a d e a te p atare sp e c ic at a e x p irat. s a M e tod a wait p oate p rod uc e e x c e p ii d e tip ul InterruptedException, t atunc i c nd rul d e e x e c utie c are a te ap t (e ste d e c i stare a N ot R unnab le ) a s a n e ste ntre rup t d in a te p tare i tre c ut fortat stare a R unnab le , d e i c ond itia s s n s a te p tat nu e ra e p linit. s a nc a nd a M e tod a notifyAll inform e az toate re le d e e x e c utie c are sunt aste p tare a n la m onitorul ob ie c tului c ure nt e p linire a c ond itie i p e c are o a te p tau. M e tod a nd s notify inform e az d oar un sing ur r d e e x e c utie , sp e c ic at c a arg um e nt. a R e am intim v arianta c ore c t a c lase i Buffer: a L isting 12.9: Folosire a se m afoare lor
class Buffer { private int number = -1;

1 2 .3 . CICL UL D E V IAT A AL UNUI F IR D E E X E CUT IE


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 () ; } }

371

12 .3 .8

P rob lem e leg ate de sincroniz are

D in p c ate , folosire a m onitoare lor rid ic i une le p rob le m e . S analiz m a a s a a c te v a d intre e le i p osib ile le lor solutii: a s D eadlock D e ad lock -ul e ste o p rob le m c lasic a a ntr-un m e d iu c are rule az m ai m ulte n a re d e e x e c utie i c onst fap tul c , la un m om e nt d at, s a n a ntre g p roc e sul se p oate b loc a d e oare c e une le re a te ap t d e b loc are a unor m onitoare c are s a nu se v or d e b loc a nic iod at. E x ist num e roase e x e m p le ac e st se ns, c e a a a n m ai c unosc ut ind P rob le m a loz olor . R e form ulat, s ne im ag inm a a a a d ou p e rsoane A i B (re d e e x e c utie ) c are stau la ac e e a i m as i tre a s s as

372

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

b uie s folose asc c om un c utitul i furc ulita (re surse le c om une ) p e ntru a a a n s m nc a. E v id e nt, c e le d ou p e rsoane d ore sc ob ine re a am b e lor re surse . S a a t a p re sup une m c A a otinut c utitul i B furc ulita. Firul A se v a b loc a a s n a te p tare a e lib e rrii furc ulite i iar rul A se v a b loc a a te p atre a e lib e rrii s a n s a c utitului, c e e a c e c ond uc e la stare a d e d e ad lock . D e i ac e st e x e m p lu e ste s d e sp rins d e re alitate , e x ist num e roase situatii c are fe nom e nul d e d e ad a n lock se p oate m anife sta, m ulte d intre ac e ste a ind d ic il d e d e te c tat. E x ist c te v a re g uli c e p ot ap lic ate p e ntru e v itare a d e ad lock -ului: a a Fire le d e e x e c utie s solic ite re surse le ac e e a i ord ine . A c e ast ab or a n s a d are e lim in situatiile d e a te p tare c irc ular. a s a Folosire a unor m onitoare c are s c ontrole z e ac c e sul la un g rup d e re surse . a In c az ul nostru, p ute m folosi un m onitor tac m uri c are tre b uie b loc at a nainte d e a c e re furc ulita sau c utitul. Folosire a unor v ariab ile c are s inform e z e d isp onib ilitate a re surse lor a fr a b loc a m onitoare le asoc iate ac e stora. aa Ce l m ai im p ortat, c onc e p e re a une i arh ite c turi a siste m ului c are s e v ite a p e c t p osib il ap aritia unor p ote ntiale situatii d e d e aslock . a

V ariab ile volatile Cuv ntul ch e ie volatile a fost introd us p e ntru a c ontrola une le asp e c te a le g ate d e op tim iz rile e fe c tuate d e une le c om p ilatoare . S c onsid e rm urm torul a a a a e x e m p lu: class TestVolatile { boolean test; public void metoda() { test = false; // * if (test) { // Aici se poate ajunge... } } }

1 2 .4 . G RUPARE A F IRE L O R D E E X E CUT IE

373

U n c om p ilator c are op tim iz e az c od ul, p oate d e c id e c v ariab ila test a a ind se tat p e false, c orp ul if -ului nu se v a e x e c uta i s e x c lud se c v e nta a s a a re sp e c tiv d in re z ultatul c om p ilrii. D ac ac e ast c las ar a ac c e sat a a a a a ns a d e m ai m ulte re d e e x e c utie , v ariab ile test ar p ute a se tat p e true d e un a alt r, e x ac t ntre instruc iunile d e atrib uire i if ale rului c ure nt. t s D e c larare a une i v ariab ile c u m od ic atorul volatile inform e az c om p ilaa torul s nu op tim iz e z e c od ul c are ac e asta ap are , p re v iz ion nd v aloare a p e a n a c are v ariab ila o are la un m om e nt d at.

F ire de ex ecutie inaccesib ile U ne ori re le d e e x e c utie sunt b loc ate d in alte m otiv e d e c t a te p tare a la a s un m onitor, c e a m ai fre c v e nt situatie d e ac e st tip ind op e ratiunile d e ina trare / ie ire (IO) b loc ante . C nd ac e st luc ru se am p l c e le lalte re d e s a nt a e x e c utie tre b uie s p oat ac c e sa c ontinuare ob ie c tul. D ar d ac op e ratiune a a a n a IO a fost fc ut a a ntr-o m e tod sinc roniz at, ac e st luc ru nu m ai e ste p osib il, a a m onitorul ob ie c tului ind b loc at d e rul c are a te ap t d e fap t s re aliz e z e s a a op e ratia d e intrare / ie ire . D in ac e st m otiv , op e ratiile IO nu tre b uie fc ute s a m e tod e sinc roniz ate . n

12 .4

G ruparea relor de ex ecutie

G rup are a re lor d e e x e c utie p une la d isp oz itie un m e c anism p e ntru m anip u lare a ac e stora c a un tot i nu ind iv id ual. D e e x e m p lu, p ute m s p ornim sau s s a a susp e nd m toate re le d intr-un g rup c u un sing ur ap e l d e m e tod . G rup are a a a re lor d e e x e c utie se re aliz e az p rin inte rm e d iul c lase i T h readG roup. a Fie c are r d e e x e c utie J av a e ste m e m b ru al unui g rup , ind ife re nt d ac a sp e c ic m e x p lic it sau nu ac e st luc ru. A lie re a unui r la un anum it g rup a se re aliz e az la c re are a sa i d e v ine p e rm ane nt, se nsul c nu v om p ute a a s a n a m uta un r d intr-un g rup altul, d up c e ac e sta a fost c re at. In c az ul n a n c are c re m un r folosind un c onstruc tor c are nu sp e c ic d in c e g rup fac e a a p arte , e l v a p lasat autom at ac e la i g rup c u rul d e e x e c utie c are l-a n s c re at. L a p ornire a unui p rog ram J av a se c re e az autom at un ob ie c t d e tip a ThreadGroup c u num e le m ain, c are v a re p re z e nta g rup ul tuturor re lor d e e x e c utie c re ate d ire c t d in p rog ram i c are nu au fost ata ate e x p lic it altui s s g rup . Cu alte c uv inte , p ute m s ig norm c om p le t p lasare a re lor d e e x e c utie a a g rup uri i s lsm siste m ul s se oc up e c u ac e asta, ad un nd u-le p e toate n s a aa a a

374

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

g rup ul main. n E x ist situatii a c nd g rup are a re lor d e e x e c utie p oate u ura sub stantial a ns a s m ane v rare a lor. Cre are a unui r d e e x e c utie i p lasare a lui s ntr-un g rup (altul d e c t c e l im p lic it) se re aliz e az p rin urm torii c onstruc tori ai c lase i Thread: a a a public Thread(ThreadGroup group, Runnable target) public Thread(ThreadGroup group, String name) public Thread(ThreadGroup group, Runnable target, String name) Fie c are d in ac e ti c ostruc tori c re e az un r d e e x e c utie , initializ e az i s a l a s p lase az l a ntr-un g rup sp e c ic at c a arg um e nt. P e ntru a a a c rui g rup a ap artine un anum it r d e e x e c utie p ute m folosi m e tod a getThreadGroup a c lase i Thread. In e x e m p lul urm tor v or c re ate d ou g rup uri, p rim ul c u a a d ou re d e e x e c utie iar al d oile a c u tre i: a ThreadGroup grup1 = new ThreadGroup("Producatori"); Thread p1 = new Thread(grup1, "Producator 1"); Thread p2 = new Thread(grup1, "Producator 2"); ThreadGroup Thread c1 = Thread c2 = Thread c3 = grup2 = new ThreadGroup("Consumatori"); new Thread(grup2, "Consumator 1"); new Thread(grup2, "Consumator 2"); new Thread(grup2, "Consumator 3");

U n g rup p oate av e a c a p rinte un alt g rup , c e e a c e am n c re le d e a nse a a e x e c utie p ot p lasate ntr-o ie rarh ie d e g rup uri, c are rd c ina e ste g rup ul n a a im p lic it main, c a g ura d e m ai jos: n

1 2 .4 . G RUPARE A F IRE L O R D E E X E CUT IE S c onsid e rm un e x e m p lu c are listm re le d e e x e c utie ac tiv e : a a m a

375

L isting 12.10: Folosire a 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 () ) ; } }

376

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

12 .5

Com unicarea prin ux uri de tip pipe

O m od alitate d e ose b it d e util p rin c are d ou re d e e x e c utie p ot c om unic a a a e ste re aliz at p rin inte rm e d iul ca n a lelo r d e co m u n ica tii (p ipes). A c e ste a sunt a im p le m e ntate p rin ux uri d e sc rise d e c lase le : P ipedR eader, P ipedW riter - p e ntru c arac te re , re sp e c tiv P ipedO utputS tream , P ipedInputS tream - p e ntru oc te i. t Flux urile p ip e d e ie ire i c e le d e intrare p ot c one c tate p e ntru a s s e fe c tua transm ite re a d ate lor. A c e st luc ru se re aliz e az uz ual p rin inte m e d iul a c onstruc torilor: public PipedReader(PipedWriterpw) public PipedWriter(PipedReaderpr) In c az ul c are e ste folosit un c onstruc tor fr arg um e nte , c one c tare a unui n aa ux d e intrare c u un ux d e ie ire se fac e p rin m e tod a connect: s public void connect(PipedWriterpw) public void connect(PipedReaderpr) Intruc t ux urile c are sunt c one c tate p rintr-un p ip e tre b uie s e x e c ute a a sim ultan op e ratii d e sc rie re / c itire , folosire a lor se v a fac e d in c ad rul unor re d e e x e c utie . Func ionare a ob ic e te lor c are instantiaz PipedWriter i PipedReader t a s e ste ase m ntoare c u a c anale lor d e c om unic are U N IX (p ip e s). Fie c are c ap t a a a al unui c anal e ste utiliz at d intr-un r d e e x e c utie se p arat. L a un c ap t se a sc riu c arac te re , la c e llalt se c ite sc . L a c itire , d ac nu sunt d ate d isp onib ile a a rul d e e x e c utie se v a b loc a p n c e ac e ste a v or d e v e ni d isp onib ile . S e ob se rv a a a c ac e sta e ste un c om p ortam e nt tip ic p rod uc tor-c onsum ator asinc ron, re le a a d e e x e c utie c om unic nd p rintr-un c anal. a R e aliz are a c one x iunii se fac e astfe l: PipedWriter PipedReader // sau PipedReader PipedWriter // sau pw1 = new PipedWriter(); pr1 = new PipedReader(pw1); pr2 = new PipedReader(); pw2 = new PipedWriter(pr2);

1 2 .5 . CO M UNICARE A PRIN F L UX URI D E T IP PIPE PipedReader pr = new PipedReader(); PipedWriter pw = new PipedWirter(); pr.connect(pw) //echivalent cu pw.connect(pr);

377

S c rie re a i c itire a p e / d e p e c anale se re aliz e az p rin m e tod e le uz uale read i s a s write, toate form e le lor. n S re c onsid e rm ac um e x e m p lul p rod uc tor/ c onsum ator p re z e ntat ante a a a rior, folosind c anale d e c om unic atie . P rod uc torul trim ite d ate le p rintr-un a ux d e ie ire d e tip DataOutputStream c tre c onsum ator, c are le p rim e te s a s p rintr-un ux d e intrare d e tip DataInputStream. A c e ste d ou ux uri v or a inte rc one c tate p rin inte rm e d iul unor ux uri d e tip p ip e . L isting 12.11: Folosire a 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 ;

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 i T im erT ask s

Clasa Timer ofe r o fac ilitate d e a p lanic a d iv e rse ac iuni p e ntru a re ala t iz ate la un anum it m om e nt d e c tre un r d e e x e c utie c e rule az fund al. a a n A c iunile unui ob ie c t d e tip Timer sunt im p le m e ntate c a instante ale c lase i t TimerTask i p ot p rog ram ate p e ntru o sing ur e x e c utie sau p e ntru e x e c utii s a re p e tate la inte rv ale re g ulate . P a ii c are tre b uie fc uti p e ntru folosire a unui tim e r sunt: s a

1 2 .6 . CL ASE L E T IM E R SI T IM E RT ASK

379

Cre are a une i sub c lase Actiune a lui TimerTask i sup re ad e nire a m e tod e i s run c e v a c ontine ac iune a p e c are v re m s o p lanic m . D up c um t a a a v om v e d e a, p ot folosite i c lase anonim e . s Cre are a unui r d e e x e c utie p rin instantie re a c lase i Timer; Cre are a unui ob ie c t d e tip Actiune; P lanic are a la e x e c utie a ob ie c tuluii d e tip Actiune, folosind m e tod a schedule d in c lasa Timer; M e tod e le d e p lanic are p e c are le av e m la d isp oz itie au urm toare le for a m ate : schedule(TimerTask task, Date schedule(TimerTask task, long schedule(TimerTask task, Date scheduleAtFixedRate(TimerTask scheduleAtFixedRate(TimerTask time) delay, long period) time, long period) task, long delay, long period) task, Date time, long period)

und e , task d e sc rie ac iune a c e se v a e x e c uta, d elay re p re z int arz ie re a fata t a nt d e m om e ntul c ure nt d up c are v a e p e e x e c utia, tim e m om e ntul e x ac t la a nc c are v a e p e e x e c utia iar p er iod inte rv alul d e tim p nc ntre d ou e x e c utii. a D up c um se ob se rv , m e tod e le d e p lanic are se p art d ou c ate g orii: a a m n a sch edule - p lanic are c u arz ie re x : d ac d intr-un anum it m otiv nt a a ac iune a e ste arz iat, urm toare le ac iuni v or i e le arz iate t nt a a t s nt n c onse c int; a sch eduleA tF ix edR ate - p lanic are c u num r x d e rate : d ac d intra a un anum it m otiv ac iune a e ste arz iat, urm toare le ac iuni v or t nt a a t e x e c utat m ai re p e d e , astfe l t num rul total d e ac iuni d intr-o p e a nc a a t rioad d e tim p s e tot tim p ul ac e la i; a a s U n tim e r se v a op ri natural la te rm inare a m e tod e i sale run sau p oate op rit fortat folosind m e tod a cancel. D up op rire a sa e l nu v a m ai p ute a a folosit p e ntru p lanic are a altor ac iuni. D e ase m e ne a, m e tod a System.exit t v a op rit fortat toate re le d e e x e c utie i v a te rm ina ap lic atia c ure nt. s a

380

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE L isting 12.12: Folosire a c lase lor Timer i TimerTask s

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 () ;

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 ) ; } }

382

CAPIT O L UL 1 2 . F IRE D E E X E CUT IE

Capitolul 13 P rog ram are retea n


13 .1 Introducere

P rog ram are a re e a im p lic trim ite re a d e m e saje i d ate n t a s ntre ap lic atii c e rule az p e c alc ulatoare a ate a ntr-o re e a loc al sau c one c tate la Inte rne t. t a P ach e tul c are ofe r sup ort p e ntru sc rie re a ap lic atiilor d e re e a e ste java.net. a t Clase le d in ac e st p ach e t ofe r o m od alitate fac il d e p rog ram are re e a, fr a a n t aa a ne v oie d e c uno tinte p re alab ile re fe ritoare la c om unic are a e fe c tiv s a ntre c alc ulatoare . Cu toate ac e ste a, sunt ne c e sare c te v a notiuni fund am e ntale a re fe ritoare la re e le c um ar : p rotoc ol, ad re sa IP , p ort, sock e t. t

Ce este un protocol ? U n p ro to co l re p re z int o c onv e ntie d e re p re z e ntare a d ate lor folosit c om ua a n nic are a ntre d ou c alc ulatoare . A v nd v e d e re fap tul c oric e inform atie a a n a c are tre b uie trim is p rin re e a tre b uie se rializ at astfe l t s p oat transa t a nc a a a m is se c v e ntial, oc te t c u oc te t, c tre d e stinatie , e ra ne v oie d e stab ilire a unor a a c onv e ntii (p rotoc oale ) c are s e folosite at t d e c alc ulatorul c are trim ite a a d ate le c t i d e c e l c are le p rim e te , p e ntru a se e le g e a s s nt ntre e le . D ou d intre c e le m ai utiliz ate p rotoc oale sunt T CP i U D P . a s T C P (T ra n sp o rt C o n tro l P ro to co l) e ste un p rotoc ol c e furniz e az un a ux sig ur d e d ate ntre d ou c alc ulatoare a ate re e a. A c e st p rotoa n t c ol asig ur stab ilire a une i c one x iuni p e rm ane nte a ntre c e le d ou c alc ua latoare p e p arc ursul c om unic atie i. U D P (U ser D a ta gra m P ro toco l) e ste un p rotoc ol b az at p e p ach e te ind e 383

384

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN p e nd e nte d e d ate , num ite d a ta gra m e, trim ise d e la un c alc ulator c tre a altul fr a se g aranta v re un fe l ajung e re a ac e stora la d e stinatie sau aa n ord ine a c are ac e ste a ajung . A c e st p rotoc ol nu stab ile te o c one x iun n s a p e rm ant a ntre c e le d ou c alc ulatoare . a

Cum este identi cat un calculator retea ? n Oric e c alc ulator c one c tat la Inte rne t e ste id e ntic at m od unic d e ad re sa sa n IP (IP e ste ac ronim ul d e la In tern et P ro toco l). A c e asta re p re z int un num r a a re p re z e ntat p e 32 d e b iti, uz ual sub form a a 4 oc te i, c um ar d e e x e m p lu: t 193.231.30.131 i e ste num it ad re sa IP n u m eric . Core sp unz toare une i s a a ad re se num e ric e e x ista i o ad re sa IP sim bo lic , c um ar thor.infoiasi.ro s a p e ntru ad re sa num e ric ante rioar. a a D e ase m e ne a, e c are c alc ulator a at ntr-o re e a loc al are un num e unic t a c e p oat folosit la id e ntic are a loc al a ac e stuia. a Clasa J av a c are re p re z int notiune a d e ad re s IP e ste InetA ddress. a a

Ce este un port ? U n c alc ulator are g e ne ral o sing ur le g tur z ic la re e a. Oric e inform atie n a a a a t d e stinat une i anum ite m a ini tre b uie d e c i s sp e c ic e ob lig atoriu ad re sa a s a IP a ac e le i m a ini. Ins p e un c alc ulator p ot e x ista c onc ure nt m ai m ulte s a p roc e se c are au stab ilite c one x iuni re e a, aste p t nd d iv e rse inform atii. n t a P rin urm are , d ate le trim ise c tre o d e stinatie tre b uie s sp e c ic e p e l ng a a a a ad re sa IP a c alc ulatorului i p roc e sul c tre c are se re ap t inform atiile s a nd a re sp e c tiv e . Id e ntic are a p roc e se lor se re aliz e az p rin inte rm d iul porturilor. a U n p o rt e ste un num r p e 16 b iti c are id e ntic m od unic p roc e se le a a n c are rule az p e o anum it m asin. Oric e ap lic atie c are re aliz e az o c one x iune a a a a re e a v a tre b ui s ata e z e un num r d e p ort ac e le i c one x iuni. V alorile p e n t a s a c are le p oate lua un num r d e p ort sunt c up rinse a ntre 0 i 65535 (d e oare c e s sunt num e re re p re z e ntate p e 16 b iti), num e re le c up rinse ntre 0 i 1023 ind s a re z e rv ate unor se rv ic ii siste m i, d in ac e st m otiv , nu tre b uie folosite ns s n ap lic atii.

Clase de b az din java.net a Clase le d in java.net p e rm it c om unic are a ntre p roc e se folosind p rotoc oale le

1 3 .2 . L UCRUL CU URL -URI T CP i U D P i sunt p re z e ntate tab e lul d e m ai jos. s s n T CP URL URLConnection Socket ServerSocket U D P DatagramPacket DatagramSocket MulticastSocket

385

13 .2

L ucrul cu U R L -uri

T e rm e nul U R L e ste ac ronim ul p e ntru U n ifo rm R eso u rce L o ca to r i re p re z int s a o re fe rint (ad re s) la o re surs a at p e Inte rne t. A c e asta e ste g e ne ral un a a a a n ie r re p re z e nt nd o p ag in W e b , un te x t, im ag ine , e tc ., a un U R L p oate s a a ns re fe ri i inte rog ri la b az e d e d ate , re z ultate ale unor c om e nz i e x e c utate la s a d istant, e tc . M ai jost, sunt p re z e ntate c te v a e x e m p le d e U R L -uri sunt: a a 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 c um se ob se rv d in e x e m p le le d e m ai sus, un U R L are d ou c om a a a p one nte p rinc ip ale : Id e ntic atorul p rotoc olului folosit (h ttp , ftp , e tc ); N um e le re surse i re fe rite . A c e sta are urm toare le c om p one nte : a N um e le c alc ulatorului g az d (www.infoiasi.ro). a Cale a c om p le t sp re re sursa re fe rit ( acf/java/curs/9/prog retea.html). a a N otatia user se m nic uz ual sub d ire c torul html al d ire c toru a lui re z e rv at p e un se rv e r W e b utiliz atorului sp e c ic at (HOME). In c az ul c are e ste sp e c ic at d oar un d ire c tor, ie rul c e re p re z int n s a re sursa v a c onsid e rat im p lic it index.html. Op ional, o re fe rint d e tip a n ch o r c ad rul ie rului re fe rit (#url). t a n s Op ional, p ortul la c are s se re aliz e z e c one x iune a. t a

386

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN

Clasa c are p e rm ite luc rul c u U R L -uri e ste java.net.U R L . A c e asta are m ai m ulti c onstruc tori p e ntru c re are a d e ob ie c te c e re p re z int re fe rinte c tre a a re surse a ate re e a, c e l m ai uz ual ind c e l c are p rim e te c a p aram e tru n t s un ir d e c arac te re . In c az ul c are irul nu re p re z int un U R L v alid v a s n s a arunc at o e x c e p ie d e tip ul MalformedURLException. a t 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 folosit p e ntru: A are a inform atiilor d e sp re re sursa re fe rit (num e le c alc ulatorului g az d , a a num e le ie rului, p rotoc olul folosit. e tc ). s Citire a p rintr-un ux a c ontinutului ie rului re sp e c tiv . s Cone c tare a la ac e l U R L p e ntru c itire a i sc rie re a d e inform atii. s

Citirea continutului unui U R L Oric e ob ie c t d e tip URL p oate re turna un ux d e intrare d e tip InputStream p e ntru c itire a c ontinutului su. S e c v e nta stand ard p e ntru ac e ast op e ratiune a a e ste p re z e ntat e x e m p lul d e m ai jos, c are a am c ontinutul re surse i a n n s sp e c ic at la linia d e c om and . D ac nu se sp e c ic m ic i un arg um e nt, v a a a a a a at ie rul index.html d e la ad re sa: http://www.infoiasi.ro. s s L isting 13.1: Citire a c ontinutului 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];

1 3 .3 . SO CK E T -URI
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 ( Malfo rmedU RLEx cepti on e ) { System . err . println ( " URL invalid !\ n " + e ) ; } finally { br . close () ; } } }

387

Conectarea la un U R L S e re aliz e az p rin m e tod a openConnection c e stab ile te o c one x iune b id ire c ional a s t a c u re sursa sp e c ic at. A c e ast c one x iune e ste re p re z e ntat d e un ob ie c t d e a a a tip U R L Connection, c e p e rm ite c re are a at t a unui ux d e intrare p e ntru a c itire a inform atiilor d e la U R L -ul sp e c ic at, c t i a unui ux d e ie ire p e ntru a s s sc rie re a d e d ate c tre ac e l U R L . Op e ratiune a d e trim ite re d e d ate d intr-un a p rog ram c tre un U R L e ste sim ilar c u trim ite re a d e d ate d intr-un form ular a a d e tip FORM a at ntr-o p ag in H T M L . M e tod a folosit p e ntru trim ite re e ste a a POST. In c az ul trim ite rii d e d ate , ob ie c tul U R L e ste uz ual un p roc e s c e rule az a p e se rv e rul W e b re fe rit p rin U R L -ul re sp 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 e nitie U n so cket (so clu ) e ste o ab strac iune softw are folosit p e ntru a re p re z e nta t a e c are d in c e le d ou c ap e te ale une i c one x iuni a ntre d ou p roc e se c e rule az a a ntr-o re e a. Fie c are sock e t e ste ata at unui p ort astfe l t s p oat id e nt s nc a a a tic a unic p rog ram ul c ruia sunt d e stinate d ate le . a i

388

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN S ock e t-urile sunt d e d ou tip uri: a

T CP , im p le m e ntate d e c lase le Socket i ServerSocket; s U D P , im p le m e ntate d e c lasa DatagramSocket. O ap lic atie d e re e a c e folose te sock e t-uri se ad re az m od e lul clien t s nc a n t/ server d e c onc e p e re a une i ap lic atii. In ac e st m od e l ap lic atia e ste form at a d in d ou c ate g orii d istinc te d e p rog ram e num ite servere , re sp e c tiv clie n i. a t P rog ram e le d e tip se rv e r sunt c e le c are ofe r d iv e rse se rv ic ii e v e ntualilor a c lie nti, ind stare d e a te p tare at ta v re m e c t nic i un c lie nt nu le solic it n s a a a se rv ic iile . P rog ram e le d e tip c lie nt sunt c e le c are initiaz c onv e rsatia c u un a se rv e r, solic it nd un anum it se rv ic iu. U z ual, un se rv e r tre b uie s e c ap ab il s a a a trate z e m ai m ulti c lie nti sim ultan i, d in ac e st m otiv , e c are c e re re ad re sat s a se rv e rului v a tratat a ntr-un r d e e x e c utie se p arat.

Inc e p nd c u v e rsiune a 1.4 a p latform e i stand ard J av a, e x ist o c las utilia a a tar c are im p le m e nte az o p e re ch e d e tip ul (a d resa IP , n u m r po rt). A c e asta a a a e ste InetS ock etA ddress (d e riv at d in SocketAddress), ob ie c te le sale ind a utiliz ate d e c onstruc tori i m e tod e d e nite c ad rul c lase lor c e d e sc riu sock s n e turi, p e ntru a sp e c ic a c e i d oi p aram e tri ne c e sari id e ntic rii unui p roc e s a c are trim ite sau re c e p ione az d ate re e a. t a n t

13 .4

Com unicarea prin conex iuni

In ac e st m od e l se stab ile te o c one x iune T CP s ntre o ap lic atie c lie nt i o s ap lic atie se rv e r c are furniz e az un anum it se rv ic iu. A v antajul p rotoc olul a T CP / IP e ste c asig ur re aliz are a une i c om unic ri stab ile , p e rm ane nte a a a n re e a, e x ist nd sig uranta c inform atiile trim ise d e un p roc e s v or re c e p ionate t a a t c ore c t i c om p le t la d e stinatie sau v a se m nalat o e x c e p ie c az c ontrar. s a t n L e g tura a ntre un c lie nt i un se rv e r se re aliz e az p rin inte rm e d iul a s a d ou ob ie c te d e tip S ock et, c te unul p e ntru e c are c ap t al c analului a a a d e c om unic atie d intre c e i d oi. L a niv e lul c lie ntului c re are a sock e tului se re aliz e az sp e c ic nd ad re sa IP a se rv e rului i p ortul la c are rule az ac e sta, a a s a c onstruc torul uz ual folosit ind : Socket(InetAddress address, int port)

1 3 .4 . CO M UNICARE A PRIN CO NE X IUNI

389

L a niv e lul se rv e rului, ac e sta tre b uie s c re e z e ai un ob ie c t d e tip a nt S erverS ock et. A c e st tip d e sock e t nu asig ur c om unic are a e fe c tiv c u a a c lie ntii c i e ste re sp onsab il c u asc ultare a re e le i i c re are a unor ob ie c te d e t s tip Socket p e ntru e c are c e re re ap rut, p rin inte rm e d iul c ruia v a re ala a a iz at le g tura c u c lie ntul. Cre are a unui ob ie c t d e tip ServerSocket se fac e a a sp e c ic nd p ortul la c are rule az se rv e rul, c onstruc torul folosit ind : a a ServerSocket(int port) M e tod a c lase i ServerSocket c are a te ap t asc ult re e aua e ste accept. s a a t A c e asta b loch e az p roc e sul p rinte p n la ap aritia unui c e re ri i re turne az a a a a s a un nou ob ie c t d e tip Socket c e v a asig ura c om unic are a c u c lie ntul. B loc are a p oate s nu e p e rm ane nt c i d oar p e ntru o anum it p e rioad d e tim p a a a a ac e asta v a sp e c ic at p rin m e tod a setS oT im eout, c u arg um e ntul d at a n m ilise c und e .

P e ntru e c are d in c e le d ou sock e turi d e sch ise p ot c re ate ap oi d ou a a ux uri p e oc te i p e ntru c itire a, re sp e c tiv sc rie re a d ate lor. A c e st luc ru se re t aliz e az p rin inte rm e d iul m e tod e lor g etInputS tream , re sp e c tuv g etO uta putS tream . Flux urile ob inute v or folosite p re un c u ux uri d e p roc e t m a sare c are s asig ure o c om unic are fac il a a ntre c e le d ou p roc e se . In func ie a t d e sp e c ic ul ap lic atie i ac e ste a p ot p e re ch ile : BufferedReader, BufferedWriter i PrintWriter - p e ntru c om unis c are p rin inte rm e d iul irurilor d e c arac te re ; s DataInputStream, DataOutputStream - p e ntru c om unic are p rin d ate p rim itiv e ; ObjectInputStream, ObjectOutputStream - p e ntru c om inic are p rin inte rm e d iul ob ie c te lor;

390

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN S truc tura g e ne ral a unui se rv e r b az at p e c one x iuni e ste : a

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 c om and at c a tratare a c e re rilor s se re aliz e z e re d e e x e c utie a n se p arate , p e ntru c a m e tod a accept s p oat re ap e lat c t m ai re p e d e a a a a n v e d e re a stab ilirii c one x iunii c u un alt c lie nt. S truc tura g e ne ral a unui c lie nt b az at p e c one x iuni e ste : a 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 tor v om im p le m e nta o ap lic atie c lie nt-se rv e r folosind a c om unic are a p rin c one x iuni. Clie ntul v a trim ite se rv e rului un num e iar ac e sta v a rasp und e p rin m e sajul H e llo nu m e . T ratare a c e re rilor se v a fac e re n d e e x e c utie se p arate . L isting 13.2: S truc tura unui se rv e r b az at p e c one x iuni
import java . net .*; import java . io .*; class ClientThread extends Thread { Socket socket = null ; public ClientThread ( Socket socket ) { this . socket = socket ;

1 3 .4 . CO M UNICARE A PRIN CO NE X IUNI


} 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 () ;

391

} 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 ;

392

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN


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 truc tura unui c lie nt b az at p e c one 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 ) ;

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 e st m od e l nu e x ist o c one x iune p e rm ane nt a a ntre c lie nt i se rv e r p rin s inte rm e d iul c re ia s se re aliz e z e c om unic are a. Clie ntul trim ite c e re re a c tre a a a se rv e r p rin inte rm e d iul unuia sau m ai m ultor p ach e te d e d ate ind e p e nd e nte , se rv e rul le re c e p ione az , e x trag e inform atiile c ontinute i re turne az rsp unsul t a s a a tot p rin inte rm e d iul p ach e te lor. U n astfe l d e p ach e t se num e te d a ta gra m s a i e ste re p re z e ntat p rintr-un ob ie c t d in c lasa D atag ram P ack et. R utare a s d atag ram e lor d e la o m a in la alta se fac e e x c lusiv p e b az a inform atiilor s a c ontinute d e ac e ste a. P rim ire a i trim ite re a d atag ram e lor se re aliz e az p rin s a inte rm e d iul unui sock e t, m od e lat p rin inte rm e d iul c lase i D atag ram S ock et.

394

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN

D up c um am m e ntionat d e ja, d e z av antajul ac e ste i m e tod e e ste c nu a a g arante az ajung e re a la d e stinatie a p ach e te lor trim ise i nic i c v or p rim ite a s a ac e e a i ord inie c are au fost e x p e d iate . P e d e alt p arte , e x ist situatii n s n a a c are ac e ste luc ruri nu sunt im p ortante i ac e st m od e l e ste d e p re fe rat c e lui n s b az at p e c one x iuni c are solic it m ult m ai m ult at t se rv e rul c t i c lie ntul. D e a a a s fap t, p rotoc olul T CP / IP folose te tot p ach e te p e ntru trim ite re a inform atiilor s d intr-un nod altul al re e le i, c u d e ose b ire a c asig ur re sp e c tare a ord inii d e n t a a transm ite re a m e saje lor i v e ric ajung e re a la d e stinatie a tuturor p ach e te lor s a - c az ul c are unul nu a ajuns, ac e sta v a re trim is autom at. n n Clasa DatagramPacket c ontine urm torii c onstruc tori: a DatagramPacket(byte[] buf, InetAddress address, int DatagramPacket(byte[] buf, InetAddress address, int int length, port) int offset, int length, 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 ou p e re ch i d e c onstruc tori sunt p e ntru c re are p ach e te lor c e a v or ex pediate, d ife re nta ntre e le ind utiliz are a c lase lor InetAddress, re sp e c tiv SocketAddress p e ntru sp e c ic are a ad re se i d e sinatie . A tre i p e re ch e d e c onstruc tori e ste folosit p e ntru c re are a unui p ach e t a n c are v or receptionate d ate , e i ne sp e c ic nd v re o surs sau d e stinatie . a a

1 3 .5 . CO M UNICARE A PRIN D AT AG RAM E

395

D up c re are a unui p ach e t p roc e sul d e trim ite re i p rim ire a ac e stuia im a s p lic ap e lul m e tod e lor send i receive ale c lase i DatagramSocket. D e oare c e a s toate inform atii sunt inc luse d atag ram , ac e la i sock e t p oate folosit at t n a s a p e ntru trim ite re a d e p ach e te , e v e ntual c tre d e stinatii d ife rite , c t i p e ntru a a s re c e p ionare a ac e stora d e la d iv e rse surse . In c az ul c are re folosim p ach e te , t n p ute m sch im b a c ontinutul ac e stora c u m e tod a setD ata, p re c um i ad re sa la s c are le trim ite m p rin setA ddress, setP ort i setS ock etA ddress. s E x trag e re a inform atiilor c ontiunte d e un p ach e t se re aliz e az p rin m e tod a a g etD ata d in c lasa DatagramPacket. D e ase m e ne a, ac e ast c las ofe r m e tod e a a a p e ntru a are a ad re se i IP i a p ortului p roc e sului c are a trim is d atag ram a, s p e ntru a-i p ute a rsp und e d ac e ste ne c e sar. A c e ste a sunt: g etA dress, a a g etP ort i g etS ock etA ddress. s L isting 13.4: S truc tura unui se rv e r b az at 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

396

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN


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 truc tura unui c lie nt b az at 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 () ;

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


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 () ; } } }

397

13 .6

T rim iterea de m esaje c tre m ai m ulti a clienti

D iv e rse situatii im p un g rup are a m ai m ultor c lie nti astfe l t un m e saj (p a nc a ch e t) trim is p e ad re sa g rup ului s e re c e p ionat d e e c are d intre ac e tia. a t s G rup are a m ai m ultor p rog ram e v e d e re a trim ite rii m ultip le d e m e saje se n re aliz e az p rin inte rm e d iul unui sock e t sp e c ial, d e sc ris d e c lasa M ulticasta S ock et, e x te nsie a c lase i DatagramSocket. U n g rup d e c lie nti ab onati p e ntru trim ite re m ultip l e ste sp e c ic at p rintr a o ad re s IP d in inte rv alul 224.0.0.1 - 239.255.255.255 i un p ort U D P . a s A d re sa 224.0.0.0 e ste re z e rv at i nu tre b uie folosit. as a

398

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN

L isting 13.6: Inre g istrare a unui c lie nt 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 ) ;

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 re a unui m e saj c tre un g rup a


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 () ; } } }

400

CAPIT O L UL 1 3 . PRO G RAM ARE RE T E A IN

Capitolul 14 A ppleturi
14 .1 Introducere

D e nitie U n a p p let re p re z int un p rog ram J av a d e d im e nsiuni re d use c e g e stione az a a o sup rafat d e a are (c ontaine r) c are p oate inc lus a s a ntr-o p ag in W e b . U n a astfe l d e p rog ram se m ai num e te m in ia p lica tie . s Ca oric e alt ap lic atie J av a, c od ul unui ap p le t p oate form at d in una sau a m ai m ulte c lase . U na d intre ac e ste a e ste p rin cip a l i e x tind e c lasa Applet, a s ac e asta ind c lasa c e tre b uie sp e c ic at d oc um e ntul H T M L c e d e sc rie a n p ag ina W e b c are d orim s inc lud e m ap p le tul. n a D ife re nta fund am e ntal d intre un ap p le t i o ap lic atie c onst fap tul c a s a n a un ap p le t nu p oate e x e c utat ind e p e nd e nt, c i v a e x e c utat d e b row se rul c are e ste rc at p ag ina W e b c e c ontine ap p le tul re sp e c tiv . O ap lic atie n nc a a ind e p e nd e nt e ste e x e c utat p rin ap e lul inte rp re torului ja va , av nd c a ara a a g um e nt num e le c lase i p rinc ip ale a ap lic atie i, c lasa p rinc ip al ind c e a c are a c ontine m e tod a m a in . Cic lul d e v iat al unui ap p le t e ste c om p le t d ife rit, a ind d ic tat d e e v e nim e nte le g e ne rate d e c tre b row se r la v iz ualiz are a d oc ua m e ntului H T M L c e c ontine ap p le tul. P ach e tul c are ofe r sup ort p e ntru c re are a d e ap p le turi e ste java.applet, a c e a m ai im p ortant c las ind A pplet. In p ach e tul javax .sw ing e x ist a a a i c lasa JA pplet, c are e x tind e Applet, ofe rind sup ort p e ntru c re are a d e s ap p le turi p e arh ite c tura d e c om p one nte J FC/ S w ing . 401

402

CAPIT O L UL 1 4 . APPL E T URI

Ie rarh ia c lase lor d in c are d e riv ap p le turile e ste p re z e ntata g ura d e a n m ai jos:

Fiind d e riv at d in c lasa Container, c lasa Applet d e sc rie d e fap t sup rafe e a t d e a are , ase m e ne a c lase lor Frame sau Panel. s

14 .2

Crearea unui applet sim plu

Cre are a struc turii d e ie re i c om p ilare a ap p le t-urilor sunt id e ntic e c a s s n c az ul ap lic atiilor. D ife r sch im b struc tura p rog ram ului i m od ul d e rulare a n s a ac e stuia. S p arg ure am c ontinuare ac e ti p a i p e ntru a re aliz a un ap p le t a n s s e x tre m d e sim p lu, c are a e az o im ag ine i un ir d e c arac te re . s a s s

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"); }

1 4 .2 . CRE ARE A UNUI APPL E T SIM PL U 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); } }

403

P e ntru a p ute a e x e c utat d e b row se r, c lasa p rinc ip al a ap p le tului tre a a b uie s e p ub lic . a a

2 . S alvarea sierelor surs a Ca oric e c las p ub lic , c lasa p rinc ip ala a ap p le tului v a salv at a a a ntr-un ie r c u ac e la i num e i e x te nsia .java. A ad ar, v om salv a c lasa d e m ai sus s s s s ntr-un ie r FirstApplet.java. s

3 . Com pilarea Com p ilare a se fac e la fe l c a i la ap lic atiile ind e p e nd e nte , folosind c om p is latorul javac ap e lat p e ntru ie rul c e c ontine ap p le tul. s javac FirstApplet.java In c az ul c are c om p ilare a a re u it v a g e ne rat sie rul FirstApplet.class. n s

4 . R ularea appletului A p p le t-urile nu rule az a ind e p e nd e nt. E le p ot rulate d oar p rin inte rm e d iul unui b row se r: Inte rne t E x p lore r, N e tsc ap e , M oz illa, Op e ra, e tc . sau p rintr-un p rog ram sp e c ial c um ar appletview er d in k itul d e d e z v oltare J 2S D K . P e ntru a e x e c uta un ap p le t tre b uie s fac e m d ou op e ratii: a a Crearea unui ier H T M L c are v om inc lud e ap p le t-ul. S c ons n a sid e rm ie rul simplu.html, av nd c ontinutul d e m ai jos: a s a

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 iz ualiz area appletului: se d e sch id e sie rul simplu.html folosind unul d in b row se r-e le am intite sau e fe c tu nd ap e lul: a appletviewer simplu.html.

14 .3

Ciclul de viat al unui applet a

E x e c utia unui ap p le t e p e m om e ntul c are un b row se r a e az o p ag in nc n n s a a W e b c are e ste inc lus ap p le tul re sp e c tiv i p oate tre c e p rin m ai m ulte e tap e . n s Fie c are e tap e ste str ns le g at d e un e v e nim e nt g e ne rat d e c tre b row se r i a a a a s d e te rm in ap e lare a une i m e tod e sp e c ic e d in c lasa c e im p le m e nte az ap p le a a tul. Inc rcarea m em orie a n E ste c re at o instanta a c lase i p rinc ip ale a ap p le tului i arc at a s nc a n m e m orie . Initializ area E ste ap e lat m e tod a init c e p e rm ite initializ are a d iv e rse lor v ariab ile , a c itire a unor p aram e tri d e intrare , e tc . P ornirea E ste ap e lat m e tod a start a E x ecutia propriu-z is a Const inte rac iune a d intre utiliz ator i c om p one nte le a ate p e a n t s s sup rafata ap p le tului sau e x e c utare a unui anum it c od n ntr-un r d e e x e c utie . In une le situatii ntre ag a e x e c utie a ap p le tului se c onsum la a e tap e le d e initializ are i p ornire . s

1 4 .3 . CICL UL D E V IAT A AL UNUI APPL E T

405

O prirea tem porar a In c az ul c are utiliz atorul p rse te p ag ina W e b c are rule az ap p le n aa s n a tul e ste ap e lat m e tod a stop a ac e stuia, d nd u-i astfe l p osib ilitate a s a a a op re asc a te m p orar e x e c utia sa p e p e rioad a c are nu e ste v iz ib il, p e ntru n a nu c onsum a inutil d in tim p ul p roc e sorului. A c e la i luc ru se am p l s nt a d ac fe re astra b row se rului e ste m inim iz at. In m om e ntul c nd p ag ina a a a W e b c e c ontine ap p le tul d e v ine d in nou ac tiv , v a re ap e lat m e tod a a a start. O prirea de nitiv a L a nch id e re a tuturor instante lor b row se rului folosit p e ntru v iz ualiz are , ap p le tul v a e lim inat d in m e m orie i v a ap e lat m e tod a destroy a s a ac e stuia, p e ntru a-i p e rm ite s e lib e re z e re surse le d e inute . A p e lul a t m e tod e i destroy e ste ntotd e auna p re c e d at d e ap e lul lui stop.

M etodele speci ce appleturilor A ad ar, e x ist o se rie d e m e tod e sp e c ic e ap p le turilor c e sunt ap e late aus a tom at la d iv e rse e v e nim e nte g e ne rate d e c tre b row se r. A c e ste a sunt d e nite a c lasa Applet i sunt e num e rate tab e lul d e m ai jos: n s n M etoda init S ituatia care este apelat n a L a initializ are a ap p le tului. T e ore tic , ac e ast m e tod a a ar tre b ui s se ap e le z e o sing ur d at, la p rim a a a a a are a ap p le tului p ag in, a, la une le b row se re , s n a ns e ste p osib il c a e a s se ap e le z e d e m ai m ulte ori. a Im e d iat d up initializ are i d e e c are d at a s a c nd ap p le tul re d e v ine ac tiv , d up o op rire te m p orar. a a a D e e c are d at c nd ap p le tul nu m ai e ste v iz ib il a a (p ag ina W e b nu m ai e ste v iz ib il, fe re astra b row se rului a e ste m inim iz at, e tc ) i a s nainte d e destroy. L a nch id e re a ultim e i instante a b row se rului c are a rc at m e m orie c lasa p rinc ip al a ap p le tului. nc a n a

start stop

destroy

A tentie

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 se r i nu tre b uie ap e late s e x p lic it d in p rog ram !

S tructura g eneral a unui applet a 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 ra c cu utiliz atorul a

D up c um am v z ut, c lasa Applet e ste o e x te nsie a sup e rc lase i Container, a a c e e a c e am n c ap p le turile sunt, nse a a nainte d e toate , sup rafe e d e a are . t s P lasare a c om p one nte lor, g e stionare a p oz itionrii lor i tratare a e v e nim e nte lor a s g e ne rate se re aliz e az la fe l c a i c az ul ap lic atiilor. U z ual, ad ug are a c om a s n a p one nte lor p e sup rafata ap p le tului p re c um i stab ilire a ob ie c te lor re sp ons s ab ile c u tratare a e v e nim e nte lor g e ne rate sunt op e ratiuni c e v or re aliz ate n m e tod a init.

1 4 .4 . INT E RF AT A G RAF ICA CU UT IL IZ AT O RUL

407

G e stionarul d e p oz itionare im p lic it e ste FlowLayout, a ac e sta p oate ns sch im b at p rin m e tod a setLayout.

408

CAPIT O L UL 1 4 . APPL E T URI

D esenarea pe suprafata unui applet E x ist o c ate g orie a ntre ag d e ap p le turi c e nu c om unic c u utiliz atorul a a p rin inte rm e d iul c om p one nte lor c i, e x e c utia lor se re z um la d iv e rse op e ratiuni a d e d e se nare re aliz ate m e tod a paint. R e am intim c m e tod a paint e ste re n a sp onsab il c u d e nire a asp e c tului g rac al oric re i c om p one nte . Im p lic it, a a m e tod a paint d in c lasa Applet nu re aliz e az nim ic , d e c i, c az ul c are a n n d orim s d e se nm d ire c t p e sup rafata unui ap p le t v a ne v oie s sup rad e nim a a a ac e ast m e tod . a a public void paint(Graphics g) { // Desenare ... } In c az ul c are e ste ale as ac e ast solutie , e v e nim e nte le tratate uz ual v or n a a c e le g e ne rate d e m ouse sau tastatur. a

14 .5

D e nirea i folosirea param etrilor s

P aram e trii sunt p e ntru ap p le turi c e e a c e arg um e nte le d e la linia d e c om and a sunt p e ntru ap lic atiile ind e p e nd e nte . E i p e rm it utiliz atorului s p e rsonaliz e z e a asp e c tul sau c om p ortare a unui ap p le t fr a-i sch im b a c od ul i re c om p ila aa s c lase le . D e nirea p aram e trilor se fac e c ad rul tag ului APPLET d in d oc um e nn tul H T M L c e c ontine ap p le tul i sunt id e ntic ati p rin atrib utul P A R A M . s Fie c are p aram e tru are un num e , sp e c ic at p rin N A M E i o v aloare , sp e c is c at p rin V A L U E , c a e x e m p lul d e m ai jos: a n <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 i c az ul arg um e nte lor trim ise ap lic atiilor d e la linia d e c om and , tip ul s n a p aram e trilor e ste ntotd e auna ir de caractere, ind ife re nt d ac v aloare a s a e ste ntre g h ilim e le sau nu. Fie c are ap p le t are i un se t d e p aram e tri p re stab iliti ale c ror num e nu s a v or p ute a folosite p e ntru d e nire a d e noi p aram e tri folosind m e tod a d e

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 tia ap ar d ire c t c orp ul tag ului APPLET i d e ne sc inform atii s n s g e ne rale d e sp re ap p le t. E x e m p le d e astfe l d e p aram e tri sunt CODE, WIDTH sau HEIGHT. L ista lor c om p le t v a p re z e ntata la d e sc rie re a tag ului APPLET. a F olosirea p aram e trilor p rim iti d e c tre un ap p le t se fac e p rin inte rm e d iul a m e tod e i g etP aram eter c are p rim e te c a arg um e nt num e le unui p aram e tru s i re turne az v aloare a ac e stuia. In c az ul c are nu e x ist nic i un p aram e tru s a n a c u num e le sp e c ic at, m e tod a ntoarc e null, c az c are p rog ram ul tre b uie n s atrib uie o v aloare im p lic it v ariab ile i c are se d ore a c itire a re sp e c tiv ului a a n p aram e tru. Oric e ap p le t p oate p une la d isp oz itie o d oc um e ntatie re fe ritoare la p ara m e trii p e c are sup ort, p e ntru a v e ni ajutorul utiliz atorilor c are d ore sc s i a n a inc lud ap p le tul a ntr-o p ag in W e b . A c e asta se re aliz e az p rin sup rad e nire a a a m e tod e i g etP aram eterInfo, c are re turne az un v e c tor form at d in trip le te a d e iruri. Fie c are e le m e nt al v e c torului e ste d e fap t un v e c tor c u tre i e le m e nte s d e tip String, c e le tre i iruri re p re z e nt nd n u m ele p aram e trului, tip u l su i s a a s o d escriere a sa. Inform atiile furniz ate d e un ap p le t p ot c itite d in b row se rul folosit p e ntru v iz ualiz are p rin m e tod e sp e c ic e ac e stuia. D e e x e m p lu, ap n p le tv ie w e r inform atiile d e sp re p aram e tri p ot v iz ualiz ate la rub ric a In fo d in m e niul Ap p let, N e tsc ap e se folose te op iune a P a ge in fo d in m e niul V iew , n s t e tc . S sc rie m un ap p le t c are s a e z e un te x t p rim it c a p aram e tru, folosind a a s un font c u num e le i d im e nsiune a sp e c ic ate d e ase m e ne a c a p aram e tri. s L isting 14.1: Folosire a p aram e trilor
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 " ; {

410

CAPIT O L UL 1 4 . APPL E T URI

try { dimFont = Integer . parseInt ( getParameter ( " dimFont " ) ) ; } catch ( Numb erFor matEx cepti on 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 c om p le t a tag ului A P P L E T , c u ajutorul c ruia p ot inc luse ap p le a a turi c ad rul p ag inilor W e b e ste : n <APPLET CODE = clasaApplet WIDTH = latimeInPixeli HEIGHT = inaltimeInPixeli [ARCHIVE = arhiva.jar] [CODEBASE = URLApplet] [ALT = textAlternativ] [NAME = numeInstantaApplet] [ALIGN = aliniere] [VSPACE = spatiuVertical]

1 4 .6 . T AG -UL APPL E T [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 trate sunt op ionale . a t

411

CO D E = cla sa Ap p let N um e le ie rului c e c ontine c lasa p rinc ip al a ap p le tului. A c e sta v a s a c utat d ire c torul sp e c ic at d e CODEBASE. N u p oate ab solut i a n s tre b uie ob lig atoriu sp e c ic at. E x te nsia .c lass p oate sau nu s ap ar. a a W ID T H = la tim eIn P ixeli, H E IG H T = in a ltim eIn P ixeli S p e c ic l im e a i altim e a sup rafe e i c are v a a at ap p le tul. a at s n t n s S unt ob lig atorii. A R CH IV E = a rh iva .ja r S p e c ic arh iv a c are se g se sc c lase le ap p le tului. a n a CO D E B A S E = d irecto rAp p let S p e c ic U R L -ul la c are se g se te c lasa ap p le tului. U z ual se e x p rim a a s a re lativ la d ire c torul d oc um e ntului H T M L . In c az ul c are lip se te , se n s c onsid e r im p lic it U R L -ul d oc um e ntului. a A L T = textAltern a tiv S p e c ic te x tul c e tre b uie a at d ac b row se rul e le g e tag ul APPLET a s a nt d ar nu p oate rula ap p le turi J av a. N A M E = n u m eIn sta n ta Ap p let Ofe r p osib ilitate a d e a d a un num e re sp e c tiv e i instante a ap p le tua lui, astfe l t m ai m ulte ap p le turi a ate p e ac e e a i p ag in s p oat nc a s a a a c om unic a ntre e le folosind u-se d e num e le lor. A L IG N = a lin iere S e m nic m od alitate a d e alinie re a ap p le tului p ag ina W e b . A c e st a n atrib ut p oate p rim i una d in urm toare le v alori: left, right, top, a

412

CAPIT O L UL 1 4 . APPL E T URI texttop, middle, absmiddle, baseline, bottom, absbottom , se m inic atiile lor ind ac e le a i c a i la tag ul IMG. s s

V S P A CE = sp a tiu V ertica l, H S P A CE = sp a tiu Orizo n ta l S p e c ic num arul d e p ix e li d intre ap p le t i m arg inile sup rafe te i d e a s a are . s PA R A M T ag -urile PARAM sunt folosite p e ntru sp e c ic are a p aram e trilor unui ap p le t (v e z i Folosire a p aram e trilor ). text H T M L a ltern a tiv E ste te x tul c e v a a at c az ul c are b row se rul nu le g e tag ul s n n nte APPLET. B row se re le J a va -en a bled v or ig nora ac e st te x t.

14 .7

F olosirea relor de ex ecutie appleturi n

L a rc are a une i p ag ini W e b , e c rui ap p le t e ste c re at autom at un r nc a a i d e e x e c utie re sp onsab il c u ap e lare a m e tod e lor ac e stuia. A c e ste a v or rula c onc ure nt d up re g ulile d e p lanic are im p le m e ntate d e m a ina v irtual J av a a s a a p latform e i folosite . D in p unc tul d e v e d e re al inte rfe e i g rac e a, e c are ap p le t a at p e o t ns p ag in W e b are ac c e s la un acela i r d e e x e c utie , c re at d e ase m e ne a autom at a s d e c tre b row se r, i c are e ste re sp onsab il c u d e se nare a ap p le tului (ap e lul a s m e tod e lor update i paint) p re c um i c u transm ite re a m e saje lor g e ne rate s s d e c tre c om p one nte . Intruc t toate ap p le turile d e p e p ag in p art ac e st a a a m r d e e x e c utie , nic i unul nu tre b uie s solic ite m od e x c e siv , d e oare c e v a a l n p rov oc a func ionare a anorm al sau ch iar b loc are a c e lorlalte . t a In c az ul c are d orim s e fe c tum op e ratiuni c onsum atoare d e tim p e ste n a a re c om and at s le re aliz m a a ntr-un alt r d e e x e c utie , p e ntru a nu b loc a inte rac iune a utiliz atorului c u ap p le tul, re d e se nare a ac e stuia sau ac tiv itate a t c e lorlalte ap p le turi d e p e p ag in. a S c onsid e rm m m ai ai d ou ab ord ri g re ite d e luc ru c u ap p le turi. a a nt a a s D orim s c re m un ap p le t c are s a e z e la c oord onate ale atoare m e sajul a a a s H e llo , c u p auz d e o se c und a a ntre d ou a ri. P rim a v ariant, g re it d e a sa a s a altfe l, ar :

1 4 .7 . F O L O SIRE A F IRE L O R D E E X E CUT IE APPL E T URI IN L isting 14.2: Inc ore c t: b loc are a m e tod 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 ) {} } } }

413

M otiv ul p e ntru c are ac e st ap p le t nu func ione az c ore c t i p rob ab il v a t a s d uc e la anom alii func ionare a b row se rului e ste c rul d e e x e c utie c are n t a se oc up c u d e se nare a v a rm ne b loc at m e tod a paint, e rc nd s o a a a n nc a a te rm ine . Ca re g ul g e ne ral, c od ul m e tod e i paint tre b uie s e c t m ai a a a a sim p lu d e e x e c utat c e e a c e , e v id e nt, nu e ste c az ul ap p le tul d e m ai sus. n O alt id e e d e re z olv are c are ne -ar p ute a v e ni, d e ase m e ne a g re it, e ste a s a urm toare a : a L isting 14.3: Inc ore c t: ap p le tul nu te rm in initializ are a a
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 ) {

414
g . drawString ( " Hello " , x , y ) ; } }

CAPIT O L UL 1 4 . APPL E T URI

P e ntru a p ute a d a o solutie c ore c t p rob le m e i p rop use , tre b uie s folosim a a un r d e e x e c utie p rop riu. S truc tura unui ap p le t c are d ore ste s lanse z e un a r d e e x e c utie p oate av e a d ou form e . In p rim a situatie ap p le tul p orne te a s rul la initialz are a sa iar ac e sta v a rula, ind ife re nt d ac ap p le tul m ai e ste sau a nu v iz ib il, p n la op rire a sa natural (te rm inare a m e tod e i run) sau p n la a a a a a nch id e re a se siunii d e luc ru a b row se rului. L isting 14.4: Core c t: folosire a unui r d e e x e c utie 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 c az ul c are rul d e e x e c utie p ornit d e ap p le t e fe c tue az op e ratii c e n a

1 4 .7 . F O L O SIRE A F IRE L O R D E E X E CUT IE APPL E T URI IN

415

au se ns d oar d ac ap p le tul e ste v iz ib il, c um ar anim atie , ar d e d orit a c a ac e sta s se op re asc a atunc i c nd ap p le tul nu m ai e ste v iz ib il (la ap e lul a a m e tod e i stop) i s re p orne asc a atunc i c nd ap p le tul re d e v ine v iz ib il (la s a a ap e lul m e tod e i start). U n ap p le t e ste c onsid e rat a ctiv im e d iat d up ap e lul a m e tod e i start i d e v ine inac tiv la ap e lul m e tod e i stop. P e ntru a a a d ac s a un ap p le t e ste ac tiv se folose te m e tod a isA ctive. s S m od ic m p rog ram ul ante rior, ad ug nd i un c ontor c are s num e re a a a a s a a rile d e m e saje - ac e sta nu v a inc re m e ntat p e p e rioad a c are ap p le tul sa n nu e ste ac tiv . L isting 14.5: Folosire a m e tod e lor start i stop s
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 ) {}

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 c a une le b row se re s nu ap e le m e tod a stop situatiile a n p re v z ute sp e c c iatiile ap p le turilor. D in ac e st m otiv , c ore c titud ine a unui a n ap p le t nu tre b uie s se b az e z e p a ac e st m e c anism . a

14 .8

A lte m etode oferite de clasa A pplet

P e l ng m e tod e le d e b az : init, start, stop, destroy, c lasa Applet a a a ofe r m e tod e sp e c ic e ap p le t-urilor c um ar : a

P unerea la dispoz itie a unor inform atii despre applet S im ilar c u m e tod a getParameterInfo c e ofe re a o d oc um e ntatie d e sp re a p aram e trii p e c are ac c e p t un ap p le t, e x ist m e tod a g etA ppletInfo c e p e ri a a m ite sp e c ic are a unor inform atii le g ate d e ap p le t c um ar num e le , autorul, v e rsiune a, e tc . M e tod a re turne az un sir d e c arac te re c ontin nd inform atiile a a re sp e c tiv e . public String getAppletInfo() { return "Applet simplist, autor necunoscut, ver 1.0"; }

A area adreselor U R L referitoare la applet S e re aliz e az c u m e tod e le : a

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 turne az U R L -ul d ire c torului c e c ontine c lasa a ap p le tului; g etD ocum entB ase - re turne az U R L -ul d ire c torului c e c ontine d oc a um e ntul H T M L c are e ste inc lus ap p le tul re sp e c tiv . n A c e ste m e tod e sunt foarte utile d e oare c e p e rm it sp e c ic are a re lativ a unor a ie re folosite d e un ap p le t, c um ar im ag ini sau sune te . s

A area unor m esaje b ara de stare a b row serului s n A c e st luc ru se re aliz e az c u m e tod a sh ow S tatus a public void init() { showStatus("Initializare applet..."); }

A area im ag inilor s A are a im ag inilor s ntr-un ap p le t se fac e e p rin inte rm e d iul une i c om p one nte c e p e rm ite ac e st luc ru, c um ar o sup rafat d e d e se nare d e tip Canvas, a e d ire c t m e tod a paint a ap p le t-ului, folosind m e tod a drawImage a c lase i n Graphics. In am b e le c az uri, ob ine re a une i re fe rinte la im ag ine a re sp e c tiv t a se v a fac e c u ajutorul m e tod e i g etIm ag e d in c lasa Applet. A c e asta p oate p rim i c a arg um e nt e ad re sa U R L ab solut a ie rului c e re p re z int im ag a s a ine a, e c ale a re lativ la o anum it ad re s U R L , c um ar c e a a d ire c torului a a a c are se g se te d oc um e ntul H T M L c e c ontine ap p le tul (getDocumentBase) n a s sau a d ire c torului c are se g se te c lasa ap p le tului (getCodeBase). n a s L isting 14.6: A are a im ag inilor s
import java . applet . Applet ; import java . awt .*; public class Imagini extends Applet Image img = null ; {

public void init () { img = getImage ( getCodeBase () , " taz . gif " ) ; }

418

CAPIT O L UL 1 4 . APPL E T URI

public void paint ( Graphics g ) { g . drawImage ( img , 0 , 0 , this ) ; } }

A area contex tului de ex ecutie Conte x tul d e e x e c utie al unui ap p le t se re fe r la p ag ina c are ac e sta rule az , a n a e v e ntual p re un c u alte ap p le turi, i e ste d e sc ris d e inte rfata A ppletConm a s tex t. Cre are a unui ob ie c t c e im p le m e nte az ac e ast inte rfat se re aliz e az d e a a a a c tre b row se r, la ap e lul m e tod e i g etA ppletContex t a c lase i Applet. P rin a inte rm e d iul ac e ste i inte rfe e un ap p le t p oate v e d e a jurul sau, p ut nd t n a c om unic a c u alte ap p le t-uri a ate p e ac e e asi p ag in sau c e re b row se r-ului s a a d e sch id d iv e rse d oc um e nte . a AppletContext contex = getAppletContext();

A area unor docum ente b row ser s n S e fac e c u m e tod a sh ow D ocum ent c e p rim e te ad re sa U R L a ie rului c e s s c ontine d oc um e ntul p e c are d orim sa-l d e sch id e m (te x t, h tm l, im ag ine , e tc ). A c e ast m e tod e ste ac c e sat p rin inte rm e d iul c onte x tului d e e x e c utie al a a a ap 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-uri A c e ast c om unic are im p lic d e fap t id e ntic are a unui ap p le t a at p e ac e e a i a a s p ag ina i ap e lare a une i m e tod e sau se tare a une i v ariab ile p ub lic e a ac e stuia. s Id e ntic are a se fac e p rin inte rm e d iu num e lui p e c are oric e instanta a unui ap p le t p oate sp e c ic a p rin atrib utul NAME. l

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 ine re a une i re fe rinte la un ap p le t al c rui num e c unoa te m sau t a l s ob ine re a une i e num e rri a tuturor ap p le t-urilor d in p ag in se fac p rin int a a te rm e d iul c onte x tului d e e x e c utie , folosind m e tod e le g etA pplet, re sp e c tiv g etA pplets.

R edarea sunetelor Clasa Applet ofe r i p osib ilitate a re d rii d e sune te form at .au. A c e ste a as a n sunt d e sc rise p rin inte rm e d iul unor ob ie c te c e im p le m e nte az inte rfata A ua dioClip d in p ach e tul java.applet. P e ntru a re d a un sune t a at ntr-un ie r .au la un anum it U R L e x ist d ou p osib ilit i: s a a at Folosire a m e tod e i play d in c lasa Applet c are p rim e te c a arg um e nt s U R L -ul la c are se a sune tul; ac e sta p oate sp e c ic at ab solut sau a re lativ la U R L -ul ap p le tului Cre are a unui ob ie c t d e tip AudioClip c u m e tod a g etA udioClip ap oi ap e lare a m e tod e lor start, loop i stop p e ntru ac e sta. s

L isting 14.7: R e d are a sune te 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 ) ;

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 c az ul c are ap p le tul folose te m ai m ulte tip uri d e sune te , e ste re c on s m and at c a rc are a ac e stora s e fc ut nc a a a a ntr-un r d e e x e c utie se p arat, p e ntru a nu b loc a te m p orar ac tiv itate a re asc a p rog ram ului. a

14 .9

A rh ivarea appleturilor

D up c um am v z ut, p e ntru c a un ap p le t a at p e o p ag in W e b s p oat a a a a a e x e c utat c od ul su v a transfe rat d e p e se rv e rul c are g z d uie te p ag ina a a s W e b solic itat p e m a ina c lie ntului. D e oare c e transfe rul d ate lor p rin re e a a s t e ste un p roc e s le nt, c u c t d im e nsiune a ie rlor c are form e az ap p le tul e ste a s a m ai re d us, c u at rc are a ac e stuia se v a fac e m ai re p e d e . M ai m ult, d ac a a nc a a ap p le tul c ontine i alte c lase afar d e c e a p rinc ip al sau d iv e rse re surse s n a a (im ag ini, sune te , e tc ), ac e ste a v or transfe rate p rin re e a ab ia m om e ntul t n c are v a ne v oie d e e le , op rind te m p orar ac tiv itate a ap p le tului p n la n a a rc are a lor. D in ac e ste m otiv e , c e a m ai e c ie nt m od alitate d e a d istrib ui nc a a un ap p le t e ste s arh iv m toate ie re le ne c e sare ac e stuia. a a s A rh ivarea ierelor unui applet se fac e c u utilitarul jar, ofe rit s n d 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

1 4 .1 0 . RE ST RICT II D E SE CURIT AT E

421

Includerea unui applet arh ivat ntr-o p ag in W e b se re aliz e az sp e a a c ic nd p e l ng num e le c lase i p rinc ip ale i num e le arh iv e i c are o c ontine : a a a s <applet archive=arhiva.jar code=ClasaPrincipala width=400 height=200 />

14 .10

R estrictii de securitate

D e oare c e un ap p le t se e x e c ut p e m a ina utiliz atorului c are a solic itat p ag a s ina W e b c e c ontine ap p le tul re sp e c tiv , e ste foarte im p ortant s e x iste anu a m ite re stric ii d e se c uritate c are s c ontrole z e ac tiv itate a ac e stuia, p e ntru a t a p re v e ni ac iuni ru inte ntionate , c um ar te rg e ri d e ie re , e tc ., c are s t a s s a ad uc p re jud ic ii utiliz atorului. P e ntru a re aliz a ac e st luc ru, p roc e sul c are a rule az ap p le turi instale az un m anag e r d e se c uritate , ad ic un ob ie c t d e a a a tip SecurityManager c are v a sup e rv iz a ac tiv itate a m e tod e lor ap p le tului, arunc nd e x c e p ii d e tip Security Exception c az ul c are una d in ac e sa t n n te a e arc s e fe c tue z e o op e ratie ne p e rm is. nc a a a U n ap p le t nu p oate s: a Cite asc sau s sc rie ie re p e c alc ulatorul p e c are a fost arc at a a s nc (c lie nt). D e sch id c one x iuni c u alte m a ini afar d e c e a d e p e c are p rov ine a s n a (h ost). P orne asc p rog ram e p e m a ina c lie nt. a s Cite asc d iv e rse p rop rie t i ale siste m ului d e op e rare al c lie ntului. a at Fe re stre le folosite d e un ap p le t, alte le d e c t c e a a b row se rului, v or arta a a altfe l d e c t a ntr-o ap lic atie ob i nuit, ind ic nd fap tul c au fost c re ate d e un s a a a ap p le t.

14 .11

A ppleturi care sunt i aplicatii s

D e oare c e c lasa Applet e ste d e riv at d in Container, d e c i i d in Component, a s e a d e sc rie o sup rafat d e a are c are p oate inc lus c a oric e alt c om p one nt a s a a a ntr-un alt c ontaine r, c um ar o fe re astr. U n ap p le t p oate func iona i c a a t s o ap lic atie ind e p e nd e nt astfe l: a

422

CAPIT O L UL 1 4 . APPL E T URI

A d ug m m e tod a main c lase i c are d e sc rie ap p le tul, c are v om fac e a a n op e ratiunile urm toare . a Cre m o instant a ap p le tului i o ad ug m p e sup rafata une i fe re stre . a a s a a A p e lm m e tod e le init i start, c are ar fost ap e late autom at d e a s c tre b row se r. a Fac e m fe re astra v iz ib il. a

L isting 14.8: A p p le t i ap lic atie s


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 () ; } } {

Capitolul 15 L ucrul cu b az e de date


15 .1
15 .1.1

Introducere
G eneralit i despre b az e de date at

A p lic atiile c are folose sc b az e d e d ate sunt, g e ne ral, ap lic atii c om p le x e n folosite p e ntru g e stionare a unor inform atii d e d im e nsiuni m ari ntr-o m anie r a sig ur i e c ie nt. as a

Ce este o b az de date ? a L a niv e lul c e l m ai g e ne ral, o ba z d e d a te re p re z int o m od alitate d e stoc are a a a unor inform atii (d ate ) p e un sup ort e x te rn, c u p osib ilitate a re g sirii ac e stora. a U z ual, o b az d e d ate e ste m e m orat a a ntr-unul sau m ai m ulte ie re . s M od e lul c lasic d e b az e d e d ate e ste c e l rela io n a l, c are d ate le sunt t n m e m orate tab e le . U n tab e l re p re z int o struc tur d e d ate form at d intr-o n a a a m ultim e d e artic ole , e c are artic ol av nd d e nite o se rie d e atrib ute - ac e ste a atrib ute c ore sp und c oloane lor tab e lului, tim p c e o linie v a re p re z e nta un n artic ol. P e l ng a tab e le , o b az d e d ate m ai p oate c ontine : p roc e d uri i a a s func ii, utiliz atori i g rup uri d e utiliz atori, tip uri d e d ate , ob ie c te , e tc . t s D intre p rod uc torii c e i m ai im p ortanti d e b az e d e d ate am intim c om a p aniile Orac le , S y b ase , IB M , Inform ix , M ic rosoft, e tc . e c are furniz nd o a se rie ntre ag d e p rod use i utilitare p e ntru luc rul c u b az e d e d ate . A c e ste a s p rod use sunt g e ne ral re fe rite p rin te rm e nii D B M S (D atab ase M anag e m e nt n S y ste m ) sau, trad uc e re , S G B D (S iste m d e G e stiune a B az e lor d e D ate ). In n ac e st c ap itol v om analiz a luc rul c u b az e d e d ate d in p e rsp e c tiv a p rog ram rii a 423

424

CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

lim b ajul J av a, fr a d e sc rie p artic ularit i ale une i solutii d e stoc are a n aa at d ate lor anum e . V om v e d e a c , folosind J av a, p ute m c re a ap lic atii c are s a a rule z e fr nic i o m od ic are folosind d iv e rse tip uri d e b az e c are au ac e e a i aa s struc tur, d uc nd fe lul ac e sta notiune a d e p ortab ilitate i m ai d e p arte . a a n s

Crearea unei b az e de date Cre are a une i b az e d e d ate se fac e uz ual folosind ap lic atii sp e c ializ ate ofe rite d e p rod uc torul tip ului re sp e c tiv d e siste m d e g e stiune a d ate lor, d ar e x ist a a i p osib ilitate a d e a c re a o b az a folosind un sc rip t S Q L . A c e st asp e c t ne v a s p re oc up a a m ai p utin, e x e m p le le p re z e ntate p re sup un nd c b az a a fost ns a a c re at d e ja i are o anum it struc tur sp e c ic at. a s a a a

A ccesul la b az a de date S e fac e p rin inte rm e d iul unui driver sp e c ic tip ului re sp e c tiv d e S G B D . A c e sta e ste re sp onsab il c u ac c e sul e fe c tiv la d ate le stoc ate , ind le g atura d intre ap lic atie i b az a d e d ate . s

L im b ajul S Q L S Q L (S truc ture d Q ue ry L ang uag e ) re p re z int un lim aj d e p rog ram are c e a p e rm ite inte rog are a i ac tualiz are a inform atiilor d in b az e d e d ate re lationale . s A c e sta e ste stand ard iz at astfe l t d iv e rse tip uri d e d riv e re s se c om p orte nc a a id e ntic , ofe rind astfe l o m od alitate unitar d e luc ru c u b az e d e d ate . a

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 inte rfat stand ard S Q L d e ac c e s a la b az e d e d ate . J D B C e ste c onstituit d intr-un se t d e c lase i inte rfe e a s t

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E

425

sc rise J av a, furniz nd m e c anism e stand ard p e ntru p roie c tantii ap lic atiilor n a c e folose sc d e b az e d e d ate . Folosind J D B C e ste u or s transm ite m se c v e nte S Q L c tre b az e d e d ate s a a re lationale . Cu alte c uv inte , nu e ste ne c e sar s sc rie m un p rog ram p e ntru a a ac c e sa o b az d e d ate Orac le , alt p rog ram p e ntru a ac c e sa o b az d e d ate a a S y b ase i asa m ai d e p arte . E ste d e ajuns s sc rie m un sing ur p rog ram folosind s a A P I-ul J D B C i ac e sta v a c ap ab il s c om unic e c u d riv e re d ife rite , trim it nd s a a se c v e nte S Q L c tre b az a d e d ate d orit. B ine e le s, sc riind c od ul surs a a nt a n J av a, ne e ste asig urat p ortab ilitate a p rog ram ului. D e c i, iat d ou m otiv e a a a p ute rnic e c are fac c om b inatia J av a - J D B C d e m n d e luat se am . a n a P ach e te le c are ofe r sup ort p e ntru luc rul c u b az e d e d ate sunt java.sq l a c e re p re z int nuc le ul te h nolog ie i J D B C i, p re luat d e p e p latform a J 2E E , a s javax .sq l. In linii m ari, A P I-ul J D B C ofe r urm toare le fac ilit i: a a at 1. S tab ilire a une i c one x iuni c u o b az d e d ate . a 2. E fe c tuare a d e se c v e nte S Q L . 3. P re luc rare a re z ultate lor ob inute . t

15 .2

Conectarea la o b az de date a

P roc e sul d e c one c tare la o b az d e d ate im p lic e fe c tuare a a d ou op e ratii: a a a 1. Inre g istrare a unui d riv e r c ore sp unz tor. a 2. R e aliz are a une i c one x iuni p rop riu-z ise . D e nitie O co n exiu n e (sesiu n e) la o b az d e d ate re p re z int un c onte x t p rin c are a a sunt trim ise se c v e nte S Q L i p rim ite re z ultate . Intr-o ap lic atie p ot e x ista s sim ultan m ai m ulte c one x iuni la b az e d e d ate d ife rite sau la ac e e a i b az . s a Clase le i inte rfe e le re sp onsab ile c u re aliz are a une i c one x iuni sunt: s t D riverM anag er - e ste c lasa c e se oc up c u g istrare a d riv e re lor c e a nre v or folosite ap lic atie ; n

426

CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

D river - inte rfata p e c are tre b uie s o im p le m e nte z e oric e c las c e a a d e sc rie un d riv e r; D riverP roperty Info - p rin inte rm e d iul ac e ste i c lase p ot sp e c ic ate d iv e rse p rop rie t i c e v or folosite la re aliz are a c one x iunilor; at Connection - d e sc rie ob ie c te le c e m od e le az o c one x iune p rop riu-z is a a c u b az a d e d ate .

15 .2 .1

Inreg istrarea unui driver

P rim ul luc ru p e c are tre b uie s-l fac o ap lic atie p roc e sul d e c one c tare a a n la o b az d e d ate e ste s g istre z e la m a ina v irtual c e rule az ap lic atia a a nre s a a d riv e rul J D B C re sp onsab il c u c om unic are a c u re sp e c tiv a b az d e d ate . A c e st a luc ru p re sup une rc are a m e m orie a c lase i c e im p le m e nte az d riv e r-ul i nc a n a s p oate re aliz at m ai m ulte m od alit i. a n at a. Folosire a c lase i D riverM anag er: DriverManager.registerDriver(new TipDriver()); b . Folosire a m e tod e i Class.forN am e c e ap e le az ClassL oad e r-ul m a inii a s v irtuale : Class.forName("TipDriver"); Class.forName("TipDriver").newInstance(); c . S e tare a p rop rie t ii siste m jdb c.drivers, c are p oate re aliz at d ou at a n a fe luri: D e la linia d e c om and : a java -Djdbc.drivers=TipDriver Aplicatie D in p rog ram : System.setProperty("jdbc.drivers", "TipDriver"); Folosind ac e ast m e tod , sp e c ic are a m ai m ultor d riv e re se fac e se p ar nd a a a num e le c lase lor c u p unc t i v irg ul. s a D ac sunt g istrate m ai m ulte d riv e re , ord ine a d e p re c e d e nt ale g e re a a nre a n d riv e rului folosit la c re are a une i noi c one x iuni e ste : 1) D riv e re le g istrate folosind p rop rie tate a jdbc.drivers la initializ are a nre m a inii v irtuale c e v a rula p roc e sul. s 2) D riv e re le g istrate d inam ic d in ap lic atie . nre

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E

427

15 .2 .2

S peci carea unei b az e de date

O d at c e un d riv e r J D B C a fost g istrat, ac e sta p oate folosit la stab ilire a a nre une i c one x iuni c u o b az d e d ate . A v nd v e d e re fap tul c a p ot e x ista m ai a a n m ulte d riv e re rc ate m e m orie , tre b uie s av e m p osib ilite a d e a sp e c ic a nc a n a p e l ng un id e ntic ator al b az e i d e d ate i d riv e rul c e tre b uie folosit. A c e asta a a s se re aliz e az p rin inte rm e d iul une i ad re se sp e c ic e , num it JD B C U R L , c e a a are urm torul form at: a jdb c:sub -protocol:identi cator C m p ul su b-p ro to co l d e num e te tip ul d e d riv e r c e tre b uie folosit p e ntru a s re aliz are a c one x iunii i p oate o d bc, o ra cle, sy ba se, d b2 i a a m ai d e p arte . s s s Id en ti ca to ru l ba zei d e d a te e ste un ind ic ator sp e c ic e c rui d riv e r c ore a sp unz tor b az e i d e d ate c u c are ap lic atia d ore te s inte rac ione z e . In func ie a s a t t d e tip ul d riv e r-ului ac e st id e ntic ator p oate inc lud e num e le une i m a ini s g az d , un num r d e p ort, num e le unui ie r sau al unui d ire c tor, e tc ., c a a a s e x e m p le le d e m ai jos: n jdbc:odbc:test jdbc:oracle:thin@persistentjava.com:1521:test jdbc:sybase:test jdbc:db2:test S ub p rotoc olul od b c e ste un c az sp e c ic al, se nsul c p e rm ite sp e c ic are a n a c ad rul U R L -ului a unor atrib ute c e v or re aliz ate la c re are a une i c one x in uni. S intax a c om p le ta sub p rotoc olului od b c e ste : jd b c :od b c :id e ntic ator[;atrib ut=v aloare ]* jdbc:odbc:test jdbc:odbc:test;CacheSize=20;ExtensionCase=LOWER jdbc:odbc:test;UID=duke;PWD=java L a p rim ire a unui J D B C U R L , DriverManager-ul v a p arc urg e lista d riv e re lor g istrate m e m orie , p na c nd unul d intre e le v a re c unoa te U R L -ul re nre n a a s sp e c tiv . D ac nu e x ista nic i unul p otriv it, atunc i v a lansata o e x c e p ie d e a t tip ul SQLException, c u m e sajul "no suitable driver".

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 iste nte c e p ot folosite p e ntru re aliz are a une i c one x iuni p rin inte rm e d iul J D B C se p art urm toare le c ate g orii: m n a

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 c one c tare a la o b az d e d ate c are a fost a g istrat p re alab il OD B C. OD B C (Op e n D atab ase Cone c tiv ity ) nre a n n re p re z int o m od alitate d e a uniform iz a ac c e sul la b az e d e d ate , asoc iind a ac e stora un id e ntic ator D S N (D ata S ourc e N am e ) i d iv e r i p aram e tri ne c e s s sari c one c trii. Cone c tare a e fe c tiv la b az a d e d ate se v a fac e p rin inte rm e d iul a a ac e stui id e ntic ator, d riv e r-ul OD B C e fe c tu nd c om unic are a c u d riv e rul naa tiv al b az e i d e d ate . D e i sim p lu d e utiliz at, solutia J D B C-OD B C nu e ste p ortab il i c om unis as c are a c u b az a d e d ate sufe r la niv e lul v ite z e i d e e x e c utie d atorit m ultip le lor a a re d ire c tri a ntre d riv e re . D e ase m e ne a, at t OD B C-ul c t i d riv e r-ul nativ a a s tre b uie s e x iste p e m a ina p e c are rule az ap lic atia. a s a Clasa J av a c are d e sc rie ac e st tip d e d riv e r J D B C e ste : sun.jdb c.odb c.Jdb cO db cD river i e ste inc lus d istrib utia stand ard J 2S D K . S p e c ic are a b az e i d e d ate se s a n fac e p rintr-un U R L d e form a: jdb c:odb c:identi cator und e id entif icator e ste p rolul (D S N ) c re at b az e i d e d ate OD B C. n

T ip 2 . D river J D B C - D river n a tiv

1 5 .2 . CO NE CT ARE A L A O B AZ A D E D AT E

429

A c e st tip d e d riv e r transform c e re rile J D B C d ire c t ap e luri c tre a n a d riv e rul nativ al b az e i d e d ate , c are tre b uie instalat p re alab il. Clase J av a n c are im p le m e nte az astfe l d e d riv e re p ot p roc urate d e la p rod uc torii d e a a S G B D -uri, d istrib utia stand ard J 2S D K ne inc luz nd nic i unul. a

T ip 3 . D river J D B C - S erver

A c e st tip d e d riv e r transform c e re rile J D B C folosind un p rotoc ol d e re e a a t ind e p e nd e nt, ac e ste a ind ap oi transorm ate folosind o ap lic atie se rv e r ntr-un p rotoc ol sp e c c b az e i d e d ate . Introd uc e re a se rv e rului c a niv e l inte rm e d iar ad uc e e x ib ilitate m ax im se nsul c v or p ute a re aliz ate c one x iuni c u a n a d ife rite tip uri d e b az e , fr nic i o m od ic are la niv e lul c lie ntului. P rotoc olul aa folosit e ste sp e c ic e c rui p rod uc tor. a a

T ip 4 . D river J D B C n a tiv

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 c e re rile J D B C d ire c t c e re ri c tre b az a a n a d e d ate folosind p rotoc olul d e re e a al ac e ste ia. A c e ast solutie e ste c e a m ai t a rap id , ind p re fe rat la d e z v oltare a ap lic atiilor c are m ane v re az v olum e a a a m ari d e d ate i v ite z a d e e x e c utie e ste c ritic . D riv e re d e ac e st tip p ot s a p roc urate d e la d iv e r i p rod uc tori d e S G B D -uri. s a

15 .2 .4

R ealiz area unei conex iuni

M e tod a folosit p e ntru re aliz are a une i c one x iuni e ste g etConnection d in a c lasa DriverManager i p oate av e a m ai m ulte form e : s 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);

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L } finally { try{ con.close ; } catch(SQLException e) { System.err.println(SQLException: " + e) ; } }

431

S tab ilirea unei conex iuni folosind un driver M y S q l Folosire a d ife rite lor tip uri d e d riv e re im p lic d oar sch im b are a num e lui c lase i a c e re p re z int d riv e rul i a m od alit ii d e sp e c ic are a b az e i d e d ate . a s at 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 c one x iune v a folosit p e ntru: a Cre are a d e se c v e nte S Q L utiliz ate p e ntru inte rog are a sau ac tualiz are a b az e i. A are a unor inform atii le g ate d e b az a d e d ate (m e ta-d ate ). D e ase m e ne a, c lasa Connection asig ur fac ilit i p e ntru c ontrolul tranz ac iilor a at t d in m e m orie c tre b az a d e d ate p rin m e tod e le com m it, rollb ack , setA ua toCom m it. Inch id e re a une i c one x iuni se re aliz e az p rin m e tod a close. a

15 .3

E fectuarea de secvente S Q L

O d at fac ut c one c tare a c u m e tod a DriverManager.getConection, se p oate a a folosi ob ie c tul Connection re z ultat p e ntru a se c re a ob ie c te d e tip S tatem ent,P reparedS tatem ent sau Callab leS tatem ent c u ajutorul c rora a p ute m trim ite se c v e nte S Q L c tre b az a d e d ate . Ce le m ai uz uale c om e nz i a S Q L sunt c e le folosite p e ntru: Inte rog are a b az e i d e d ate : SELECT

432

CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

A c tualiz are a d ate lor: INSERT, UPDATE, DELETE A c tualiz are a struc turii: CREATE, ALTER, DROP - ac e ste a m ai sunt num ite instruc iuni D D L (D ata D e nition L ang uag e ) t A p e lare a une i p roc e d uri stoc ate : CALL D up c um v om v e d e a, ob ine re a i p re luc rare a re z ultate lor une i inte rog ri a t s a e ste re aliz at p rin inte rm e d iul ob ie c te lor d e tip R esultS et. a

15 .3 .1

Interfata S tatem ent

Inte rfata Statement ofe r m e tod e le d e b az p e ntru trim ite re a d e se c v e nte a a S Q L c tre b az a d e d ate i ob ine re a re z ultate lor, c e le lalte d ou inte rfe e : a s t a t PreparedStatement i CallableStatement ind d e riv ate d in ac e asta. s Crearea unui ob ie c t Statement se re aliz e az p rin inte rm e d iul m e tod e i a createS tatem ent a c lase i Connection, fr nic i un arg um e nt: aa Connection con = DriverManager.getConnection(url); Statement stmt = con.createStatement(); E x ecutia une i se c v e nte S Q L p oate re aliz at p rin inte rm e d iul a tre i a m e tod e :

1. ex ecuteQ uery E ste folosit p e ntru re aliz are a d e inte rog ri d e tip SELECT. M e tod a re turne az a a a un ob ie c t d e tip ResultSet c e v a c ontine sub o form tab e lar re z ultatul a a inte rog rii. a String sql = "SELECT * FROM persoane"; ResultSet rs = stmt.executeQuery(sql);

2 . ex ecuteU pdate E ste folosit p e ntru ac tualiz are a d ate lor (INSERT, UPDATE, DELETE) sau a a struc turii b az e i d e d ate (CREATE, ALTER, DROP). M e tod a v a re turna un ntre g c e se m nic num rul d e linii afe c tate d e op e ratiune a d e ac tualiz are a a a d ate lor, sau 0 c az ul une i instruc iuni D D L . n t

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L 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

433

3 . ex ecute A c e ast m e tod v a folosit d oar d ac e ste p osib il c a re z ultatul une i ina a a a te rog ri s e form at d in d ou sau m ai m ulte ob ie c te d e tip ResultSet sau a a a re z ultatul une i ac tualiz ri s e form at d in m ai m ule v alori, sau o c om b inatie a a ntre ac e ste c az uri. A c e ast situatie , d e i m ai rar, e ste p osib il atunc i c nd a s a a a sunt e x e c utate p roc e d uri stoc ate sau se c v e nte S Q L c unosc ute ab ia la m om e n tul e x e c utie i, p rog ram atorul ne tiind d e c i d ac v a v orb a d e o ac tualiz are s a a d ate lor sau a struc turii. M e tod a ntoarc e true d ac re z ultatul ob inut a t e ste form at d in ob ie c te d e tip ResultSet i false d ac e form at d in s a ntre g i. In func ie d e ac e asta, p ot ap e late m e tod e le : g etR esultS et sau g etU pt dateCount p e ntru a a a e fe c tiv re z ultatul c om e nz ii S Q L . P e ntru a p re lua toate re z ultate le v a ap e lat m e tod a g etM oreR esults, d up c are v or a a ap e late d in nou m e tod e le am intite , p n la ob ine re a v alorii nu ll, re sp e c tiv a a t 1. S e c v e nta c om p le t d e tratare a m e tod e i execute e ste p re z e ntat m ai a a jos: 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");

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, c az ul c are d orim s introd uc e m v alorile n n a unor v ariab ile ntr-o se c v e nt S Q L , nu av e m alt solutie d e c t s c re m un a a a a a ir d e c arac te re c om p us d in instruc iuni S Q L i v alorile v ariab ile lor: s t s 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

Inte rfata P re p are d S tate m e nt e ste d e riv at d in Statement, ind d ife rit d e a a ac e asta urm toare le p riv inte : n a Instante le d e tip PreparedStatement c ontin se c v e nte S Q L c are au fost d e ja c om p ilate (sunt p re g tite ). a O se c v e nt S Q L sp e c ic at unui ob ie c t PreparedStatement p oate s a a a aib unul sau m ai m ulti p aram e tri d e intrare , c are v or sp e c ic ati a p rin inte rm e d iul unui se m n d e ntre b are ( ? ) loc ul e c ruia d intre n a

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L

435

e i. Inainte c a se c v e nta S Q L s p oat e x e c utat e c rui p aram e tru a a a a d e intrare tre b uie s i se atrib uie o v aloare , folosind m e tod e sp e c ic e a ac e ste i c lase . E x e c utia re p e tat a ac e le ia i se c v e nte S Q L , d ar c u p aram e tri d ife riti, v a a s g e ne ral m ai rap id d ac folosim PreparedStatement, d e oare c e nu m ai n a a tre b uie s c re m c te un ob ie c t d e tip Statement p e ntru e c are ap e l S Q L , c i a a a re folosim o sing ur instant p re c om p ilat furniz nd u-i d oar alte arg um e nte . a a a a Crearea unui ob ie c t d e tip PreparedStatement se re aliz e az p rin inte ra m e d iul m e tod e i prepareS tatem ent a c lase i Connection, sp e c ic n c a ara g um e nt o se c v e nt S Q L c e c ontine c te un se m n d e a a ntre b are p e ntru e c are p aram e tru 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 c ontine o c om and S Q L p re c om p ilat c are e ste trim is a a a im e d iat c tre b az a d e d ate , und e v a a te p ta p aram e tri d e intrare p e ntru a a s p ute a e x e c utat. a T rim iterea param etrilor se re aliz e az p rin m e tod e d e tip setX X X , a und e XXX e ste tip ul c ore sp unz tor p aram e trului, iar arg um e nte le m e tod e i a sunt n u m ru l d e o rd in e al p aram e trului d e intrare (al se m nului d e a ntre b are ) i va lo a rea p e c are d orim s o atrib uim . s a pstmt.setString(1, "Ionescu"); pstmt.setInt(2, 100); D up stab ilire a p aram e trilor d e intrare se c v e nta S Q L p oate e x e c utat. a a P ute m ap oi stab ili alte v alori d e intrare i re folosi ob ie c tul PreparedStatement s p e ntru e x e c utii re p e tate ale c om e nz ii S Q L . E ste a p osib il c a S G B D -ul ns folosit s nu sup orte ac e st tip d e op e ratiune i s nu re in ob ie c tul p re a s a t a c om p ilat p e ntru e x e c utii ulte rioare . In ac e ast situatie folosire a inte rfe e i a t PreparedStatement loc d e Statement nu v a b unt i nic i un fe l n m a at n p e rform anta c od ului, d in p unc tul d e v e d e re al v ite z e i d e e x e c utie a ac e stuia. E x ecutia une i se c v e nte S Q L folosind un ob ie c t PreparedStatement se re aliz e az p rintr-una d in m e tod e le ex ecuteQ uery , ex ecuteU pdate sau a ex ecute, se m nic atiile lor ind ac e le a i c a i c az ul ob ie c te lor d e tip s s n Statement, c u sing ura d e ose b ire c c az ul d e fat e le nu au nic i un ara n a g um e nt.

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 rui tip J av a c ore sp und e un tip g e ne ric S Q L . E ste re sp onsab ilitate a a i p rog ram atorului s se asig ure c folose te m e tod a ad e c v at d e tip setXXX la a a s a stab ilire a v alorii unui p aram e tru d e intrare . L ista tuturor tip urilor g e ne ric e d isp onib ile , num ite i tip u ri J D B C , e ste d e nit d e c lasa T y pes, p rin c ons a stante lor d e c larate d e ac e asta. M e tod a setO b ject p e rm ite sp e c ic are a unor v alori p e ntru p aram e trii d e intrare , atunc i c nd d orim s folosim m ap are a a a im p lic it a ntre tip urile J av a i c e le J D B C sau atunc i c nd d orim s p re c iz m s a a a e 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 s atrib uim unui p aram e tru d e intrare a v aloare S Q L NULL, tre b uind a s sp e c ic m i tip ul d e d ate al c oloane i ns a a s n c are v om sc rie ac e ast v aloare . A c e la i luc ru p oate re aliz at c u m e tod e d e a s tip ul setXXX d ac arg um e ntul folosit are v aloare a null. a 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 ilitate a d e a sp e c ic a d ate d e oric e d im e nsiuni c a v alori p e ntru anum ite artic ole d in b az a d e d ate . E x ist a situatii c nd e ste d e p re fe rat c a d ate le d e m ari d im e nsia ns a uni s e transfe rate p e b uc i d e o anum it d im e nsiune . P e ntru a re aliz a a at a

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L

437

ac e st luc ru 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 i setU nicodeS tream c are ata e az un ux d e intrare p e s s a oc te i, c arac te re A S CII, re sp e c tiv U N ICOD E , unui p aram e tru d e intrare . P e t m sur c e sunt c itite d ate d e p e ux , e le v or atrib uite p aram e trului. E x e m a a p lul d e m ai jos ilustre az ac e st luc ru, atrib uind c oloane i continu t c ontinutul a unui anum it ie r: s 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 c utia se c v e nte i, ux ul d e intrare v a ap e lat re p e tat p e ntru a furniz a d ate le c e v or sc rise c oloana continu t a artic olului sp e c ic at. n Ob se rv ati c e ste ne c e sar a s tim d inainte d im e nsiune a d ate lor c e v or a n a s sc rise , ac e st luc ru ind solic itat d e une le tip uri d e b az e d e d ate .

15 .3 .3

Interfata Callab leS tatem ent

Inte rfata CallableStatement e ste d e riv at d in PreparedStatement, instante le a d e ac e st tip ofe rind o m od alitate d e a ap e la o p roc e d ur stoc at a a ntr-o b az a d e d ate , ntr-o m anie r stand ar p e ntru toate S G B D -urile . a Crearea unui ob ie c t CallableStatement se re aliz e az p rin m e tod a prea pareCall a c lase i Connection: Connection con = DriverManager.getConnection(url); CallableStatement cstmt = con.prepareCall( "{call proceduraStocata(?, ?)}"); T rim iterea param etrilor d e intrare se re aliz e az a ntoc m ai c a la PreparedStatement, c u m e tod e d e tip setX X X . D ac p roc e d ura are i p aram e tri d e ie ire (v alori a s s re turnate ), ac e tia v or tre b ui g istrati c u m e tod a reg isterO utP aram es nre ter nainte d e e x e c utia p roc e d urii. Ob ine re a v alorilor re z ultate p aram e trii t n d e ie ie se v a fac e c u m e tod e d e tip g etX X X . s CallableStatement cstmt = con.prepareCall(

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 c a un p aram e tru d e intrare s e i p aram e tru d e ie ire . In a s s ac e st c az e l tre b uie s p rim e asc o v aloare c u setXXX i, d e ase m e ne a, v a a a s g istrat c u registerOutParameter, tip urile d e d ate sp e c ic ate tre b uind nre s c oinc id . a a

15 .3 .4 15 .3 .5

O b inerea i prelucrarea rez ultatelor t s Interfata R esultS et

In urm a e x e c utie une i inte rog ri S Q L re z ultatul v a re p re z e ntat p rintr-un a ob ie c t d e tip R esultS et, c e v a c ontine toate liniile c e satisfac c ond itiile im p use d e c om and a S Q L . Form a g e ne ral a unui ResultSet e ste tab e lar, a a av nd un num r d e c oloane i d e linii, func ie d e se c v e nta e x e c utat. D e a a s t a ase m e ne a, ob ie c tul v a c ontine i m e ta-d ate le inte rog rii c um ar d e num ire le s a c oloane lor se le c tate , num rul lor, e tc . a Statement stmt = con.createStatement(); String sql = "SELECT cod, nume FROM persoane"; ResultSet rs = stmt.executeQuery(sql); R e z ultatul inte rog rii d e m ai sus v a ob ie c tul r s c u urm toare a struc tur: a a a cod 100 200 num e Ione sc u P op e sc u

P e ntru a e x trag e inform atiile d in ac e ast struc tur v a tre b ui s p arc urg e m a a a tab e lul linie c u linie i d in e c are s e x trag e m v alorile d e p e c oloane . P e ntru s a ac e st luc ru v om folosi m e tod e d e tip g etX X X , und e XXX e ste tip ul d e d at al une i c oloane iar arg um e ntul p rim it ind ic e num rul d e ord ine d in a a a c ad rul tab e lului, e num e le ac e stuia. Coloane le sunt num e rotate d e la st ng a a la d re ap ta, e p nd c u 1. In g e ne ral, folosire a ind e x ului c oloane i loc d e nc a n num e le su v a m ai e c ie nt. D e ase m e ne a, p e ntru m ax im p ortab ilitate a a a se re c om and c itire a c oloane lor ord ine d e la st ng a la d re ap ta i e c are a n a s c itire s se fac o sing ur d at. a a a a

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 te un c ursor p e ntru a p arc urg e artic ole le s re z ultate urm a une i inte rog ri. Initial ac e st c ursor e ste p oz itionat n a nainte a p rim e i linii, e c are ap e l al m e tod e i nex t d e te rm in nd tre c e re a la urm toare a a a linie . D e oare c e next re turne az false c nd nu m ai sunt linii d e ad us, uz ual a a v a folosit o b uc l while-loop p e tru a ite ra p rin artic ole le tab e lului: a a 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 m od ic at iar c ursorul asoc iat nu se d e p lase az d e c t a a nainte , linie c u linie . A ad ar, p ute m ite ra s p rin re z ultatul une i inte rog ri o sing ur d at i num ai d e la p rim a la ultim a a a as linie . E ste a p osib il s c re m ResultSet-uri c are s p e rm it m od ic are a ns a a a a sau d e p lasare a am b e le se nsuri. E x e m p lul urm tor v a folosi un c ursor c are n a e ste m od ic ab il i nu v a re e c ta sch im b rile p rod use d e alti utiliz atori d up s a a c re are a 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 un ResultSet folose te un c ursor m od ic ab il i c are p oate nav ig a a s s am b e le se nsuri, atunc i are la d isp oz itie o se rie d e m e tod e c e se b az e az p e n a ac e st sup ort: ab solute - D e p lase az c ursorul la o anum it linie sp e c ic at ab solut; a a a updateX X X - A c tualiz e az v aloare a une i c oloane d in linia c ure nt, a a und e XXX e ste un tip d e d ate .

440

CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

updateR ow - T ransfe r ac tualiz rile fc ute linie i b az a d e d ate . a a a n m oveT oInsertR ow - d e p lase az c ursorul la o linie sp c e ial, num it a a a lin ie n o u , utiliz ate p e ntru a introd uc e noi artic ole b az a d e d ate . a a n L inia c ure nt ante rioar a c ursorului v a m e m orat p e ntru a se p ute a a a a re v e ni la e a. insertR ow - inse re az artic olul d in z ona lin ie n o u b az a d e d ate ; a a n c ursorul tre b uie s e p oz itionat le linia nou la e x e c utia ac e ste i op e ratiuni. a a m oveT oCurrentR ow - re v ine la linia c ure nt d in tab e l. a deleteR ow - te rg e linia c ure nt d in tab e l i d in b az a d e d ate ; nu s a s p oate ap e lat c nd c ursorul e ste m od ul lin ie n o u . a a n a N u toate siste m e le d e g e stiune a b az e lor d e d ate ofe r sup ort p e ntru a folosire a c ursoare lor c are p ot m od ic ate . P e ntru a d e te rm ina d ac b az a d e a d ate p e rm ite ac e st luc ru p ot utiliz ate m e tod e le supportsP ositionedU pdate i supportsP ositionedD elete ale c lase i DatabaseMetaData. In c az ul s c are ac e st luc ru e ste p e rm is, e ste re sp onsab ilitate a d riv e r-ului b az e i d e n d ate s asig ure re z olv are a p rob le m e lor le g ate d e ac tualiz are a c onc ure nt a a a unui c ursor, astfe l t s nu ap ar anom alii. nc a a a

15 .3 .6

E x em plu sim plu

In c ontinuare v om d a un e x e m p lul sim p lu d e utiliz are a c lase lor d e b az a m e ntionate ante rior. P rog ram ul v a folosi o b az d e d ate M y S q l, c e c ontine a un tab e l num it p er soane, av nd c oloane le : cod , nu m e i salar iu . S c rip tul a s S Q L d e c re are a b az e i e ste : create table persoane(cod integer, nume char(50), salariu double); A p lic atia v a g oli tab e lul c u p e rsoane , d up c are v a ad ug a ale ator un a a num r d e artic ole , v a e fe c tua a are a lor i c alc ulul m e d ie i salariilor. a s s L isting 15.1: E x e m p lu sim p lu d e utilz are J D B C
import java . sql .*; public class TestJdbc { public static void main ( String [] args ) {

1 5 .3 . E F E CT UARE A D E SE CV E NT E SQ L
String url = " jdbc : mysql :// localhost / test " ; try { Class . forName ( " com . mysql . jdbc . Driver " ) ; } catch ( Cl as sNo tF oun dE xce pt io n 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 ) ;

441

// 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 () ;

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
15 .4 .1

L ucrul cu m eta-date
Interfata D atab aseM etaD ata

D up re aliz are a unui c one x iuni la o b az d e d ate , p ute m ap e la m e tod a g eta a M etaD ata p e ntru a a a d iv e rse inform atii le g ate d e b az a re sp e c tiv , a a a s num ite le m eta -d a te ( d ate d e sp re d ate ); Ca re z ult al ap e lului m e tod e i, v om ob ine un ob ie c t d e tip D atab aseM etaD ata c e ofe r m e tod e p e ntru d e te rt a m inare a tab e le lor, p roc e d urilor stoc ate , c ap ab ilit ilor c one x iunii, g ram atic ii at S Q L sup ortate , e tc . ale b az e i d e d ate . P rog ram ul urm tor a e az num e le tuturor tab e le lor d intr-o b az d e d at a s a a g istrat OD B C. nre a n L isting 15.2: Folosire a inte rfe e i D atab ase M e taD ata t
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 ( Cl as sNo tF oun dE xc ept io n 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 ) ;

1 5 .4 . L UCRUL CU M E T A-D AT E
while ( rs . next () ) System . out . println ( rs . getString ( " TABLE_NAME " ) ) ; con . close () ; } catch ( SQLException e ) { e . printStackTrace () ; } } }

443

15 .4 .2

Interfata R esultS etM etaD ata

M eta-datele unui ResultSet re p re z int inform atiile d e sp re re z ultatul c ontinut a ac e l ob ie c t c um ar num rul c oloane lor, tip ul i d e num irile lor, e tc . A c e sn a s te a sunt ob inute ap e l nd m e tod a g etM etaD ata p e ntru ResultSet-ul re t a sp e c tiv , c are v a re turna un ob ie c t d e tip R esultS etM etaD ata c e p oate ap oi folosit p e ntru e x trag e re a 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);

444

CAPIT O L UL 1 5 . L UCRUL CU B AZ E D E D AT E

Capitolul 16 L ucrul dinam ic cu clase


16 .1 Inc rcarea claselor m em orie a n

D up c um tim e x e c utia une i ap lic atii J av a e ste re aliz at d e c tre m a ina a s a a s v irtual J av a (J V M ), ac e asta ind re sp onsab il c u inte rp re tare a c od ului d e a a oc te i re z ultat urm a c om p ilrii. S p re d e ose b ire d e alte lim b aje d e p rog rat n a m are c um ar C sau C+ + , un p rog ram J av a c om p ilat nu e ste d e sc ris d e un ie r e x e c utab il c i d e o m ultim e d e ie re c u e x te nsia .class c ore sp unz toare s s a e c re i c lase a p rog ram ului. In p lus, ac e ste c lase nu sunt arc ate toate a n n m e m orie la p ornire a ap lic atie i, c i sunt arc ate p e p arc ursul e x e c utie ac e ste ia n atunc i c nd e ste ne v oie d e e le , m om e ntul e fe c tiv c are se re aliz e az ac e st a n a luc ru d e p inz nd d e im p le m e ntare a m a inii v irtuale . a s Cic lul d e v iat al une i c lase are a ad ar urm toare le e tap e : a s a 1. In c rca rea - E ste p roc e sul re g sirii re p re z e ntrii b inare a une i c lase a a a ( ie rul .c lass) p e b az a num e lui c om p le t al ac e stuia i rc are a ac e ss s nc a te ia m e m orie . In urm a ac e stui p roc e s, v a instantiat un ob ie c t d e n tip java.lang .Class, c ore sp unz tor c lase i re sp e c tiv e . Op e ratiune a d e a rc are a une i c lase e ste re aliz at la un m om e nt c e p re c e d e p rim a nc a a utiliz are e fe c tiv a sa. a 2. E d ita rea d e leg tu ri - S p e c ic inc orp orare a noului tip d e d ate J V M a a n p e ntru a p ute a utliz at. 3. In itia liza rea - Const e x e c utia b loc urilor static e d e initializ are i a n s initializ are a v ariab ile lor d e c las. a 445

446

CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

4. D esc rca rea - A tunc i c nd nu m ai e x ist nic i o re fe rint d e tip ul c lase i a a a a re sp e c tiv e , ob ie c tul d e tip Class c re at v a m arc at p e ntru a e lim inat d in m e m orie d e c tre ga rba ge co llecto r. a Inc rc are a c lase lor une i ap lic atii J av a m e m orie e ste re aliz at p rin ina n a te rm e d iul unor ob ie c te p e c are le v om num i g e ne ric cla ss lo a d er. A c e ste a sunt d e d ou tip uri: a 1. C la ss lo a d er-u l p rim o rd ia l (en g. boo tstra p ) - R e p re z int o p arte inte a g rant a m a inii v irtuale , ind re sp onsab il c u rc are a c lase lor stana s nc a d ard d in d istrib utia J av a. 2. C la ss lo a d er-e p ro p rii - A c e ste a nu fac p arte intrinse c d in J V M i a s sunt instante ale c lase i java.lang .ClassL oader. A c e asta e ste o c las a ab strac t, tip ul e fe c tiv al ob ie c tului ind a ad ar d e riv at d in ac e asta. a s D up c um v om v e d e a, la e x e c utia unui p rog ram J av a v or c re ate im p lic it a d ou ob ie c te d e tip ClassLoader p e ntru rc are a m e m ore i a c lase lor a nc a n p rop rii ale ap lic atie i. E x ist a p osib ilitare a d e a c re a noi tip uri d e riv ate d in a ns ClassLoader sp e c ializ ate p e ntru rc are a c lase lor c onform unor sp e c ic atii nc a anum e c are s re aliz e z e d iv e rse op tim iz ri. A stfe l, rc are a une i c lase p oate a a nc a d e te rm ina rc are a unor altor c lase c are sig ur v or folosite p re un c u nc a m a p rim a, sau a unor re surse c e sunt ne c e sare func ionrii ac e ste ia, e tc . t a

Inc e p nd c u v e rsiune a 1.2 d e J av a, a fost introd us un m od e l d e tip d elega t, a c are c lass load e r-e le sunt d isp use ie rarh ic n ntr-un arb ore , rd c ina ac e stuia a a ind c lass load e r-ul p rim ord ial. Fie c are instanta d e tip ClassLoader v a av e a a ad ar un p rin te (e v id e nt, m ai p utin rd c ina), ac e sta ind sp e c ic at la s a a a c re are a sa. In m om e ntul c nd e ste solic itat rc are a une i c lase , un c lassa a nc a load e r p oate d e le g a p rim ul r nd op e ratiune a d e rc are p rinte lui su n a nc a a a c are v a d e le g a la r nd ul su c e re re a m ai d e p arte p n la c lass load e r-ul a a a a p rim ord ial sau p n unul d in ac e tia re u e te s o arc e . A b ia c az ul a a s s s a nc n n c are nic i unul d in ac e tia nu a re u it, v a e rc a s e x e c ute op e ratiune a d e s s nc a rc are a c lase i. D ac nic i e a nu v a re u i, v a arunc at o e x c e p ie d e tip ul nc a a s a t ClassN otF oundE x ception. D e i ac e st c om p ortam e nt nu e ste ob lig atoriu, s m ulte situatii e l e ste d e p re fe rat, p e ntru a m inim iz a rc are a ac e le ia i n nc a s c lase d e m ai m ulte ori, folosind c lass load e r-e d ife rite .

1 6 .1 . INCARCARE A CL ASE L O R M E M O RIE IN

447

Im p lic it, J av a 2 J V M ofe r tre i c lass load e r-e , unul p rim ord ial i d ou a s a p rop rii, c unosc ute sub num e le d e : B o o stra p C la ss L oa d er - Class load e r-ul p rim ord ial. A c e sta e ste re sp onsab il c u rc are a c lase lor d in d istrib utia J av a stand ard (c e le d in nc a p ach e te le java.*, javax.*, e tc .). E xte n sio n C la ss L o a d er - U tiliz at p e ntru rc are a c lase lor d in d ire c nc a toare le e x te nsiilor J R E . S y stem C la ss L o a d er - A c e sta e ste re sp onsab il c u rc are a c lase lor nc a p rop rii ap lic atiilor J av a (c e le d in CL A S S P A T H ). T ip ul ac e stuia e ste java.lang .U R L ClassL oader.

Intruc t tip urile d e d ate J av a p ot rc ate folosind d iv e rse instante a nc a d e tip ClassLoader, e c are ob ie c t Class v a re ine c lass load e r-ul c are a t fost folosit p e ntru rc are , ac e sta p ut nd ob inut c u m e tod a g etClassnc a a t L oader.

Inc rc are a d in a m ic a une i c lase m e m orie se re fe r la fap tul c nu a a n a a c unoaste m tip ul ac e ste ia d e c t la e x e c utia p re og ram ului, m om e nt c are a n p ute m solic ita rc are a sa, sp e c ic nd num e le su c om p le t p rin inte rm e d iul nc a a a unui ir d e c arac te re . A c e st luc ru p oate re aliz at p rin m ai m ulte m od alit i, s at c e le m ai c om une m e tod e ind :

448

CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

loadClass ap e lat p e ntru un ob ie c t d e tip ClassLoader a ClassLoader loader = new MyClassLoader(); loader.loadClass("NumeCompletClasa"); Class.forN am e A c e ast m e tod a v a rc a re sp e c tiv a c las folosind c lass load e r-ul a nc a a ob ie c tului c ure nt (c are o ap e le az ): 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 d orim s instantie m un ob ie c t d intr-o c las rc at d inam ic p ute m a a a nc a a folosi m e tod a new Instance, c u c ond itia s e x iste c onstruc torul fr arg u a aa m e nte p e ntru c lasa re sp e c tiv . D up c um v om v e d e a se c iune a urm toare , a a n t a m ai e x ist i alte p osib ilit i d e a instantia astfe l d e ob ie c te . as at Class c = Class.forName("java.awt.Button"); Button b = (Button) c.newInstance();

Folosire a inte rfe e lor sau a c lase lor ab strac te p re un c u rc are a d it m a nc a nam ic a c lase lor ofe r un m e c anism e x tre m d e p ute rnic d e luc ru J av a. a a n V om d e talia ac e st luc ru p rin inte rm e d iul unui e x e p m p lu. S p re sup une m a c d orim s c re m o ap lic atie c are s g e ne re z e ale ator un v e c tor d e num e re a a a a d up c are s ap lic e o anum it func ie ac e stui v e c tor. N um e le func ie i c are a a a t t tre b uie ap e lat v a introd us d e la tastatur, iar im p le m e ntare a e i v a a a c ontinut a ntr-o c las a d ire c torului c ure nt. T oate func iile v or e x tind e c lasa a t ab strac t Functie. In fe lul ac e sta, ap lic atia p oate e x tins c u noi func ii a a t fr a sch im b a c od ul e i, tot c e tre b uie s fac e m ind s sc rie m noi c lase c are aa a a e x tind Functie i s im p le m e ntm m e tod a executa. A c e asta v a re turna 0 s a a d ac m e tod a s-a e x e c utat c ore c t, 1 c az c ontrar. a n

1 6 .1 . INCARCARE A CL ASE L O R M E M O RIE IN L isting 16.1: E x e m p lu d e rc are d inam ic a c lase lor nc a a


import java . util .*; import java . io .*; public class TestFunctii {

449

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 ( Cl as sNo tF oun dE xce pt io n e ) { System . err . println ( " Functie inexistenta ! " ) ; } catch ( In st ant ia tio nE xce pt io n e ) { System . err . println ( " Functia nu poate fi instantiata ! "); } catch ( Il le gal Ac ces sE xce pt io n e ) { System . err . println ( " Functia nu poate fi accesata ! " ) ;

450
} } } }

CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

L isting 16.2: Clasa ab strac t c e d e sc rie func ia a t


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 ie t


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 ie t


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;

1 6 .1 . INCARCARE A CL ASE L O R M E M O RIE IN


} }

451

U n ob ie c t d e tip URLClassLoader m e ntine o list d e ad re se U R L d e und e a v a e rc a s arc e m e m orie c lasa al c re i num e sp e c ic m c a arg unc a nc n a l a m e nt al m e tod e lor d e m ai sus. Im p lic it, la c re are a c lass load e r-ului ac e ast a list e ste c om p le tat c u inform atiile d in v ariab ila siste m CLASSPATH sau c u a a c e le sp e c ic ate p rin op iune a -classpath la lansare a ap lic atie i. Folosind t m e tod a g etU R L s p ute m a a ac e ste ad re se , iar c u addU R L p ute m ad ug a a o nou ad re s d e c utare a c lase lor. B ine e le s, ad re se le U R L p ot sp e c ic a a a a nt i d ire c toare ale siste m ului d e ie re loc al. S p re sup une m c d ire c torul s s a a n c:\clase\demo e x ist c lasa c u num e le Test, a at p ach e tul demo i d orim a a n s s o rc m d inam ic m e m orie : a nc a a n // 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 c e o c las a fost rc at folosind un c lass load e r, e a nu v a m ai a a nc a a p ute a d e sc rc at e x p lic it d in m e m orie . In c az ul c are d orim s av e m p osia a n a b ilitate a d e a o re rc a, d e oare c e a fost m od ic at i re c om p ilat, tre b uie s nc a as a a folosim c lass-load e re p rop rii i s instantie m noi ob ie c te d e tip ClassLoader, s a ori d e c te ori d orim s fortm re rc are a c lase lor. Cre are a unui c lass a a a nc a load e r p rop riu se fac e uz ual p rin e x tind e re a c lase i URLClassLoader, o v ariant sim p list ind p re z e ntat m ai jos: a a a public class MyClassLoader extends URLClassLoader{ public MyClassLoader(URL[] urls){ super(urls); } } Inc rc are a c lase lor folosind c lasa nou c re at se v a fac e astfe l: a a

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 re ect rii a

M e c anism ul p rin c are o c las, inte rfat sau ob ie c t re e c t la m om e ntul a a a e x e c utie i struc tura lor inte rn se num e te re ecta re (e ng . re e c tion), ac e sta a s p un nd la d isp oz itie m e tod e p e ntru: a D e te rm inare a c lase i unui ob ie c t. A are a unor inform atii d e sp re o c las (m od ic atori, sup e rc lasa, c on a struc tori, m e tod e ). Instantie re a unor c lase al c ror num e e ste tiut ab ia la e x e c utie . a s S e tare a sau a are a atrib ute lor unui ob ie c t, ch iar d ac num e le ac e stora a e ste tiut ab ia la e x e c utie . s Inv oc are a m e tod e lor unui ob ie c t al c ror num e e ste tiut ab ia la e x e c utie . a s Cre are a unor v e c tori a c ror d im e nsiune i tip nu e ste tiut d e c t la a s s a e x e c utie . S up ortul p e ntru re e c tare e ste inc lus d istrib utia stand ard J av a, ind n c unosc ut sub num e le d e R e ectio n AP I i c ontine urm toare le c lase : s a

1 6 .2 . M E CANISM UL RE F L E CT ARII java.lang.Class java.lang.Object Clase le d in p ach e tul java.lang .re ect i anum e : s Array Constructor Field Method Modifier

453

16 .2 .1

E x am inarea claselor i interfetelor s

E x am inare a c lase lor i inte rfe e lor se re aliz e az c u m e tod e ale c lase i java.lang.Class, s t a un ob ie c t d e ac e st tip p ut nd s re p re z inte at t o c las c t i o inte rfat, a a a a a s a d ife re ntie re a ac e stora fc nd u-se p rin inte rm e d iul m e tod e i isInterface. a a R e ectio n AP I p une la d isp oz itie m e tod e p e ntru ob ine re a urm toare lor t a inform atii:

A area instantei Class c ore sp unz tor unui anum it ob ie c t sau tip d e a d 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 e sc rise i e le d e instante d e tip Class av nd form a s a T ip P rim itiv .class: int.class, double.class, e tc ., d ife re ntie re a lor fc nd u a a se c u ajutorul m e tod e i isPrimitive.

A area num elui unei clase - S e re aliz e az c u m e tod a getName: a Class clasa = obiect.getClass(); String nume = clasa.getName();

454

CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

A area m odi catorilor unei clase - S e re aliz e az c u m e tod a getModifiers, a ac e asta re turn nd un num r a a ntre g c e c od ic toti m od ic atorii c lase i. P e na tru a d e te rm ina u or p re z e nta unui anum it m od ic ator se folose sc m e tod e le s static e ale c lase i Modifier isPublic, isAbstract i isFinal: s 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 area superclasei - S e re aliz e az c u m e tod a getSuperclass c e re a turne az o instant d e tip Class, c ore sp unz toare tip ului d e d ate al sup e ra a a c lase i sau null p e ntru 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 area interfetelor im p le m e ntate d e o c las sau e x tinse d e o inte rfat a a - S e re aliz e az c u m e tod a getInterfaces, c e re turne az un v e c tor d e tip a a Class[]. 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 + " ");

1 6 .2 . M E CANISM UL RE F L E CT ARII } } ... interfete(java.util.HashSet.class); // Va afisa interfetele implementate de HashSet: // Cloneable, Collection, Serializable, Set

455

interfete(java.util.Set); // Va afisa interfetele extinse de Set: // Collection

A area variab ilelor m em b re - S e re aliz e az c u una d in m e tod e le a getFields sau getDeclaredFields, c e re turne z un v e c tor d e tip Field[], a d ife re nta ntre c e le d ou c onst nd fap tul c p rim a re turne az toa te v aria a n a a ab ile le m e m b re , inc lusiv c e le m o te nite , tim p c e a d oua le re turne z d oar s n a p e c e le d e c larate c ad rul c lase i. L a r nd ul e i, c lasa Field p une la d isp oz itie n a m e tod e le getName, getType i getModifiers p e ntru a ob ine num e le , tip ul, s t re sp e c tiv m od ic atorii une i v ariab ile m e m b ru. Cu ajutorul m e tod e i getField e ste p osib il ob ine re a une i re fe rinte la o a t v ariab il m e b r c u un anum it num e sp e c ic at. a a

A area constructorilor - S e re aliz e az c u m e tod e le getConstructors a sau getDeclaredConstructors, c e re turne az un v e c tor d e tip Constructor[]. a Clasa Constructor p une la d isp oz itie m e tod e le getName, getParameterTypes, getModifiers, getExceptionTypes p e ntru a ob ine toate inform atiile le g ate t d e re sp e c tiv ul c onstruc tor. Cu ajutorul m e tod e i getConstructor e ste p osib il ob ine re a une i re fe rinte a t la c onstruc tor c u o sig natur sp e c ic at. a a

A area m etodelor - S e re aliz e az c u m e tod e le getMethods sau a getDeclaredMethods, c e re turne az un v e c tor d e tip Method[]. Clasa Method a p une la d isp oz itie m e tod e le getName, getParameterTypes, getModifiers, getExceptionTypes, getReturnType p e ntru a ob ine toate inform atiile le g ate t

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 il ob ine re a une i re fe rinte la a t o m e tod c u o sig natur sp e c ic at. a a a

A area claselor im b ricate - S e re aliz e az c u m e tod e le getClasses sau a getDeclaredClasses, c e re turne z un v e c tor d e tip Class[]. a

A area clasei de acoperire - S e re aliz e az c u m e tod a getDeclaringClass. a A c e ast m e tod o re g sim i c lase le Field, Constructor, Method, p e ntru a a a s n ac e ste a re turn nd c lasa c re i ap artine v ariab ila, c onstruc torul sau m e tod a a a i re sp e c tiv . a

16 .2 .2

M anipularea ob iectelor

P e l ng p osib ilitate a d e a e x am ina struc tura une i anum ite c lase la m om e ntul a a e x e c utie i, folosind R e ectio n AP I av e m p osib ilitate a d e a luc ra d inam ic c u ob ie c te , b az nd u-ne p e inform atii p e c are le ob ine m ab ia la e x e c utie . a t

Crearea ob iectelor D up c um stim , c re are a ob ie c te lor se re aliz e az c u op e ratorul new urm at d e a a un ap e l la un c onstruc tor al c lase i p e c are o instantie m . In c az ul c are n num e le c lase i nu e ste c unosc ut d e c t la m om e ntul e x e c utie i nu m ai p ute m a folosi ac e ast m e tod d e instantie re . In sch im b , av e m la d isp oz itie alte d ou a a a v ariante : M e tod a new Instance d in c lasa java.lang .Class A c e asta p e rm ite instantie re a unui ob ie c t folosind c onstruc torul fr ar aa g um e nte al ac e stuia. D ac nu e x ist un astfe l d e c onstruc tor sau nu e ste a a ac c e sib il v or g e ne rate e x c e p ii d e tip ul InstantiationException, re t sp e c tiv IllegalAccessException. Class c = Class.forName("NumeClasa"); Object o = c.newInstance(); // Daca stim tipul obiectului

1 6 .2 . M E CANISM UL RE F L E CT ARII Class c = java.awt.Point.class; Point p = (Point) c.newInstance();

457

M e tod a new Instance d in c lasa Constructor A c e asta p e rm ite instantie re a unui ob ie c t folosind un anum it c onstruc tor, c e l p e ntru c are se fac e ap e lul. E v id e nt, ac e ast solutie p re sup une a p rim ul r nd ob ine re a unui ob ie c t d e tip Constructor c u o anum it n a t a sig natur, ap oi sp e c ic are a arg um e nte lor la ap e lare a sa. S re sc rie m a a e x e m p lul d e m ai sus, ap e l nd c onstruc torul c u d ou arg um e nte al c lase i a a Point. 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 ii g e ne rate d e m e tod a newInstance sunt: InstantiationException, t IllegalAccessException, IllegalArgumentException i s InvocationTargetException. M e tod a getConstructor p oate p rov oc a e x c e p ii t d e tip ul NoSuchMethodException.

Invocarea m etodelor Inv oc are a une i m e tod e al c re i num e c unoa te m ab ia la m om e ntul e x e c utie i a l s se re aliz e az c u m e tod a invok e a c lase i M eth od. Ca i c az ul c onstruc a s n torilor, tre b uie s ob ine m ai o re fe rint la m e tod a c u sig natura c ore a t nt a sp unz toare i ap oi s sp e c ic m arg um e nte le . In p lus, m ai p ute m ob ine a s a a t v aloare a re turnat. S p re sup une m c d orim s ap e lm m e tod a contains a a a a a

458

CAPIT O L UL 1 6 . L UCRUL D INAM IC CU CL ASE

a c lase i Rectangle c are d e te rm in d ac un anum it p unc t se g se te inte a a a s n riorul d re p ung h iului. M e tod a contains are m ai m ulte v ariante , noi o v om ap e la p e c e a c are ac c e p t un arg um e nt d e tip Point. a 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 num rul arg um e nte lor m e tod e i e ste 0, atunc i p ute m folosi v ala a oare a null loc ul v e c torilor c e re p re z int sig natura, re sp e c tiv p aram e tri n a d e ap e lare ai m e tod e i. E x c e p iile g e ne rate d e m e tod a invoke sunt: IllegalAccessException t i InvocationTargetException. M e tod a getMethod p oate p rov oc a e x c e p ii s t d e tip ul NoSuchMethodException.

S etarea i a area variab ilelor m em b re s P e ntur se tare a i a are a v alorilor v ariab ile lor m e m b re sunt folosite m e tod e le s set i g et ale c lase i F ield. S p re sup une m c d orim s se tm v ariab ila x a s a a a a unui ob ie c t d e tip Point i s ob ine m v aloare a v ariab ile i y a ac e luia i ob ie c t: s a t s 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");

1 6 .2 . M E CANISM UL RE F L E CT ARII // Setam valoarea lui x x.set(obiect, new Integer(10)); // Obtinem valoarea lui y Integer val = y.get(obiect);

459

E x c e p iile g e ne rate d e m e tod e le get, set sunt: IllegalAccessException t i IllegalArgumentException. M e tod a getField p oate p rov oc a e x c e p ii d e s t tip ul NoSuchFieldException.

R e v e nind la e x e m p lul d in se c iune a ante rioar c u ap e lare a d inam ic a t a a unor func ii p e ntru un v e c tor, s p re sup une m c e x ist d e ja un num r m nat t a a a a nse d e c lase c are d e sc riu d ife rite func ii d ar ac e ste a nu e x tind c lasa ab strac t t a Functie. D in ac e st m otiv , solutia ante rioar nu m ai e ste v iab il i tre b uie a as s folosim ap e lare a m e tod e i executa a ntr-un m od d inam ic . L isting 16.5: L uc ru d inam ic c u m e tod e i v ariab ile s
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 () ;

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 e ntati c a tip d e d ate tot p rin inte rm e d iul c lase i java.lang.Class, d ife re ntie re a fc nd u-se p rin inte rm e d iul m e tod e i isArray. a a T ip ul d e d ate al e le m e nte lor d in c are e ste form at v e c torul v a ob inut c u t ajutorul m e tod e i getComponentType, c e ntoarc e o re fe rint d e tip Class. a Point []vector = new Point[10]; Class c = vector.getClass(); System.out.println(c.getComponentType()); // Va afisa: class java.awt.Point L uc rul d inam ic c u ob ie c te c e re p re z int v e c tori se re aliz e az p rin inte ra a m e d iul c lase i A rray . A c e asta c ontine o se rie d e m e tod e static e c e p e rm it: Cre are a d e noi v e c tori: newInstance A are a num rului d e e le m e nte : getLength a

1 6 .2 . M E CANISM UL RE F L E CT ARII S e tare a / a are a e le m e nte lor: set, get

461

E x e m p lul d e m ai jos c re e az un v e c tor c e c ontine num e re le a ntre g i d e la 0 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) + " ");