Вы находитесь на странице: 1из 22

INTERFEE

Noiunea de interfa
Aa cum s-a menionat anterior, este posibil s declarm clase abstracte n care toate metodele sunt abstracte. Acest lucru poate fi realizat i prin intermediul interfeelor. n plus, ele reprezint mecanismul propus de Java pentru tratarea problemelor ridicate de motenirea multipl. Interfeele reprezint o modalitate de a declara un tip constnd numai din constante i din metode abstracte. a sinta!, o interfa este asemntoare unei clase, cu deosebire c n loc de class trebuie precizat interface, iar metodele nu au corp, acesta fiind nlocuit cu ';'. "utem spune c interfeele reprezint numai proiecte, pe cnd clasele abstracte sunt o combinaie de proiecte i implementri. a i n cazul claselor abstracte, este evident c nu pot fi create obiecte de tipul unei interfee. Cmpurile unei interfee au n mod implicit modificatorii static i final, deci sunt constante. Metodele interfeelor sunt totdeauna publice i au n mod implicit modificatorul abstract. n plus ele nu pot fi statice, deoarece fiind abstracte, nu pot fi specifice claselor. #rice interfa este $ndit pentru a fi ulterior implementat de o clas, n care metodele interfeei s fie redefinite, adic s fie specificate aciunile ce trebuie ntreprinse. %aptul c o clas C implementeaz o interfa I trebuie specificat prin inserarea informaiei implements I n antetul clasei. Exemple de utili are a interfeelor !. "roiecte de cla#e $ %e i cur# &. Interfeele permit tran#miterea metodelor ca parametri
interface Functie{ double f(double x); } class F1 implements Functie{ double a,b,c; F1(int a1,int b1, int c1){ a=a1;b=b1;c=c1; } public double f(double x){ return a*x*x b*x c; } }

&

class F! implements Functie{ public double f(double x){return "at#$sin(x); } } class "ainF{ static double f(Functie ob, double x){ return ob.f(x); } public static %oid main(&trin' ar'()){ &*stem$out$println(f(new F1(1,1,1),!)); &*stem$out$printf(+,$!f+,f(ne- F!(),"at#$.I/!)); } }

"recizri' - dac o clas implementeaz doar unele din metodele unei interfee, atunci ea trebuie declarat cu abstract( - o clas poate implementa oricte interfee, dar poate e!tinde o sin$ur clas. - o interfa poate e!tinde oricte interfee. Facilitatea ca interfeele i cla#ele # poat extinde oricte interfee repre int modalitatea prin care 'a%a re ol% problema motenirii multiple. - dac o clas e!tinde o alt clas i implementeaz una sau mai multe interfee, atunci trebuie anunat nti e!tinderea i apoi implementarea, ca n e!emplul urmtor'
class C extends 0 implements I1,I!,I1;

Exemplu
interface 2 { int x=1; %oid scrie(); } interface 0 extends 2 { int x=!; %oid scrie0(); } class C { int x=1; public %oid scrie() { &*stem$out$println(2$x + + 0$x + + x); } } class 3 extends C implements 0 { int x=4; %oid printx(){ &*stem$out$println(x + + super$x); } public %oid scrie0(){&*stem$out$println(+0+); } }

class Interfete! { public static %oid main(&trin'() -) { 3 ob = ne- 3(); ob$scrie(); &*stem$out$println(ob$x); ob$printx(); ob$scrie0(); 2 ob1 = ne- 3(); ob1$scrie(); } }

produce la ieire'
1 ! 3 4 4 1 0 1 ! 1

Interfee din 'a%a


!. Interfaa Comparable ( )ordinea natural* a obiectelor

Interfaa Comparable567 este din pac*etul +ava.lan$ i are o sin$ur metod


int compareTo(6 o)

Exemplu( %e i cur#
import 8a%a$util$*; class .ersoana implements Comparable<Persoana ! &trin' nume; int "arsta; public int compareTo(Persoana persoana)! return %arsta9persoana$%arsta; } }

Recomandare' #rdinea natural pentru o clas C trebuie s fie consistent fa de metoda equals adic e1$compare6o(e!) == : e1$e;uals(e!) pentru orice dou obiecte e1 i e! de tip C.

&. Interfaa Iterator iterator - un obiect care permite parcur$erea tuturor elementelor unei colecii, unul cte unul, indiferent de implementare .avnd ca tip o clas care implementeaz interfaa Iterator / pentru a accesa elementele cu a+utorul unui iterator, clasa trebuie s aib o metod care furnizeaz iteratorul, mai e!act s implementeze interfaa Iterable Interfaa Iterator5<7 din pac*etul 8a%a$util are metodele
boolean #as$ext() < next() //t#ro-s =o&uc#<lement<xception %oid remo"e()//t#ro-s >nsupported?peration<xception, Ille'al&tate<xception

Interfaa Iterable567 din pac*etul 8a%a$util are metoda


%terator<T iterator()

Exemplu n e!emplul de mai +os este implementat o colecie de caractere iterabil, memorat intern ca &trin' .e!emplul fiind didactic, pentru a ilustra ideea de iterator/. "entru a simplifica accesul clasei %terator&ir la membrii clasei &ir clasa %terator&ir este clas intern a clasei &ir.
import 8a%a$util$*; class &ir implements %terable<C#aracter pri%ate &trin' s; &ir(){} &ir(&trin' s1){ s=s1 ;} &ir(c#ar() s1){ s=ne- &trin'(s1);} public %terator<C#aracter iterator(){ return new %terator&ir(); } class %terator&ir implements %terator<C#aracter ! pri%ate int curent=:; public boolean #as=ext(){ return curent5s$len't#(); } public C#aracter next(){ if (curent==s$len't#()) t#ro- new $o&uc#*lement*xception(); c#ar c= s$c#ar2t(curent); curent ; return c; } {

public %oid remo%e() { t#ro- new +nsupported,peration*xception(); } } } class <xpIterat{ public static %oid main(&trin' aa()){ c#ar "c()-!.x.,./.,.0.1; &ir sc-new &ir("c); for(C#aracter c@sc) &*stem$out$println(c); &ir s=ne- &ir(+abcdef+); for(C#aracter c@s) &*stem$out$println(c); for(c#ar c@s)22mer'e si cu c#ar, unboxin' &*stem$out$print(c); &*stem$out$println(); Iterator5C#aracter7 it=s$iterator(); -#ile(it$#as=ext()) &*stem$out$println(it$next()); //&*stem$out$println(it$next()); //$o&uc#*lement*xception } }

+b#er%aie. "uteam scrie clasa %terator&ir ca o clas e!terioar clasei &ir, dar pentru ca aceasta s poat accesa membrii clasei &ir trebuie s adu$m n clasa %terator&ir un cmp de tip &ir i un constructor care primete ca parametru un &ir, iar metoda iterator./ va fi'
public %terator<C#aracter iterator(){ return new %terator&ir(t#is); }

Re ol%area ,n 'a%a a problemei motenirii multiple


1 presupunem c plecnd de la clasele C1, C!, $$$, Cn dorim s construim o nou clas care s moteneasc unele dintre metodele lor. Java permite doar motenire simpl, deci va fi necesar s apelm la interfee. 2odalitatea de rezolvare a problemei motenirii multiple pe care o prezentm n continuare este independent de numrul de clase motenite. 3om folosi urmtoarea structur de interfee i clase'

I1

I!

$ $ $

In

C1

C!

$ $ $

Cn

n aceast structur clasele C1, C!, $$$, Cn implementeaz respectiv metodele anunate n interfeele I1, I!, $$$, In, iar clasa C implementeaz toate interfeele I1, I!, $$$, In. 5ste suficient s prezentm modul n care clasa C motenete implementrile din C1 ale metodelor anunate n I1, lucrurile decur$nd analo$ pentru celelalte interfee i clase pe care le implementeaz. 6e aceea n continuare vom presupune c C trebuie s extind doar clasa C1. n clasa C vom declara i crea un obiect ob1 de tipul C1 .se presupune c n clasa C se tie ce implementare a interfeei I1 trebuie folosit/. Atunci pentru fiecare metod met implementat de C1 introducem n clasa C metoda met cu aceeai si$natur i avnd una dintre formele' tip met($$$)
{ return ob1$met($$$); } { ob1$met($$$); } "oid met($$$)

dup cum metoda ntoarce sau nu o valoare. Exemplu


interface A { "oid x1(); int x!(); } class CA implements A { public "oid x1() { &*stem$out$print(+x1 +); } public int x!() { return 1; } } class C implements A { A obA= new CA(); // Clasa C +stie+ ca trebuie sa foloseasca // implementarea CA a interfetei A public "oid x1() { obA$x1(); } public int x!() { return obA$x!(); } }

Interfee -rafice
%aciliti Java de lucru cu interfee apar n 8a%a$a-t .Abstract Windowing Toolkit/. 5!ist trei aspecte care trebuie luate n considerare' &/ crearea i afiarea pe ecran a unei suprafee $rafice pe care urmeaz a fi plasate diferite obiecte $rafice( pentru suprafaa $rafic trebuie stabilit o confi$uraie iniial .un ablon/, constnd din dimensiunile ei, unele obiecte $rafice plasate de la nceput pe ea etc.( )/ o modalitate de poziionarea a obiectelor pe suprafaa $rafic( ,/ un mecanism prin care pro$ramul s rspund la diferite aciuni e!ecutate asupra obiectelor $rafice, conform dorinelor pro$ramatorului. Exemplul ! 1unt create un buton i un cmp de te!t. Aciunile asupra lor nu au nici un efect, iar fereastra nu poate fi nc*is.
import 8a%a$a-t$*; public class <x1 { public static %oid main(&trin'() ar's) { F f = ne- F(+ <x1 +); f$set&iBe(1::,1::);//al doilea parametru e inaltimea f$setCocation(!::,!::);//in ce punct apare fereastra f$setDisible(true); } } class F extends Frame { //static final lon' serialDersion>I3=1; 0utton btn; 6extField txt; F(&trin' s) { set6itle(s); setCa*out(ne- Flo-Ca*out()); txt = ne- 6extField(E); add(txt); btn = ne- 0utton(+?F+); add(btn); } }

"rincipalele suprafee $rafice corespund urmtoarelor clase din 8a%a$a-t'


Component .clas abstract/ Container GindoFrame 3ialo' &croll.ane .anel 2pplet

lasa abstract Component, care este rdcina arborelui claselor din A9:, definete o interfa $eneral pentru toate componentele $rafice. #biectele de tip Component se numesc componente. ;n container .obiect de tip Container/ este o component care poate include alte componente A9:, folosind de obicei o structur de list. fereast AWT .obiect de tipul Gindo-/ este o fereastr fr mar$ini i fr bar de meniuri. ;n cadru .obiect de tip Frame/ este o ferestr A9: cu mar$ini, titlu i bar de meniuri. O fereast de dialog .obiect de tipul 3ialo'/ e!tinde o fereastr A9: prin adu$area de mar$ini i a unui titlu( ea este folosit n principal pentru a prelua informaii de la utilizator. ;n panou .obiect de tipul .anel/ este folosit pentru a $rupa mai multe componente. Crearea unei #uprafee -rafice nu implic. afiarea ei . 6e aceea am invocat metoda setDisible cu ar$umentul true. "entru setarea dimensiunilor cadrului .n pi!eli/, am invocat metoda static< set&iBe. "entru plasarea componentelor n container, trebuie folosit un gestionar de poziionare .layout manager . Fiec.rui container ,i e#te a#ociat un -e#tionar de po iionare implicit .pentru cadre este folosit 0orderCa*out)$3om folosi n continuare doar Flo-Ca*out, care plaseaz< componentele n container de la stn$a la dreapta i de sus n +os. =estionarul de poziionare a fost specificat prin invocarea metodei #et3a/out din clasa Container. Controale -rafice /componente elementare0

ontroalele $rafice permit interaciunea cu utilizatorul. 5le corespond claselor ce apar subliniate n urm<toarea ierar*ie'
Component 0utton Can%as C#ecHbox C#oice Cabel Cist &crollbar 6extComponent 6ext2rea 6extField

buton suprafa de desenare csu de opiuni list de opiuni cu ale$ere unic etic*et list de opiuni cu ale$ere multipl bar de defilare arie de te!t cmp de te!t

>

Controalele -rafice pot fi ad.u-ate containerelor( adu$area se face conform re$ulilor stabilite de $estionarul de poziionare ales. %ie c un container i ob un control $rafic. Ad<u$area lui ob la c se face astfel'
c.add(ob);

1c2ema -eneral. de lucru cu 34T


1c*ema urmeaz< aa-numita programare orientat! pe evenimente. E%enimente

6orim ca la o anumit aciune asupra unei anumite componente, s putem preciza o aciune specific. nd acion<m asupra unei componente, apare un eveniment. 5n e%eniment e#te un obiect de tipul unei anumite cla#e. 5venimentul are un tip, care este o clas< tip<%ent din pac*etul 8a%a$a-t$e%ent. Iat< o scurt< list< de evenimente'
Tip 2ction 2d8ustment 6ext "ouse Gindo-

;n eveniment de acest tip apare dac< acion<m asupra'


0utton, Cist, 6extField &crollbar 6ext2rea, 6extField "ouse' clic?, ap<sare, eliberare Gindo-' nc*idere, minimizare@ma!imizare

"entru a specifica o aciune la apariia unui eveniment, trebuie mai nti s< i asociem un gestionar .listener, "andler/ #. ;n *andler .$estionar/ este un obiect al unei clase ce implementeaz< interfaa tipCistener sau e!tinde clasa tip2dapter .numai pentru tipurile "ouse i Gindo-/, unde tip este tipul aciunii asupra lui c pe care dorim s< o control<m. %ie de e!emplu c un control $rafic sau o fereastr<. "utem s< i asociem un $estionar # .mai spunem c< # este nre$istrat ca $estionar pentru c/ astfel'
c.addtip3istener(#);

"entru fiecare tip de aciune asupra unui control $rafic, e!ist< o metod< anunat< n interfaa tipCistener sau n clasa tip2dapter, ambele din pac*etul 8a%a$a-t$e%ent. 6e e!emplu interfaa "ouseCistener anun< metode separate pentru clic?, ap<sare i eliberare. Toate metodele din cla#ele tip4dapter #pecific. aciunea %id.. n $eneral, metodele din interfeele tipCistener i din clasele tip2dapter au un parameter de tipul tip<%ent. Acesta folosete pentru a identifica controlul $rafic asupra c<ruia s-a acionat .de e!emplu dou< butoane pot folosi acelai *andler/. Exemplul & n plus fa de e!emplul anterior, cnd ap<s<m pe buton, apare mesa+ul +?$F$+ n cmpul de te!t. 6arianta ! B =estionarul este clas separat de clasa pentru fereastr
import 8a%a$a-t$*; import 5a"a.awt.e"ent$*; public class <x! { public static %oid main(&trin'() ar's) { F f = ne- F(+ <x! +); f$set&iBe(1::,1::); f$setCocation(!::,!::); f$setDisible(true); } } class F extends Frame { 0utton btn; 6extField txt; F(&trin' s) { set6itle(s); setCa*out(ne- Flo-Ca*out()); txt = ne- 6extField(E); add(txt); btn = ne- 0utton(+?F+); add(btn); 0Iandler b# = ne- 0Iandler(t#is); btn$add4ction3istener(b#); } } class 67andler implements 4ction3istener { F f; 0Iandler(F f) { t#is$f=f; } public %oid action.erformed(2ction<%ent e) { f$txt$set6ext(+?$F$+); } }

&C

+b#er%aii7 - sin$ura metod< anunat< n interfaa 2ctionCistener este actionPerformed( - n continuare cadrul nu poate fi nc*is( - este permis s< specific<m drept *andler c*iar clasa curent<, dar este recomandat s< separ<m aplicaia de implementare. 6arianta & B =estionarul este clas intern a clasei pentru fereastr
class F extends Frame { 0utton btn; 6extField txt; F(&trin' s) { set6itle(s); setCa*out(ne- Flo-Ca*out()); txt = ne- 6extField(E); add(txt); btn = ne- 0utton(+?F+); add(btn); 0Iandler b# = ne- 67andler(); btn$add2ctionCistener(b#); } class 0Iandler implements 2ctionCistener {//clasa interna public %oid action.erformed(2ction<%ent e) { txt$set6ext(+?$F$+); } } }

6arianta 8 B lasa pentru fereastr este i $estionar


class F extends Frame implements 4ction3istener ! 0utton btn; 6extField txt; F(&trin' s) { set6itle(s); setCa*out(ne- Flo-Ca*out()); txt = ne- 6extField(E); add(txt); btn = ne- 0utton(+?F+); add(btn); btn$add4ction3istener(t#is); } public %oid action.erformed(2ction<%ent e) { txt$set6ext(+?$F$+); } }

&&

Exemplul 8 Adu$m n e!emplul anterior i un $estionar pentru a putea nc*ide fereastra. "entru nc*iderea ferestrei vom folosi o nou clas care implementeaz interfaa 9indoDEistener .FFimplementnd toate metodele acesteia/ sau e!tinde clasa Gindo-2dapter '
class GIandler extends Gindo-2dapter { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } }

Asociem ferestrei acest $estionar adu$nd n constructorul clasei F urmtorul cod


GIandler -# = ne- GIandler(); addGindo-Cistener(-#);

+b#er%aie# "entru nc*iderea ferestrei puteam apela la clase anonime. Astfel, clasa GIandler nu mai era necesara, ci puteam adu$a direct n constructorul clasei F urmtorul cod
addGindo-Cistener( ne- Gindo-2dapter() { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } } ); //clasa anonima

+b#er%aie. 5ste posibil s< ata<m mai muli $estionari unui aceluiai control $rafic( n acest caz, declanarea evenimentului este comunicat tuturor $estionarilor. Aceasta se ntmpl de obicei dac o bun parte dintre aciunile ce trebuie ntreprinse sunt comune. "entru aciunile specifice, trebuie ns s< difereniem ntre controale $rafice. 6ac< controalele $rafice sunt de tipuri diferite, putem folosi metoda'
public ?b8ect 'et&ource()

pentru a identifica sursa. 6ac< controalele $rafice sunt de acelai tip, putem folosi metoda'
public &trin' 'et2ctionCommand()

care ntoarce etic*eta sursei. 6e asemenea, acelai *andler poate fi asociat mai multor controale $rafice.

&)

1uprafee de de#enare. Cla#ele Can"as i 8rap#ics

1uprafeele $rafice ofer facilitatea de control la nivel de pi!el. "e o astfel de suprafa se pot desena, folosind metode ale clasei Jrap#ics, se$mente de dreapt, dreptun$*iuri, ovale etc.( la desenare poate fi aleas o culoare. 6e asemenea contururile nc*ise pot fi GumpluteG cu o culoare. "e o suprafa de desenare mai pot fi plasate i ima$ini, pot fi create propriile butoane etc. lasa Can%as este comple!, nu att direct prin metodele sale, ci mai ales prin posibilitatea de a folosi alte clase ca de e!emplu cele pentru $rafic bi- i tridimensional. 3om reduce ns prezentarea la cteva faciliti mai des folosite. 2odul standard de creare a unei suprafee $rafice const n e!tinderea clasei Can%as, redefinind metoda paint, ce afieaz componenta. 2odificrile ulterioare devin vizibile prin invocarea metodei repaint. # suprafa $rafic reprezint un dreptun$*i de pi!eli, cu colul din stn$a sus avnd coordonatele (:,:). 5ste folosit un context de desenare( nu vom intra n amnunte, ci vom folosi conte!tul de desenare standard disponibil. "entru clasa Can%as precizm doar urmtoarele elemente'
public class Can%as extends Component public Can%as() public paint(Jrap#ics ')

cu meniunea c invocarea metodei paint pune la dispoziie conte!tul de desenare standard '. %aptul c este e!tins clasa Component permite captarea de evenimente specifice acestei clase, ca de e!emplu Fe*, "ouse, "ouse"otion. "rezentm n continuare cteva elemente le$ate de clasa Jrap#ics. Att clasa, ct i metodele sale, au modificatorii public i abstract. 2enionm c un conte!t de desenare are ataate cteva informaii curente, printre care culoarea curent de desenare i fontul curent. 6rept urmare, de e!emplu trasarea unei linii i GumplereaG unui contur se fac folosind culoarea curent.
class Jrap#ics extends ?b8ect Color 'etColor() %oid setColor(Color c)

este obinut, respectiv setat, culoarea curent de desenare(


Font 'etFont() %oid setFont(Font f)

este obinut, respectiv setat, fontul curent(


%oid dra-Cine(int x1, int *1, int x!, int *!)

este trasat un se$ment ntre punctele de coordonate (x1,*1) i (x!,*!)( &,

%oid dra-.ol*line(int() x, int() *, int n)

este trasat o linie poli$onal ce trece, n ordine, prin n puncte ale cror coordonate sunt specificate n tablourile x i *(
%oid dra-Kect(int x, int *, int -, int #)

este trasat un dreptun$*i' colul din stn$a sus are coordonatele (x,*), iar limea i nlimea sa sunt -, respectiv #(
%oid fillKect(int x, int *, int -, int #)

un dreptun$*i specificat ca mai sus este GumplutG cu culoarea curent(


%oid dra-?%al(int x, int *, int -, int #)

este trasat o elips tan$ent la laturile dreptun$*iului precizat(


%oid fill?%al(int x, int *, int -, int #)

este umplut o elips tan$ent la laturile dreptun$*iului precizat. Exemplu 6orim s fi$urm pe ecran puncte din plan .raportate la a!ele de coordinate/ i s unim prin linii puncte consecutiv introduse.
import 8a%a$a-t$*; import 8a%a$a-t$e%ent$*; import 8a%a$io$*; import 8a%a$util$*; class Cinii { public static %oid main(&trin'() ar's) { F f = ne- F(+ 3esen +); f$set&iBe(E::,E::); f$setCocation(L:,L:); f$setDisible(true); } } class F extends Frame { F(&trin' s) { set6itle(s); Jrafic ' = ne- Jrafic(); add('); addGindo-Cistener( ne- Gindo-2dapter() { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } } ); } } class 8rafic extends Can%as { public %oid paint(Jrap#ics ') { '$translate(1::,1::); '$setColor(Color$red); '$dra-Cine(91::,:,1::,:); '$dra-Cine(:,91::,:,1::); '$setColor(Color$0C2CF);

&0

&canner sc=null; tr* { sc = ne- &canner( ne- FileInput&tream(+in$txt+) ); int xa,*a,x,*; xa = "at#$round(!:*sc$nextFloat()); *a = "at#$round(!:*sc$nextFloat()); -#ile( sc$#as=extFloat() ) { x = "at#$round(!:*sc$nextFloat()); * = "at#$round(!:*sc$nextFloat()); '$draw9ect(x,*,1,1); '$dra-Cine(xa,*a,x,*); xa=x; *a=*; } } catc#(File=otFound<xception e) { &*stem$out$println(+Fisier inexistent+); } } } in$txt 91: 91: 91: 94 91 9M 91 1 1: M 1: 9L

1uplimentar
Exemplu =rap*ics)6
import 8a%a$a-t$*;import 8a%a$a-t$e%ent$*;import 8a%a$a-t$'eom$*; class 6est!3 extends Frame{ Can%as!d c!d; 6est!3(){ super(+6est !3+); c!d=ne- Can%as!d(); add(c!d); addGindo-Cistener(ne- Gindo-2dapter(){ public %oid -indo-Closin'(Gindo-<%ent e){ &*stem$exit(:); } }); }

&4

public static %oid main(&trin' ar()){ 6est!3 t=ne- 6est!3(); t$set&iBe(4::,4::); t$setCocation(1::,1::); t$setDisible(true); } } class Can%as!d extends Can%as{ public %oid paint(Jrap#ics '){ 8rap#ics:; ':-(8rap#ics:;)'; 3imension d='et&iBe(); int x1,*1,x!,*!,ctrlx1, ctrl*1, ctrlx!, ctrl*!; x1=1:; *1=1:; x!=d$-idt#91:; *!=1:; 3ine:; l1=ne- Cine!3$3ouble(x1,*1,x!,*!); '!$dra-(l1); 3ine:; l!=ne- Cine!3$3ouble(ne- .oint!3$3ouble(x1,*1 L), ne.oint!3$3ouble(x!,*! L)); ':.draw(l:); x1=L:; *1=L:; x!=d$-idt#9L:; *!=L:; ctrlx1=1::; ctrl*1=1!:; <uadCur"e:; ; = ne- NuadCur%e!3$Float(); ;$setCur%e(x1, *1, ctrlx1, ctrl*1, x!, *!); ':.draw(=); x1=L:; *1=1L:; x!=d$-idt#9L:; *!=1L:; ctrlx1=M:; ctrl*1=E:; ctrlx! =1::; ctrl*!=!M:; CubicCur"e:; c = ne- CubicCur%e!3$3ouble(); c$setCur%e(x1, *1, ctrlx1, ctrl*1, ctrlx!, ctrl*!, x!, *!); ':.draw(c); 8eneralPat# arb&#ape = ne- Jeneral.at#(); arb&#ape$mo%e6o (11:,!L:); arb&#ape$line6o(!::,!L:); arb&#ape$line6o(1E:,1::); arb&#ape$mo%e6o(1L:,1::); arb&#ape$line6o(11:,!L:); arb&#ape$close.at#(); ':.draw(arb&#ape); } }

&7

Cmpuri i arii de text. Cla#ele TextField i Text4rea lasa'


public class 6extComponent extends Component

este superclasa claselor 6extField i 6ext2rea. "rincipalele metode publice ale clasei sunt'
%oid set6ext(&trin' text)

seteaz te!tul afiat de component(


&trin' 'et6ext()

ntoarce te!tul afiat de component(


%oid set<ditable(boolean b)

stabilete dac te!tul ataat componentei este sau nu editabil(


%oid select(int p, int u)

selecteaz subte!tul ce ncepe de pe poziia p i se termin pe poziia u91. :rebuie ca pu( dac p=u, atunci ntre$ te!tul este deselectat(
%oid select2ll()

selecteaz ntre$ te!tul(


&trin' 'et&elected6ext()

ntoarce te!tul selectat(


int 'et&election&tart()

ntoarce poziia de nceput a zonei selectate(


int 'et&election<nd()

ntoarce poziia de sfrit a zonei selectate( Modificarea textului din component declanea un e%eniment de tipul Text.

lasa'
public class TextField extends 6extComponent

ofer faciliti de lucru cu c$mpurile de text, ce permit editarea unei unice linii de te!t. 6intre constructorii clasei amintim
6extField()

construiete un cmp de te!t(


6extField(&trin' text)

construiete un cmp de te!t iniializat cu text(


6extField(int col)

&8

construiete un cmp de te!t cu col coloane(


6extField(&trin' text, int col)

construiete un cmp de te!t cu col coloane, iniializat cu text( 9a acionarea unei ta#te ,n cmpul de text: %a fi declanat un e%eniment de tipul >e/. 9a ap#area ta#tei <*nter e#te declanat un e%eniment de tipul 4ction. lasa'
public class Text4rea extends 6extComponent

ofer faciliti de lucru cu arii de text, care $eneralizeaz cmpurile de te!t prin acceptarea mai multor linii de te!t. 6e fapt este vorba de un unic te!t, n care tastarea lui 5<nter7 pe o poziie are ca efect trecerea la o linie nou, conform noului caracter introdus. "utem ataa ariei o bar de defilare orizontal, una vertical sau ambele aceste bare( utilitatea lor apare atunci cnd te!tul de pe o linie este mai lun$ dect numrul de coloane stabilit pentru arie, respectiv cnd numrul efectiv de linii este mai mare dect numrul de linii stabilit pentru aria de te!t. 3cionarea unei ta#te ,n cmpul de text conduce la declanarea unui e%eniment de tipul >e/. "entru detalii privind cmpurile, constructorii i metodele claselor prezentate consultai documentaia *ttp'@@docs.oracle.com@+avase@8@docs@api@inde!.*tml.

Exemplu 3om afia un cmp de te!t, o arie de te!t i un buton. Ea apsarea tastei 5<nter7 n cmpul de te!t, coninutul su este adu$at ariei de te!t la sfritul acesteia. Ea apsarea butonului, zona selectat din aria de te!t este copiat n cmpul de te!t i la ieirea standard, dup care este eliminat din aria de te!t.
import 8a%a$a-t$*; import 8a%a$a-t$e%ent$*; class 62rea { public static %oid main(&trin'() s) { F f = ne- F(+<xemplu 6ext+); f$set&iBe(!::,!::); f$setCocation(!::,!::);f$setDisible(true); } } class F extends Frame implements 2ctionCistener { 6extField tf; 6ext2rea ta; 0utton b; F(&trin' titlu) {

&>

set6itle(titlu); setCa*out(ne- Flow3a/out()); tf = ne- 6extField(!:); add(tf); tf$add2ctionCistener(t#is); ta = ne- 6ext2rea(L,!:); add(ta); b=ne- 0utton(+<limina+); add(b); b$add2ctionCistener(t#is); addGindo-Cistener( ne- Gindo-2dapter() { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } } ); } public %oid action.erformed(2ction<%ent e) { if(e$'et&ource() instanceof 0utton) { &trin' s = ta$'et&electedText(); &*stem$out$println(s); int p = ta$'et&election&tart(), u = ta$'et&election*nd(); ta$replace9an'e(++,p,u); tf$set6ext(s); } else { ta$append(tf$'et6ext() +On+); tf$set6ext(++); } tf$re;uestFocus(); } }

9i#te de opiuni cu ale-ere unic. Cla#a C#oice lasa'


public class C#oice extends Component

permite crearea unei liste ce poate fi derulat .unui meniu Gpop-upG/ de elemente .itemuri/. 5lementele unei astfel de liste sunt iruri de caractere. Ea fiecare moment de timp, doar unul dintre elementele din list este selectat .de unde i numele de list de opiuni cu ale$ere unic/( elementul selectat apare n titlul listei.

&A

+ aciune a#upra unei li#te de opiuni cu ale-ere unic declanea un e%eniment de tipul %tem. Exemplu Acest e!emplu urmrete prezentarea modului n care apare o list de opiuni cu ale$ere unic i afieaz la ieire elementul selectat, cnd acesta se sc*imb.
import 8a%a$a-t$*; import 8a%a$a-t$e%ent$*; class C#oice3emo extends Frame implements ItemCistener{ C#oice c#; C#oice3emo(){ c# = ne- C#oice(); c#$addItem(+>nu+); c#$addItem(+3oi+); c#$addItem(+6rei+); add(c#); c#$addItemCistener(t#is); addGindo-Cistener( ne- Gindo-2dapter() { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } } ); } public static %oid main(&trin'() s) { Frame f = ne- C#oice3emo(); f$set&iBe(!::,1::); f$setCocation(!::,!::); f$set6itle(+<xemplu C#oice+); f$setCa*out(ne- Flo-Ca*out()); f$setDisible(true); ; } public %oid item&tateC#an'ed(Item<%ent e){ &*stem$out$println(c#$'et&electedItem()); } }

9i#te de opiuni cu ale-ere multipl. Cla#a 3ist

# list de opiuni cu ale$ere multipl permite selectarea a oricte elemente .tot iruri de caractere, ca i n cazul listelor cu ale$ere unic/ din list. 1electarea@ deselectarea se face n mod standard prin clic cu mouse-ul pe elementul respectiv. + aciune a#upra unei li#te cu ale-ere multipl declanea un e%eniment de tipurile %tem i 4ction.

)C

Exemplu 5!emplul i propune doar prezentarea modului n care apare o list de opiuni cu ale$ere multipl.
import 8a%a$a-t$*; class Cist3emo extends Frame { public static %oid main(&trin'() s) { Frame f = ne- Cist3emo(); f$set&iBe(!::,1L:);f$setCocation(!::,!::); f$set6itle(+<xemplu Cist+); f$setCa*out(ne- Flo-Ca*out()); Cist lista = ne- Cist(:,true); lista$add(+>nu+); lista$add(+3oi+); lista$add(+6rei+); f$add(lista); f$setDisible(true); } }

C#ue de opiuni. Cla#ele C#ec?box i C#ec?box8roup

# csu de opiuni .c"eckbox/ este o component simpl care poate fi doar ntr-una dintre strile GselectatG sau GneselectatG.
public class C#ecHbox extends Component

lasa C#ecHbox prevede constructorii'


public C#ecHbox()

creeaz o csu de opiuni fr etic*et ataat( starea csuei este GneselectatG(


public C#ecHbox(&trin' et, boolean stare)

creeaz o csu de opiuni cu etic*eta et( starea csuei este dat de stare. "entru setarea etic*etei csuei va fi invocat metoda'
public %oid setCabel(&trin' label)

+ aciune a#upra unei c#ue de opiuni declanea un e%eniment de tipul %tem. lasa urmtoare'
public class C#ecHboxJroup extends ?b8ect

ofer faciliti pentru $ruparea mai multor csue de opiuni. ntr-un astfel de $rup, la orice moment de timp e!act o csu este n starea GselectatG. Apsarea unei csue face ca ea s devin unica n starea GselectatG. rearea i adu$area unei csue de opiuni la un $rup se realizeaz folosind urmtorul constructor al clasei C#ecH0ox'
public C#ecHbox(&trin' et, C#ecHboxJroup 'rup, boolean stare)

)&

Exemplu 3om construi un cadru format din dou panouri' primul cuprinde trei csue de opiuni independente, iar al doilea cuprinde un $rup de alte trei csue de opiuni'
import 8a%a$a-t$*; import 8a%a$a-t$e%ent$*; class C#H0ox extends Frame { public static %oid main(&trin'() s) { Frame f = ne- C#H0ox(); f$set&iBe(1::,1L:);f$setCocation(!::,!L:); f$addGindo-Cistener( ne- Gindo-2dapter() { public %oid -indo-Closin'(Gindo-<%ent e) { &*stem$exit(:); } } ); f$set6itle(+<xemplul E+); f$setCa*out(ne- Flo-Ca*out()); Panel p1,p!; C#ecHbox cb1,cb!,cb1; // c#ecHbox9uri independente C#ecHbox cb4,cbL,cbE; // exact unul este selectat cb1 = ne- C#ecHbox(); cb1$setCabel(+C#Hbox 1+); cb! = ne- C#ecHbox(+C#Hbox !+); cb!$set&tate(true); cb1 = ne- C#ecHbox(+C#Hbox 1+); p1 = ne- .anel(); p1$add(cb1); p1$add(cb!); p1$add(cb1); C#ecHboxJroup cb' = ne- C#ecHboxJroup(); cb4 = ne- C#ecHbox(+C#Hbox 4+,cb',true); cbL = ne- C#ecHbox(+C#Hbox L+,cb',true); cbE = ne- C#ecHbox(+C#Hbox E+,cb',true); // cbE ramane selectat p! = ne- .anel(); p!$add(cb4); p!$add(cbL); p!$add(cbE); f$add(p1); f$add(p!); f$setDisible(true); } }

cu urmtoarea precizare' cuprinderea unor c#ue ,ntr(un -rup nu are nici o le-tur cu adu-area lor ,ntr(un panou.

))

Вам также может понравиться