Documente Academic
Documente Profesional
Documente Cultură
CURSUL I....................................................................................................5
Instructiuni si expresii.....................................................................................................5
Variabile si tipuri de date................................................................................................5
Tipuri de variabile...........................................................................................................7
Tipuri de clase................................................................................................................8
Comentarii......................................................................................................................8
Literale............................................................................................................................9
Expresii si operatori.....................................................................................................10
Operatii aritmetice........................................................................................................11
Atribuirea unei valori....................................................................................................12
Incrementarea si decrementarea.................................................................................13
Operatori pentru comparatii.........................................................................................13
Operatori logici.............................................................................................................14
Precedenta operatorilor...............................................................................................15
Aritmetica sirurilor........................................................................................................15
CURSUL II.................................................................................................17
Tablouri.........................................................................................................................17
Declararea variabilelor tablou......................................................................................17
Crearea de obiecte tablou............................................................................................17
Accesarea elementelor tabloului..................................................................................18
Modificarea elementelor tablourilor..............................................................................19
Tablouri multidimensionale...........................................................................................20
Instructiuni bloc............................................................................................................20
Instructiunea conditionala if.........................................................................................21
Operatorul conditional..................................................................................................22
Instructiunea switch.....................................................................................................23
Cicluri for......................................................................................................................25
Cicluri while si do.........................................................................................................26
Cicluri while..................................................................................................................26
Cicluri do … while........................................................................................................26
Iesirea fortata din cicluri...............................................................................................27
Cicluri etichetate...........................................................................................................28
CURSUL III................................................................................................29
Programare orientata obiect – object oriented programming (oop)............................29
Obiecte si clase............................................................................................................29
Atribute si comportament.............................................................................................30
Comportamentul unei clase de obiecte.......................................................................30
Crearea unei clase.......................................................................................................31
Organizarea claselor si comportamentul acestora......................................................33
Mostenirea................................................................................................................33
Mostenirea simpla si multipla...................................................................................34
Interfete....................................................................................................................34
Pachete....................................................................................................................35
Crearea unei subclase.............................................................................................35
Obiecte.........................................................................................................................38
Crearea de noi obiecte.............................................................................................38
Gestionarea memoriei..................................................................................................38
Pagina 1
CURSURI JAVA Alex Tabusca
CURSUL IV................................................................................................43
Referinte la obiecte......................................................................................................43
Castingul si conversia obiectelor si tipurilor primitive..................................................44
Castingul intre tipuri primitive...................................................................................44
Castingul obiectelor..................................................................................................45
Conversia tipurilor primitive in obiecte si invers...........................................................45
Compararea valorilor obiectelor si ale claselor............................................................46
Compararea obiectelor................................................................................................46
Determinarea clasei unui obiect..................................................................................47
Inspectarea claselor si a metodelor prin reflexie.........................................................47
Crearea claselor...........................................................................................................48
Definirea claselor......................................................................................................48
Crearea variabilelor de clasa si de instanta.............................................................49
Definirea variabilelor de instanta..............................................................................49
Constante.................................................................................................................49
Variabile de clasa.....................................................................................................49
Crearea metodelor...................................................................................................50
Definirea metodelor..................................................................................................50
Cuvantul cheie this...................................................................................................51
Domeniul de vizibilitate al variabilelor......................................................................52
Transmiterea argumentelor catre metode................................................................52
Metode de clasa.......................................................................................................52
Crearea aplicatiilor java...............................................................................................53
Trasmiterea de argumente aplicatiilor java..................................................................53
CURSUL V.................................................................................................54
Folosirea metodelor pentru indeplinirea sarcinilor.......................................................54
Crearea de metode cu acelasi nume si argumente diferite.........................................54
Metode constructor......................................................................................................57
Metode constructor de baza........................................................................................58
Apelarea unei alte metode constructor........................................................................58
Supraincarcarea metodelor constructor.......................................................................59
Suprascrierea metodelor..............................................................................................59
Crearea de metode care suprascriu metode existente...............................................60
Apelarea metodei originale..........................................................................................61
Suprascrierea constructorilor.......................................................................................62
Metode de finalizare.....................................................................................................63
CURSUL VI................................................................................................64
Crearea de programe interactive pentru web..............................................................64
Diferenta intre applet-uri si aplicatii..............................................................................64
Alegerea versiunii de java pentru dezvoltare...............................................................64
Restrictii de securitate ale applet-urilor........................................................................65
Pagina 2
CURSURI JAVA Alex Tabusca
Crearea applet-urilor....................................................................................................66
Principalele activitati ale applet-urilor..........................................................................66
Realizarea unui applet.................................................................................................68
Inserarea unui applet intr-o pagina web......................................................................69
Transferul de parametri catre applet-uri......................................................................72
Amplasarea applet-urilor in web..................................................................................74
Arhive java...................................................................................................................75
Alte formate de arhivare...............................................................................................76
CURSUL VII...............................................................................................77
Utilizarea claselor legate de grafica, fonturi si culori...................................................77
Clasa graphics..........................................................................................................77
Desenarea si umplerea............................................................................................77
Liniile........................................................................................................................78
Dreptunghiuri............................................................................................................78
Poligoane..................................................................................................................78
Ovale........................................................................................................................80
Arce de cerc.............................................................................................................80
Copierea si stergerea...............................................................................................81
Text si fonturi............................................................................................................82
Crearea obiectelor font............................................................................................82
Desenarea caracterelor si sirurilor...........................................................................82
Aflarea de informatii despre font..............................................................................82
Culori........................................................................................................................83
Folosirea obiectelor color.........................................................................................84
Testarea si stabilirea culorilor curente......................................................................84
Operatii grafice folosind java2d................................................................................85
Spatiul de coordonate al utilizatorului si cel al dispozitivului....................................85
Conversia la un obiect graphics2d..........................................................................85
Specificarea atributelor de randare..........................................................................86
Culori 2d...................................................................................................................86
Modele de umplere...................................................................................................86
Stabilirea unei tuse de desen...................................................................................86
Crearea obiectelor ce vor fi desenate..........................................................................87
Linii...........................................................................................................................87
Dreptunghiuri............................................................................................................87
Elipse........................................................................................................................88
Arce..........................................................................................................................88
Poligoane..................................................................................................................88
Desenarea obiectelor...................................................................................................89
CURSUL VIII..............................................................................................91
Folosirea imaginilor, animatiei si sunetului..................................................................91
Desenarea si reimprospatarea desenului....................................................................91
Pornirea si oprirea executiei appletului........................................................................91
Controlul prin fire de executie......................................................................................91
Efectul de flickering al animatie...................................................................................93
Suprascrierea metodei update()..................................................................................94
Distrugerea contextelor graphics.................................................................................98
Incarcarea si folosirea imaginilor.................................................................................99
Desenarea imaginilor.................................................................................................100
Pagina 3
CURSURI JAVA Alex Tabusca
Folosirea sunetului.....................................................................................................101
CURSUL IX..............................................................................................104
Crearea de interfete grafice pentru appleturi.............................................................104
Awt.............................................................................................................................104
Componentele interfetei grafice.................................................................................104
Adaugarea de componente la un container...............................................................105
Etichete......................................................................................................................105
Butoane......................................................................................................................107
Casete de validare.....................................................................................................107
Liste de optiuni...........................................................................................................109
Campuri de text..........................................................................................................110
Zone de text................................................................................................................111
Liste derulante............................................................................................................112
Bare de scroll.............................................................................................................113
Suprafete de desenare...............................................................................................114
CURSUL X...............................................................................................116
Managementul unei interfete grafice..........................................................................116
Dispunerea componentelor unei interfete..................................................................116
ADMINISTRATORUL DE DISPUNERE SECVENTIALA (flowlayout)........................116
ADMINISTRATORUL DE DISPUNERE TABELARA (gridlayout)..............................117
ADMINISTRATORUL DE DISPUNERE MARGINALA (borderlayout).......................118
Combinarea administratorilor de dispunere...............................................................118
ADMINISTRATORUL DE DISPUNERE IN STIVA (cardlayout).................................119
ADMINISTRATORUL DE DISPUNERE TABELARA NEPROPORTIONALA
(gridbaglayout)...........................................................................................................120
Interactiunea utilizatorului cu un applet.....................................................................124
METODA handleevent().............................................................................................125
Tratarea clicurilor de mouse......................................................................................125
CURSUL XI..............................................................................................130
Tratarea evenimentelor de tastatura..........................................................................130
EVENIMENTELE keydown si keyup..........................................................................130
Taste prestabilite........................................................................................................130
Testarea tastelor shift, control si alt...........................................................................132
Tratarea evenimentelor prin metoda generica...........................................................133
Tratarea evenimentelor componentelor.....................................................................134
Tratarea evenimentelor de actiune............................................................................135
Tratarea evenimentelor de selectare.........................................................................136
Evenimentele zonelor de text....................................................................................137
Evenimente ale listelor derulante...............................................................................137
Evenimente ale barelor de scroll...............................................................................137
Pagina 4
CURSURI JAVA Alex Tabusca
CURSUL I
INSTRUCTIUNI SI EXPRESII
Toate activitatile ce se realizeaza intr-un program Java pot fi rezumate la o serie de instructiuni.
O instructiune (statement) este o comanda simpla, scrisa intr-un limbaj de programare si care
determina o actiune.
Instructiunile sunt actiuni elementare ale unui program Java. Mai jos putem vedem mai multe
exemple de instructiuni Java simple:
int varsta=30;
import java.awt.dnd;
System.out.println(“Text “);
Jucator.scor=45000;
Unele instructiuni produc o valoare, ca in cazul in care se aduna doua numere. Aceste
instructiuni se numesc expresii.
O expresie este o instructiune care are ca rezultat producerea unei valori. Valoarea poate fi
pastrata pentru o folosire ulterioara in program, poate fi folosita imediat intr-o alta
instructiune sau poate fi ignorata. Valoarea produsa de o instructiune este numita
valoare de retur.
Unele expresii produc o valoare de retur numerica, cum ar fi cazul cand se aduna doua numere;
altele produc valori booleene – adevarat sau fals – sau pot produce chiar un obiect Java.
Chiar daca majoritatea programelor Java contin o singura instructiune pe fiecare linie aceasta
este doar o optiune de formatare, care nu stabileste unde incepe si unde se termina o instructiune
ci are scopul principal de a mari lizibilitatea programului.
De fapt, fiecare instructiune Java se termina cu “;”. Intr-o singura linie se pot introduce astfel mai
multe instructiuni fara a determina probleme:
j.culoare=”galben”; j.alegere=false;
Pagina 5
CURSURI JAVA Alex Tabusca
Pentru a crea o variabila trebuie sa ii dati un nume si sa stabiliti ce tip de informatie va stoca. De
asemenea, in momentul crearii puteti sa atribuiti variabilei o valoare initiala.
Exista trei tipuri de variabile in Java: variabile de instanta, variabile de clasa si variabile locale.
Variabilele de clasa definesc atributele unei intregi clase de obiecte si se aplica tuturor
instantelor acesteia.
Cu toate ca aceste trei tipuri de variabile sunt create asemanator, variabilele de clasa si de
instanta sunt folosite intr-un alt mod decat variabilele locale. In continuare vom trata variabilele
locale – celelalte doua tipuri vor fi detaliate mai tarziu.
OBS: Spre deosebire de alte limbaje Java nu are variabile globale (utilizabile in orice parte a
unui program). Variabilele de clasa si de instanta sunt folosite pentru a comunica
informatii despre un obiect sau altul si pot inlocui nevoia de variabile globale.
Inainte de a folosi o variabila in Java trebuie mai intai sa o declaram prin indicarea numelui si a
tipului de informatie pe care il va stoca. Formatul declaratiei este prezentat in continuare,
specificandu-se intai tipul de informatie si apoi numele:
int maxim;
String numeutilizator;
boolean stareTerminare;
Variabilele locale pot fi declarate in orice loc in interiorul unei metode, la fel ca oricare alta
instructiune Java insa trebuie declarate inainte de a fi folosite. In mod normal declararea
variabilelor urmeaza imediat dupa instructiunea care defineste metoda.
Daca vrem sa cream mai multe variabile de acelasi tip le putem declara pe toate in aceeasi
instructiune, separate de “,“:
Variabilelor li se poate atribui o valoare atunci cand sunt create, prin atribuire:
int codposta=7000;
String nume=”Alex”;
boolean alegere=true;
int varsta=50, inaltime=170;
Pagina 6
CURSURI JAVA Alex Tabusca
Dupa cum se poate vedea avem si posibilitatea de a atribui valori mai multor variabile de acelasi
tip. Variabilelor locale trebuie sa li se atribuie valori inainte de a fi folosite in program, altfel
acestea nu se vor compila.
- variabilele numerice:0
- caracterele:“\0”
- variabilele booleene:false
- obiectele:null
Numele variabilelor in Java trebuie sa inceapa cu o litera, cu underscore (“_”) sau cu “ $ “ – ele
nu pot incepe cu o cifra. Dupa primul caracter numele variabilelor poate contine orice
combinatie de cifre si litere.
Trebuie sa retinem ca Java tine cont de litere mari si mici. Din aceasta cauza un program poate
avea doua variabile diferite: una numita X si alta x, sau una alb si alta ALB.
In practica s-a impus o “regula” de denumire a variabilelor Java: numele sunt formate din
cuvinte sugestive iar in cazul in care sunt necesare mai multe cuvinte primul caracter al numelui
este mic iar inceputul fiecarui cuvant este scris cu majuscula , ca in exemplele de mai jos:
Button incarcaFisier;
int codZona;
boolean definesteScorMaxim;
TIPURI DE VARIABILE
Dupa cum am vazut, declaratia de variabila contine, in afara numelui, si tipul informatiei stocate.
Acest tip poate fi:
In continuare prezentam tipurile de date de baza ale limbajului. Exista opt tipuri de baza pentru
stocarea intregilor, numerelor in virgula mobila, caracterelor si valorilor booleene. Aceste tipuri
mai sunt cunoscute si ca tipuri primitive deoarece fac parte integranta din limajul Java si nu sunt
obiecte, lucru care le face mai eficient de folosit. Aceste tipuri de date au aceeasi dimensiune si
caracteristici indiferent de sistemul de operare si de platforma folosita – spre deosebire de alte
tipuri de date din alte limbaje de programare.
Toate aceste tipuri sunt cu semn ceea ce inseamna ca pot stoca numere pozitive sau negative.
Tipul folosit pentru o variabila depinde de domeniul de valori de care este nevoie.
Pagina 7
CURSURI JAVA Alex Tabusca
Un alt tip de numar ce poate fi stocat este cel reprezentat in virgula mobila; pentru acestea exista
tipurile float si double. Numerele in virgula mobila sunt numerele care au o parte zecimala. Tipul
float este suficient in majoritatea cazurilor, pastrand numere intre 1,4E-45 si 3,4E38. Daca este
totusi necesar se poate folosi tipul real double ce poate stoca numere intre 4,9E-324 si 1,7E308.
Tipul char este folosit pentru caracterele individuale, cum ar fi litere, cifre, semne de punctuatie
si alte simboluri.
Ultimul dintre cele opt tipuri de baza este boolean. Spre deosebire de alte limbaje valorile pentru
variabilele de acest tip nu sunt 1 si 0 ci true si false.
Toate tipurile de variabile prezentate folosesc litere mici si asa trebuie folosite in cadrul
programelor. Exista clase care au aceleasi nume cu acestea, dar incep cu litera mare – de
exemplu Boolean sau Char. Aceste clase au alt rol in programarea Java astfel incat trebuie
folosite diferit de tipurile de baza.
TIPURI DE CLASE
In afara celor opt tipuri de baza o variabila poate fi de tip clasa:
String numeDeFamilie=”Popescu”;
Culoare par;
Atunci cand o variabila are drept tip o clasa inseamna ca variabila refera un obiect al clasei
respective sau al uneia dintre subclasele sale. Referirea la o superclasa ca tip de variabila este
folositoare atunci cand variabila poate fi una dintre mai multe subclase diferite.
Declararea unei variabile de tip Object inseamna ca poate stoca orice obiect.
OBS: Java nu are un echivalent al instructiunii typedef din C. Pentru a declara noi tipuri in Java
se declara o noua clasa iar variabilele pot folosi aceasta clasa drept tip.
idCod=8546;
imbracatRapid=false;
COMENTARII
Una dintre metodele cele mai importante de crestere a lizibilitatii unui program este folosirea
comentariilor.
Comentariile reprezinta informatii introduse intr-un program doar in ajutorul persoanelor care
incearca sa-si dea seama ce anume se intampla in program. Compilatorul Java
ignora total comentariile atunci cand pregateste versiunea executabila a fisierului
sursa Java.
Exista trei tipuri diferite de comentarii pe care le putem utiliza in programele Java.
Pagina 8
CURSURI JAVA Alex Tabusca
Daca dorim sa introducem un comentariu care ocupa mai mult de un rand trebuie sa incepem cu
combinatia “/*“ si sa incheiem cu combinatia “*/“.
Ultimul tip de comentariu este proiectat pentru a fi interpretabil si de catre calculator. Daca
incepem comentariul cu “/**“ si il incheiem cu “*/“ atunci comentariul este interpretat ca
reprezentand documentatia originala referitoare la functionarea clasei si a metodelor sale
publice.
Acest tip de comentariu poate fi citit de utilitare ca JAVADOC din pachetul JDK. Acest utilitar
foloseste aceste comentarii pentru a crea un set de pagini web care documenteaza programul,
ierarhia sa de clase si metodele.
LITERALE
Literalele sunt numerele, textul si alte informatii care reprezinta direct o valoare.
Mai explicit, literalele reprezinta un termen apartinand programarii, care inseamna de fapt ca
ceea ce tastam este ceea ce vom obtine.
Java are mai multe literale pentru intregi. Numarul 4 de exemplu este un literal pentru tipul int.
El poate fi atribuit de asemenea variabilelor byte sau short deoarece el este suficient de “mic” si
pentru aceste doua tipuri. Un literal intreg mai mare decat poate stoca o variabila int este
considerat automat ca avand tipul long. Putem indica faptul ca un literal este un intreg de tip long
prin adaugarea sufixului L (sau l). De exemplu urmatoarea instructiune stocheaza valoarea 4 intr-
un intreg de tip long:
long totalPagini=4L;
Pentru a reprezenta o valoare negativa putem folosi literalul impreuna cu semnul minus (“–“).
In Java putem folosi si literali in sistem octal sau hexazecimal. Pentru a folosi un literal intreg in
octal trebuie sa il prefixam cu cifra 0; numarul octal 777 trebuie astfel scris ca 0777. Intregii
hexazecimali se folosesc prefixati cu 0x – ca de exemplu 0xFF.
Literalele in virgula mobila folosesc caracterul punct pentru punctul zecimal. Toate literalele in
virgula mobila sunt automat considerate de tip double. Pentru a specifica tipul float adaugam F
(sau f) – ca mai jos:
float valoarePi=3.1415F;
Putem folosi si exponenti in literalele de virgula mobila folosind litera E (sau e) urmata de
exponent:
double x=12e22;
double y=19E-70;
Literalele caracter sunt exprimate printr-un singur caracter incadrat de ghilimele simple: ‘a’, ‘#’
sau ‘3’.
Unele caractere literale reprezinta caractere care nu sunt tiparibile sau accesibile pe tastatura.
Mai jos vom vedea coduri speciale care pot reprezenta aceste caractere speciale:
Pagina 9
CURSURI JAVA Alex Tabusca
In cazul ultimelor trei coduri se va inlocui in practica semnul “ _ “ cu un numar sau o cifra
hexazecimala.
Ultimele literale pe care le putem folosi intr-un program Java sunt sirurile de caractere. Un sir
(string) in Java este un obiect si nu un tip de date primar. Sirurile nu sunt pastrate in tablouri (ca
in C de exemplu). Deaorece sirurile sunt obiecte Java avem si metode care pot fi folosite pentru
combinarea si modificarea sirurilor precum si pentru a determina daca doua siruri au aceeasi
valoare.
Literalele sir constau dintr-o serie de caractere incadrate intre ghilimele duble:
TM “
In ultima instructiune, secventa \u2122 produce simbolul “ (pe sistemele configurate sa
suporte Unicode).
Atunci cand se foloseste un literal sir, Java stocheaza valoarea sa ca obiect String. Nu trebuie sa
cream explicit un nou obiect – ca in cazul celorlalte obiecte cu care vom lucra – deci este la fel
de usor de lucrat cu acest tip ca si cu tipurile primare. Sirurile sunt diferite in ceea ce priveste
acest aspect – nici unul dintre tipurile primare nu sunt pastrate ca obiecte atunci cand sunt
folosite.
EXPRESII SI OPERATORI
O expresie reprezinta o instructiune care produce o valoare. Cele mai folosite expresii sunt cele
matematice – ca in continuare:
int x=3;
int y=4;
int z=x*y;
Pagina 10
CURSURI JAVA Alex Tabusca
Ultima instructiune dintre cele de mai sus este o expresie. Operatorul de multiplicare * este
folosit pentru inmultirea dintre x si y iar rezultatul produs de expresie va fi pastrat intr-o variabila
z de tip intreg.
Valoarea produsa de o expresie este numita si valoare de retur. Aceasta valoare poate fi atribuita
unei variabile si folosita in diferite feluri in programele noastre.
OPERATII ARITMETICE
In Java exista cinci operatori folositi pentru operatiile aritmetice de baza:
“+“ Adunare
“–“ Scadere
“*“ Inmultire
“/“ Impartire
“% “ Modulo
Fiecare operator de mai sus foloseste cate doi operanzi – cate unul de fiecare parte a
operatorului. Operatorul de scadere “ – “ poate fi folosit si pentru a nega un singur operator.
Un lucru care merita atentie sporita in ceea ce priveste operatorul de impartire este tipul
operanzilor folositi. Daca stocam rezultatul unei impartiri intr-un intreg acesta va fi truncat la un
numar intreg pentru ca tipul int nu poate lucra cu valori in virgula mobila. De exemplu expresia
21 / 5 are rezultatul 4 daca acesta este stocat intr-un int.
Mai jos avem prezentat un exemplu care integreaza folosirea tuturor operatorilor aritmetici:
class Amoeba {
public static void main (String argumente[]) {
int x=6;
short y=4;
float a=.12f;
System.out.println("ati inceput cu " + x + " amoebe");
System.out.println("\tDoua s-au casatorit si partenerii lor s-au mutat la
ele.");
x=x+2;
System.out.println("Aveti acum " + x);
System.out.println("\tSe declanseaza mitoza, care dubleaza numarul de
amoebe.");
x=x*2;
System.out.println("Avem acum " + x);
System.out.println("\tIncepe o lupta. " + y + " amoebe pleaca.");
x=x-y;
System.out.println("Avem acum " + x);
Pagina 11
CURSURI JAVA Alex Tabusca
Comentand pe scurt aceasta aplicatie Java extrem de simpla observam ca in liile 3-5 se creaza
trei variabile ce primesc in acelasi timp si valori initiale; variabilele x si y sunt declarate de tipul
int iar variabila a este declarata numar in virgula mobila float – deoarece tipul predefinit in Java
pentru numere in virgula mobila este double trebuie sa adaugam sufixul f la sfarsitul literalului
pentru a indica (si forta) tipul float.
In cadrul programului apare in mai multe instructiuni sintagma “ System.out.println “; aceasta
metoda este folosita in aplicatii pentru a afisa siruri si in general informatii pe dispozitivul
standard de iesire – in cele mai multe cazuri ecranul.
System.out.println() preia un singur argument (intre paranteze): un sir. Pentru a prezenta mai
mult de o variabila sau un literal ca argument pentru println() se poate folosi operatorul +, pentru
a concatena aceste elemente intr-un singur sir.
x=y=z=10;
Rezultatul acestei instructiuni este initializarea celor trei variabile cu valoarea 10. Partea din
dreapta a unei expresii de atribuire este intotdeauna calculata inainte de a avea loc atribuirea
propriu-zisa. Acest lucru face posibila folosirea unei expresii de felul urmator:
int x=5;
x=x+2;
Logic se calculeaza intai x+2, rezultatul fiind 7 si apoi aceasta valoare este atribuita variabilei x.
Atribuirea este operatia cea mai des intalnita in programare si in consecinta au aparut mai multi
operatori speciali pentru diferite cazuri de atribuire. Mai jos vom vedea operatorii de atribuire
speciali precum si echivalentele functionale ale acestora:
X+=Y X=X+Y
X-=Y X=X-Y
X*=Y X=X*Y
X/=Y X=X/Y
Acesti operatori de atribuire sunt echivalenti perfect cu instructiunile pe care le inlocuiesc dar
trebuie avuta mare atentie la utilizarea lor; in cazul folosirii acestor operatori in cadrul unor
expresii mai complexe exista cazuri in care acesti operatori nu mai sunt echivalenti. Ca exemplu
putem lua situatia urmatoare:
X=20; Y=5;
Pagina 12
CURSURI JAVA Alex Tabusca
X=X/Y+5; si
X/=Y+5;
Rezultatele celor doua instructiuni vor fi diferite: in primul caz rezultatul va fi 9 iar in cel de-al
doilea 2.
INCREMENTAREA SI DECREMENTAREA
O alta operatie uzuala in programare este adaugarea sau scaderea unei unitati dintr-o variabila
intreaga. Exista operatori speciali pentru aceste expresii – operatori numiti de incrementare si
decrementare.
Operatorul de incrementare este “ ++ “ iar cel pentru decrementare este “ – “. Acesti operatori
sunt plasati imediat inainte sau dupa numele unei variabile :
int X=7;
X=X++;
In cazul in care operatorii de incrementare sau decrementare sunt plasati inaintea variabilei
atunci ei se numesc operatori prefix iar in cazul in care apar dupa variabila se numesc
operatori sufix.
Intr-o expresie simpla, de exemplu variabila--, folosirea unui operator prefix sau sufix nu
schimba rezultatul. Atunci cand operatiunile de incrementare sau decrementare fac parte dintr-o
expresie mai complexa optiunea intre prefix si sufix devine importanta.
int x, y, z;
x=42; y=x++; z=++x;
Aceste doua expresii produc rezultate diferite din cauza diferentelor intre operatorii sufix si
prefix. Atunci cand folosim operatori sufix, ca in “y=x++”, variabila y primeste valoarea lui x
inainte ca aceasta sa creasca cu 1 astfel incat y va fi egal cu 42; la folosirea operatorilor prefix,
ca in “z=++x”, variabila x este mai intai incrementata si apoi valoarea sa este atribuita lui y,
astfel incat z va avea valoarea 44.
Ca si incazul operatorilor speciali de atribuire trebuie avuta mare grija in cazul folosirii
operatorilor de incrementare si decrementare in cazul unor expresii mai complexe – existand
posibilitatea introducerii unei erori destul de greu de depistat in cadrul programului.
Pagina 13
CURSURI JAVA Alex Tabusca
Acesti operatori sunt folositi in expresii care intorc valori booleene (true sau false), in functie de
valoarea de adevar a comparatiei.
In cele ce urmeaza prezentam operatorii de comparatie uzitati in Java:
boolean tanar;
int varsta=41;
tanar=varsta<35;
Expresia varsta<35 produce rezultatul true sau false (in cazul nostru false) in functie de valoarea
variabilei varsta. In final valoarea variabilei “ tanar “ va fi astfel false.
OPERATORI LOGICI
Expresiile care produc valori booleene (cum ar fi comparatiile) pot fi combinate pentru a forma
expresii mai complexe. Acest lucru poate fi realizat folosind operatorii logici. Acesti operatori
pot fi folositi pentru combinatii logice AND (si), OR (sau), XOR (sau exclusiv) si NOT (negare).
Pentru combinatiile AND se folosesc operatorii logici “&” si “&&”. Atunci cand doua expresii
booleene sunt conectate prin operatorii “&” sau “&&” expresia combinata returneaza valoarea
true doar daca ambele expresii booleene au valoarea true.
Diferenta intre “&” si “&&” consta in modul in care Java evalueaza expresia combinata. Daca se
foloseste “&” atunci se evalueaza ambele expresii indiferent de valoarea lor. Daca se foloseste
“&&” si expresia din stanga operatorului are valoarea de adevar false atunci expresia din dreapta
operatorului nu mai este evaluata deoarece rezultatul final va fi oricum false.
Pentru combinatiile OR se folosesc operatorii “|” sau “||”. Aceasta combinatie de expresii
intoarce valoarea true daca cel putin una dintre expresiile booleene este adevarata.
In cazul folosirii operatorului “||”, daca prima expresie booleena are valoarea true atunci a doua
nici nu se mai evalueaza, rezultatul final fiind oricum true.
Combinatia XOR foloseste un singur simbol: “^“. Acesta are ca rezultat o valoare true numai
daca ambele expresii booleene pe care le combina au valori diferite. In cazul in care ambele
expresii au valoarea true sau ambele false atunci rezultatul va fi false.
Combinatia NOT foloseste operatorul logic “!“, urmat de o singura expresie. Acesta schimba
valoarea unei expresii booleene in acelasi fel in care simbolul “–“ schimba semnul pozitiv sau
negativ al unui numar.
Pagina 14
CURSURI JAVA Alex Tabusca
PRECEDENTA OPERATORILOR
Atunci cand intr-o expresie se folosesc mai multi operatori, Java are stabilita o anumita ordine in
care ii evalueaza. In majoritatea cazurilor aceasta precedenta determina valoarea finala a
expresiei.
Daca doua operatii au aceeasi precedenta, cea aflata mai in stanga expresiei va fi calculata prima.
In tabelul de mai jos avem prezentata precedenta operatorilor:
In cazul in care nu suntem siguri de precedenta diferitiolor operatori cea mai buna solutie este
folosirea parantezelor pentru a impune precedenta dorita.
ARITMETICA SIRURILOR
Operatorul “+“ este folosit nu doar pentru calcule matematice ci si pentru a concatena siruri.
Operatorul “+“ concateneaza siruri, alte obiecte si variabile pentru a forma un singur sir.
Pentru a adauga ceva la sfarsitul unui sir se poate folosi si operatorul “+=“, ca in exemplul
urmator:
Pagina 15
CURSURI JAVA Alex Tabusca
numeleMeu=numeleMeu + “ Jr.”;
Pagina 16
CURSURI JAVA Alex Tabusca
CURSUL II
TABLOURI
Tablourile reprezinta o modalitate de a pastra o lista de elemente cu aceleasi tipuri de date
primitive sau de clase. Fiecare element al listei este pastrat intr-o locatie proprie, numerotata
astfel incat informatia poate fi usor accesata.
Tablourile pot contine orice tip de informatie pastrata in mod normal intr-o variabila, insa, o data
creat, tabloul nu poate fi folosit decat pentru acel tip de date. De exemplu, putem avea un tablou
de intregi, un tablou de obiecte String sau un tablou de tablouri insa nu putem avea un tablou
care sa contina atat siruri cat si intregi.
Exemplu:
String cuvinte[];
Point lovituri;
int salariu[];
String[] cuvinte;
Point[] lovituri;
int[] salariu;
Pagina 17
CURSURI JAVA Alex Tabusca
Deoarece tablourile sunt obiecte Java putem folosi operatorul “new” pentru a crea o noua
instanta a unui tablou:
Aceasta instructiune creaza un tablou de siruri cu 10 pozitii, care poate contine obiecte String.
Atunci cand cream un obiect tablou folosind operatorul “new”, trebuie sa indicam cate pozitii
urmeaza sa contina acesta. Aceasta instructiune nu introduce nici un fel de obiecte String pe
aceste pozitii.
Obiectele tablou pot contine si tipuri primitive cum ar fi intregi sau valori booleene, nu numai
obiecte:
Atunci cand cream un obiect tablou folosind operatorul “new” toate pozitiile sale vor fi
initializate automat (cu 0 cele numerice, cu false pentru boolean, cu ‘/0’ pentru tipul caracter si
cu null pentru obiecte).
OBS: null nu este echivalent cu zero sau cu caracterul “/0”, ca in cazul limbajului C.
Putem crea si initializa un tablou in acelasi timp. In loc sa folosim operatorul “new” pentru a
crea noul obiect tablou includem elementele tabloului intre {}, separate prin virgula:
Fiecare dintre elementele dintre acolade trebuie sa fie de acelasi tip cu variabila tablou. Atunci
cand cream un tablou cu valori initiale in acest fel, tabloul are dimensiunea egala cu numarul de
elemente incluse. Exemplul anterior creaza un tablou de obiecte String, denumit nume, care
contine trei elemente.
scorParticipant[40]=500;
Toate pozitiile unui tablou sunt verificate daca se incadreaza in limitele tabloului asa cum s-au
specificat la crearea tabloului.In Java este imposibil sa accesam sau sa atribuim o valoare unei
pozitii a tabloului aflata in afara limitelor sale, problema care aparea in C de exemplu.
Pagina 18
CURSURI JAVA Alex Tabusca
Un program care foloseste aceste doua linii de cod va da eroare de compilare la folosirea
variabilei vorbitor[10].Eroarea apare din cauza ca tabloul nostru nu poseda pozitia a zecea.
Pentru a evita in programe depasirea accidentala a sfarsitului tabloului putem folosi o variabila
de instanta length – disponibila pentru toate obiectele tablou, indiferent de tip:
int lungime=lungime.length;
noteleMele[4]=10;
propozitai[0]=”Aici”;
propozitia[10]=propozitia[0];
Un lucru important de retinut este ca un tablou de obiecte, in Java, este un tablou de referinte la
obiectele respective.Atunci cand atribuim o valoare unei pozitii dintr-un astfel de tablou nu se va
copia valoarea dintr-o pozitie in alta ci se va atribui referinta.In schimb, tablourile de tipuri de
date primitive copiaza valorile dintr-o locatie in alta.
Tablourile sunt relativ simplu de creat si modificat insa ofera foarte multe avantaje si sunt foarte
utile in Java.
Pagina 19
CURSURI JAVA Alex Tabusca
In acest program cream o clasa TestTablou, cu doua variabile de instanta care pastreaza tablouri
de obiecte String.Primul, prenume, este declarat si initializat in linia 3 pentru a contine patru
siruri.A doua variabila, numeDeFamilie, este declarata si creata in linia 4, insa nu contine nici o
valoare initiala.Tabloul acesta are acelasi numar de pozitii ca si tabloul prenume, deoarece
foloseste valoarea prenume.length.Atunci cand este folosita pentru un obiect tablou, variabila de
instanta length intoarce numarul de pozitii din tablou.
Metoda main creaza o instanta initiala a clasei TestTablou (in linia 22) asa incat sa I se poata
folosi variabilele si metodele de instanta.
Linia 23 apeleaza metoda afiseazaNume(), pentru a prezenta cum arata initial obiectul.Rezultatul
este dat in primele patru linii afisate.
Liniile 25 – 28 seteaza valorile fiecarei pozitii din tabloul numeDeFamilie.
Linia 29 apeleaza inca o data metoda afiseazaNume() pentru a arata noile valori din tabloul
numeDeFamilie.
TABLOURI MULTIDIMENSIONALE
Dimensiunile multiple ale unui tablou sunt folositoare atunci cand reprezentam de exemplu un
table x,y de elemente ale unui caroiaj.
Java nu suporta tablourile multidimensionale, insa obtine acelasi efect prin declararea unui
tablou de tablouri.Acele Tablouri pot contine si ele tablouri si asa mai departe, pana cand este
obtinut numarul de dimensiuni dorit.
INSTRUCTIUNI BLOC
Instructiunile din Java sunt grupate in blocuri.Inceputul si sfarsitul unui bloc sunt notate cu
acolade {}.
Blocurile sunt denumite si instructiuni bloc, deoarece un bloc poate fi folosit oriunde poate fi
folosita o instructiune simpla.Fiecare instructiune din cadrul blocului se executa secvential.
Blocurile pot fi plasate si in cadrul altor blocuri, asa cum se procedeaza la introducerea unei
metode in cadrul unei definitii de clasa.
Un lucru de retinut referitor la blocuri este acela ca ele creaza un domeniu de vizibilitate pentru
variabilele locale create in cadrul blocului.
Domeniu de vizibilitate este un termen folosit in programare pentru a denumi acea parte a
programului in care o variabila exista si poate fi folosita.Daca programul paraseste domeniul de
vizibilitate al unei variabile, aceasta nu mai exista si incercarea de a o accesa va da nastere unei
erori.
Pagina 20
CURSURI JAVA Alex Tabusca
Domeniul de vizibilitate al unei variabile este blocul in care a fost creata.Atunci cand cream si
folosim variabile locale in cadrul unui bloc, aceste variabile isi inceteaza existenta dupa ce blocul
isi termina executia.
In exemplul anterior exista doua variabile definite in cadrul acestei metode: x si y. Domeniul de
vizibilitate al variabiley y este blocul in care se afla; ea poate fi folosita doar in cadrul acestui
bloc. Daca am incerca sa o folosim oriunde in alta parte a metodei testBloc() vom obtine o
eroare. Variabila x a fost creata in interiorul metodei, insa in afara blocului interior, deci poate fi
folosita in orice alta parte a metodei. Putem modifica valoarea lui x oriunde in cadrul metodei.
INSTRUCTIUNEA CONDITIONALA IF
Unul dintre aspectele cheie ale programarii este posibilitatea unui program de a decide ce va
face. Acest lucru este tratat printr-un tip special de instructiuni denumite instructiuni
conditionale.
Cea mai des folosita instructiune conditionala este IF (daca).Aceasta foloseste o expresie
booleana pentru a decide daca o instructiune va fi sau nu executata.Daca expresia intoarce
valoarea true instructiunea se va executa.
01: if (varsta>50)
02: System.out.println(“Nu mai esti chiar tanar”);
Daca dorim ca atunci cand expresia IF intoarce valoarea false sa se execute totusi ceva folosim
cuvantul cheie optional else.
01: if (alegere==true)
02: restaurant=”President”;
03: else
04: restaurant=”Lido”;
Expresia IF executa instructiuni diferite in functie de rezultatul unei singure testari booleene.
OBS:Testul instructiunii IF in Java trebuie sa returneze o variabila booleana (true sau false) ; in
C testul poate returna un intreg.
if (alegere==true)
Pagina 21
CURSURI JAVA Alex Tabusca
if (alegere)
In continuare vom vedea un exemplu complet de aplicatie Java care se bazeaza pe folosirea
testului IF:
“Nucleul” clasei TestParitate este metoda verificareParitate() – liniile 3-8 – in care valorile sunt
testate si se tipareste mesajul corespunzator.Metoda incepe prin tiparirea valorii care i-a fost
transmisa.Argumentul este apoi testat folosind o instructiune conditionala IF, pentru a verifica
daca un numar este par.
Metoda main() a aplicatiei creaza o noua instanta a clasei TestParitate si o testeaza apeland
metoda verificareParitate() de mai multe ori, cu diferite valori.
OPERATORUL CONDITIONAL
O alternativa viabila in practica este folosirea intr-o instructiune conditionala, in locul cuvintelor
cheie IF si ELSE a operatorului conditional (numit si operator ternar – deoarece are trei termeni).
Operatorul conditional este o expresie, ceea ce inseamna ca intoarce o valoare, spre deosebire de
mai generalul IF care are ca rezultat doar executarea unei instructiuni.Operatorul conditional este
mai util pentru instructiuni conditionale scurte sau simple, ca in exemplul urmator:
test?rezultat_adevarat:rezultat_fals;
test este o expresie care intoarce true sau false, la fel ca testul din instructiunea IF.Daca testul
este adevarat (true) operatorul conditional intoarce valoarea rezultat_adevarat iar daca este fals
returneaza rezultat_fals.
Mai jos putem vedea un exemplu practic:
int celMaiBunScor=scorulMeu>scorulTau?scorulMeu:scorulTau;
int celMaiBunScor;
if (scorulMeu>scorulTau) celMaiBunScor=scorulMeu;
Pagina 22
CURSURI JAVA Alex Tabusca
else celMaiBunScor=scorulTau;
Operatorul conditional are o precedenta foarte scazuta – este de obicei evaluat dupa toate
subexpresiile sale.Singurii operatori care au precedenta mai mica sunt cei de atribuire.
INSTRUCTIUNEA SWITCH
O operatie des intalnita in orice limbaj este compararea unei variabile cu o anumita valoare, apoi
compararea cu o alta in caz ca nu se potriveste cu prima si asa mai departe.Acest proces poate
deveni destul de dificil daca s-ar folosi doar instructiuni IF, in functie de diversitatea valorilor pe
care trebuie sa le comparam.De exemplu putem ajunge la un set de instructiuni de genul:
if (oper==’+’) adunaArg(arg1,arg2);
else if (oper==’-‘) scadeArg(arg1,arg2);
else if (oper==’*’) inmultireArg(arg1,arg2);
else if (oper==’/’) imparteArg(arg1,arg2);
Folosirea IF-ului in acest caz este o imbricare deoarece fiecare instructiune else contine o alta if
pana se fac toate testele posibile.
Un mecanism prescurtat pentru aceste instruciuni IF imbricate, care poate fi folosit in unele
limbaje de programare, este gruparea testelor si actiunilor intr-o singura instructiune.In Java
putem grupa actiunile – ca si in C – folosind instructiunea SWITCH.
01: switch(nota) {
02: case 10: System.out.println(“Foarte bine”); break;
03: case 8: System.out.println(“Bine”);break;
04: case 5: System.out.println(“Ai trecut”);break;
05: default: System.out.println(“4 - ai cazut”);
06: }
Implementarea Java a instructiunii SWITCH este oarecum limitata – testele si valorile pot fi doar
tipuri primitive simple ce pot fi convertite in int.Intr-o asemenea instructiune nu se pot folosi
tipuri primitive de dimensiuni mai mari – large sau float – siruri sau alte obiecte si nici nu se pot
testa alte relatii in afara de cea de egalitate.Aceste restrictii limiteaza folosirea SWITCH la cazuri
relativ simple.In schimb instructiunile IF imbricate pot fi folosite pentru orice tip de testare.
Trebuie sa mentionez ca dupa o instructiune case putem include oricate instructiuni fara a fi
necesare acoladele (ca in cazul lui IF).
Instructiunea break forteaza iesirea din instructiunea SWITCH la gasirea unei potriviri de
valoare.Exista posibilitatea nefolosirii acestei instructiuni – caz in care programul executa mai
departe instructiunile pana intalneste un break sau pana la sfarsitul instructiunii
switch.Instructiunea break intrerupe executia in punctul curent si face un salt la codul aflat
dincolo de urmatoarea acolada inchisa }.
Pagina 23
CURSURI JAVA Alex Tabusca
Avantajul nefolosirii lui break apare atunci cand se doreste executarea acelorasi instructiuni
pentru mai multe valori.Pentru aceasta se folosesc mai multe linii case fara instructiuni ; astfel,
switch va executa primele instructiuni pe care le va intalni.De exemplu, in urmatoarea
instructiune switch sirul ‘x este un numar par’ este afisat doar daca x are una dintre valorile 2, 4,
6 sau 8.Toate celelalte valori ale lui x duc la afisarea textului default:
01: switch(x) {
02: case 2:
03: case 4:
04: case 6:
05: case 8:
06: system.out.println(“x este un numar par”);
07: break;
08: default: System.out.println(“x nu este par”);
09: }
In cele ce urmeaza vom detalia inca un exemplu care foloseste instructiunea SWITCH.Aceasta
clasa converteste valorile intregi in cuvintele ce le denumesc.
Instructiunea switch preia un argument intreg care este transmis metodei conversieNumar() care,
daca gaseste o potrivire, intoarce valoarea corespunzatoare sub forma de sir.
Nu este nevoie de instructiuni break in CititorNumere deoarece se foloseste in schimb
instructiunea return.Aceasta este asemanatoare cu break, deosebirea fiind ca return iese definitiv
din metoda si returneaza o valoare.
CICLURI FOR
Ciclurile for repeta o instructiune de un numar specificat de ori, pana in momentul cand se
intalneste o conditie.Chiar daca sunt folosite de obicei pentru simple iteratii, in care o
instructiune este repetata de un numar de ori, ciclurile for pot fi folosite pentru orice tip de
operatii repetitive.
Ciclul for arata in Java ca mai jos:
Pagina 24
CURSURI JAVA Alex Tabusca
instructiune; }
In exemplul de mai jos putem vedea o instructiune for care atribuie tuturor pozitiilor unui tablou
String valoarea Dl.:
Elementul final al instructiunii for este expresia i++ ; aceasta face ca indexul ciclului sa fie
incrementat cu 1 la fiecare parcurgere a ciclului.Fara aceasta instructiune ciclul nu s-ar incheia
niciodata.
Trebuie mentionat un aspect destul de frecvent intalnit si generator de erori: nu se pune ; dupa
paranteza ) ciclului for:
for (i=0;i<10;i++;
x=x*i;
In exemplul de mai sus ciclul for se incheie dupa primul semn ;, fara a se executa instructiunea
x=x*i ca parte a ciclului.Aceasta eroare poate fi greu de depistat pentru ca nu apare ca o eroare la
compilare – ea este o eroare logica a programatorului.
CICLURI WHILE si DO
Ca si ciclurile for, ciclurile while si do permit executarea unui bloc de cod Java pana in
momentul cand se indeplineste o anumita conditie.Folosirea ciclurilor for, while sau do este de
multe ori o problema doar de stil.Ciclurile while si do sunt identice cu cele din C, cu exceptia
faptului ca testul trebuie sa foloseasca o conditie booleana.
CICLURI WHILE
Ciclul while este folosit pentru a repeta o instructiune atata timp cat o anumita conditie este
adevarata (true).
Pagina 25
CURSURI JAVA Alex Tabusca
In exemplul anterior conditia care insoteste cuvantul cheie while este o expresie booleana,
i<10.Daca expresia returneaza true ciclul executa corpul sau si apoi testeaza din nou
conditia.Acest proces se repeta pana cand conditia ia valoarea false.
Programul declara doua tablouri – tablou1 este un tablou de intregi, initializat cu cateva
numere.tablou2 este un tablou de numere in virgula mobila, care are aceleasi dimensiuni cu
tablou1, insa nu are valori initiale.
Programul parcurge apoi iterativ tablou1 afisand valorile din toate pozitiile acestuia ; in
continuare programul verifica valorile din tablou1 si in cazul in care sunt diferite de 1 le
transforma in numere reale si le inscrie in tablou2.
CICLURI DO … WHILE
Acest ciclu este foarte asemanator cu whie – diferenta majora este locul unde se face testarea
conditiei in ciclu.Un ciclu while testeaza conditia inainte de ciclu si astfel daca avem valoarea
false corpul ciclului nu va fi deloc executat.Un ciclu do executa corpul sau cel putin o data
inainte de a testa conditia, deci daca aceasta are valoarea false la prima testare corpul ciclului se
va fi executat deja o data.
do {
x=x*i++;
}
while (i<10);
Pagina 26
CURSURI JAVA Alex Tabusca
Am intalnit deja break in paginile anterioare – break oprea executia instructiunii switch iar
programul continua cu codul urmator instructiunii switch.Cuvantul cheie break, folosit intr-un
ciclu, face acelasi lucru – inceteaza imediat executia ciclului curent.Daca exista cicluri imbricate
in cadrul altor cicluri executia continua cu urmatoarea iteratie a ciclului din exterior.Astfel,
programul continua executia urmatoarei instructiuni aflata dupa ciclu.
Sa revenim la exemplul ciclului while care copia elementele unui tablou de intregi intr-un tablou
de numere in virgula mobila pana cand se intalnea valoarea 1.Putem testa aceasta conditie in
cadrul corpului ciclului while, dupa care folosim instructiunea break pentru a parasi ciclul:
int index=0;
while (index<tablou1.length) {
if (tablou1[index]==1) break;
tablou2[index]=(float) tablou1[index++];
}
Cuvantul cheie continue incepe ciclul de la o noua iteratie.Pentru ciclurile do si while aceasta
inseamna ca se incepe din nou cu executia corpului ciclului ; pentru ciclurile for se evalueaza
expresia de incrementare si apoi se executa blocul de instructiuni.Instructiunea continue este
folositoare atunci cand dorim sa tratati intr-un anume fel elementele intr-un ciclu.Folosind
exemplul anterior, de copiere a unui tablou in altul, putem testa daca valoarea elementului curent
este egala cu 1 si sa folosim continue pentru a reincepe ciclul dupa fiecare 1 intalnit, asa incat
tabloul rezultat sa nu contina niciodata 1.Trebuie sa fim atenti ca, deoarece sarim peste unele
elemente din primul tablou acum trebuie sa pastram doua valori index pentru cele doua tablouri:
int index=0;
int index2=0;
while (index++ <=tablou1.length) {
if (tablou1[index]==1)
continue;
tablou2[index2++]=(float)tablou1[index];
}
CICLURI ETICHETATE
Instructiunile break si continue pot avea etichete optionale care sa indice locul de unde se va
continua executia programului.Fara eticheta, break sare in afara celui mai apropiat ciclu sau la
urmatoarea instructiune aflata dupa ciclul.Instructiunea continue sare la urmatoarea iteratie a
ciclului care o contine.Cu ajutorul etichetelor putem folosi break pentru a sari intr-un punct aflat
in afara unui ciclu imbricat sau continue pentru a sari intr-un ciclu aflat in afara ciclului curent.
Pentru a folosi un ciclu cu etichete se introduce eticheta inainte de partea de inceput a ciclului,
urmata de semnul:.Apoi, dupa numele instructiunii break sau continue introducem numele
etichetei, ca mai jos:
afara:
for (int i=0; i<10; i++) {
while (x<50) {
if (i*x++>400) break afara;
// ciclu interior
}
// ciclu exterior
}
Pagina 27
CURSURI JAVA Alex Tabusca
In acest exemplu de cod, eticheta afara marcheaza ciclul exterior.In cadrul ciclurilor for si while,
atunci cand este indeplinita o anumita conditie, instructiunea break cu eticheta are ca rezultat
terminarea ambelor bucle.Fara folosirea etichetei afara, instructiunea break ar fi terminat
executia ciclului interior si ar fi continuat executia cu cel exterior.
Pagina 28
CURSURI JAVA Alex Tabusca
CURSUL III
In mod normal prezentarea urmatoare ar trebui privita doar ca o recapitulare a principiilor OOP
studiate deja in cadrul limbajului C++.
Un program este privit in general ca o lista de instructiuni care ii spun calculatorului ce are de
facut.Un program este considerat de OOP drept un set de obiecte care lucreaza impreuna cu
scopul de a indeplini o sarcina.
Ca exemplu sa luam un model practic extrem de intalnit in aceste zile - construirea unui PC din
diferite componente separate (placa de baa, placa video, procesor, etc.).Intern, fiecare dintre
aceste componente poate fi extrem de complicata si complexa dar cel ce asambleaza intregul nu
are nevoie sa stie exact detaliile de functionare interna a fiecarei componente ci doar cateva date
foarte concrete:
Programarea orientata obiect se muleaza perfect pe exemplul anterior ; programul nostru fiunal
se compune din mai multe componente – obiecte care trebuie sa interactioneze cu succes.
Un obiect este un element independent al unui program, care reprezinta un set de caracteristici
corelate si este proiectat pentru a realiza anumite sarcini.Obiectele mai sunt numite si instante.
OBIECTE SI CLASE
O clasa este un model (sablon) folosit pentru a crea mai multe obiecte cu aceeasi caracteristici.
Clasele inglobeaza toate caracteristicile unui anumit set de obiecte.Atunci cand scriem un
program intr-un limbaj OOP nu definim obiecte ci classe de obiecte.
Clasele sunt folosite pentru a crea obiecte cu care vom lucra apoi direct in program.
Pagina 29
CURSURI JAVA Alex Tabusca
Cand scriem un program in Java proiectam si construim un set de clase.Atunci cand programul
ruleaza din aceste clase sunt create obiecte si apoi acestea sunt folosite.Sarcina programatorului
Java este de a crea seturile corecte de clase pentru ca programul sa se comporte corespunzator.
In practica nici macar nu trebuie pornit de la zero cu constructia claselor.Fiecare versiune de Java
contine un grup de clase care implementeaza caracteristicile de baza de care au in general nevoie
programatorii.Aceste grupe de clase se numesc biblioteci.
O biblioteca de clase este un grup de clase proiectate pentru a fi folosite impreuna cu alte
programe.Biblioteca de clase Java standard contine mai multe zeci de clase (depinzand exact de
versiunea limbajului).
Biblioteca standard Java se ocupa de mai multe sarcini uzuale, cum ar fi functii matematice,
lucru cu text, imagini, sunet interactiune cu utilizatorul si lucru in retea.In multe cazuri
bibliotecile Java sunt de ajuns pentru un program de nivel scazut.In acest caz programatorul are
ca sarcina doar crearea unei singure clase, folosite pentru a crea obiecte pronind de la clasele
Java standard si pentru a administra interactiunile dintre acestea.
Odata cu avansarea in programarea Java se poate crea un set complet nou de clase care sa aiba
definite anumite interactiuni intre ele ; acestea pot fi folosite pentru a se alcatui eventual o
biblioteca proprie de clase care poate fi reutilizata mai tarziu in alte programe.Aceasta capacitate
de reutilizare este unul dintre avantajele majore ale programarii orientate obiect.
ATRIBUTE SI COMPORTAMENT
Atributele reprezinta parametrii individuali care diferentiaza o clasa de obiecte de o alta si care
determina modul de prezentare, starea si alte calitati ale clasei.
Intr-o clasa atributele sunt definite de variabile.Fiecare obiect poate avea valori diferite ale
variabilelor sale ; acestea se numesc variabile de instanta.
O vaziabila de instanta este un element de informatie care defineste atributul unui anumit
obiect.Clasa obiectului defineste ce fel de atribut este si fiecare instanta isi pastreaza propria sa
valoare pentru acel atribut.Variabilele de instanta mai sunt denumite si variabilele obiectului.
Fiecarui atribut al unei clase ii corespunde o singura variabila ; putem schimba atributul unui
obiect modificand aceasta variabila.
Variabilele de instanta pot lua o valoare atunci cand se creeaza un obiect ce ramane neschimbat
pe toata durata lui de existenta sau pot lua diferite valori pe masura ce obiectul este folosit.
Un alt atribut este folosit pentru descrierea intregii clase de obiecte, nu numai a unui singur
obiect al clasei.Aceste atribute sunt continute in variabile de clasa.
O variabila de clasa este un element de informatie care defineste atributul unei intregi
clase.Variabila se aplica insasi clasei si tuturor instantelor ei, deci este stocata o singura valoare,
indiferent cate obiecte ale clasei au fost create.
Pagina 30
CURSURI JAVA Alex Tabusca
Metodele sunt grupuri de instructiuni dintr-o clasa de obiecte, care actioneaza asupra acesteia sau
asupra altor clase sau obiecte.Ele sunt folosite pentru a realiza diferite sarcini, in acelasi fel in
care in alte limbaje de programare se folosesc functiile.
Obiectele comunica unele cu altele folosind metodele.O clasa sau un obiect poate apela metode
dintr-o alta clasa sau obiect pentru mai multe motive:
Asa cum exista variabile de instanta si de clasa, exista si metode de instanta si de clasa.Metodele
de instanta, numite si simplu metode, actioneaza asupra unui obiect al clasei.Daca o metoda
efectueaza schimbari doar asupra unui obiect individual ea trebuie sa fie o metoda de
instanta.Metodele de clasa actioneaza asupra clasei insasi.
Class ClasaMea {}
class Jabberwock {
String culoare;
String sex;
boolean flamand; }
void hranescJabberwock() {
if (flamand==true) {
System.out.println(“Bun – foame!”);
Flamand=false;
} else
System.out.println(“Nu murci – am mancat!”);
}
void afisezAtribute() {
System.out.println(“Acesta e un jabberwock “+sex+” “+culoare);
if (flamand==true) System.out.printl(“Jabberwock-ul este flamand”);
else System.out.println(“Jabberwock-ul e satul”);
}
Pagina 31
CURSURI JAVA Alex Tabusca
In acest moment avem o clasa Jabberwock cu variabile si metode de instanta ce pot fi folosite
pentru a afisa si modifica variabilele.
Pentru a compila programul schimbam directorul curent in directorul care contine fisierul nostru
sursa si folosim comanda:
javac Jabberwock.java
In cazul in care incercam sa rulam fisierul (cu comanda:java Jabberwock) vom obtine o
eroare.Aceasta apare deoarece interpretorul Java presupune ca programul pe care incercam sa il
executam din linia de comanda este o aplicatie.Atunci cand se executa o aplicatie punctul ei de
lansare este metoda main().Deoarece clasa noastra nu poseda o metoda main() avem probleme.
1. Cream, separat, un applet sau o aplicatie java care sa foloseasca aceasta clasa
2. adaugam metoda main() in listingul nostru
class Jabberwock {
String culoare;
String sex;
boolean flamand;
void hranescJabberwock() {
if (flamand==true) {
System.out.println("Bun - vrea mancare");
flamand=false; }
else
System.out.println("Nu multumesc - am mancat deja");
}
void afisezAtribute () {
System.out.println("Acesta e un jabber " + sex + " " + culoare + ".");
if (flamand==true)
System.out.println("Jabber este flamand");
else
System.out.println("Jabber este satul");
}
Pagina 32
CURSURI JAVA Alex Tabusca
System.out.println("---");
System.out.println("Hranesc Jabber-ul... ");
j.hranescJabberwock();
}
}
Prin mostenire, o clasa dobandeste imediat tot comportamentul unei clase existente.Din acest
motiv, noua clasa poate fi creata prin simpla specificare a diferentelor fata de clasa existenta.
Prin mostenire toate clasele sunt aranjate intr-o ierarhie stricta – cele pe care le cream si cele
provenite din biblioteca Java sau din alte biblioteci.
O clasa care mosteneste alta clasa este denumita subclasa iar clasa care isi ofera mostenirea se
numeste superclasa.
O clasa poate avea o singura superclasa, insa poate avea un numar nelimitat de
subclase.Subclasele mostenesc toate atributele si comportamentul superclaselor lor.
In varful ierarhiei de clase Java se afla clasa Object – toate clasele mostenesc aceasta unica
superclasa.Object reprezinta cea mai generica clasa din ierarhie, care defineste comportamentul
si atributele mostenite de toate clasele din biblioteca Java.Fiecare clasa aflata mai jos in ierarhie
devine din ce in ce mai adaptata unui scop precis.O ierarhie de clase defineste conceptele
abstracte la varful ierarhiei ; aceste concepte devin din ce in ce mai concrete odata cu coborarea
spre subclase.
In mod normal, cand cream o noua clasa Java dorim ca ea sa prezinte toate caracteristicile unei
clase existente, cu unele modificari ; de exemplu putem dori o versiune a butonului
CommandButton care sa produca un zgomot la folosirea sa.
Pentru a mosteni toate caracteristicile clasei CommandButton fara effort vom defini noua noastra
clasa ca o subclasa a clasei CommandButton.Clasa noastra va mosteni automat comportamentul
si atributele superclasei.Tot ceea ce trebuie sa facem este sa introducem diferenta fata de
superclasa.
Subclasarea reprezinta crearea unei noi clase, care mosteneste o clasa existenta.Singurul lucru
care trebuie facut in subclasa este definirea diferentelor in comportament si atribute fata de
superclasa.
Cand clasa noastra defineste un comportament complet nou si nu este o subclasa atunci ea
mosteneste direct clasa Object.Acest lucru ii permite acesteia sa se integreze corect in ierarhia
claselor Java ; in practica, daca definim o clasa care nu specifica o superclasa atunci Java
presupune automat ca noua clasa mosteneste direct clasa Object
Pagina 33
CURSURI JAVA Alex Tabusca
Atunci cand cream un nou obiect Java pastreaza urma fiecarei variabile definite pentru acel
obiect si a fiecarei variabile definite pentru fiecare clasa a obiectului.In acest fel, toate clasele se
combina pentru a forma un model al obiectului curent, iar fiecare obiect isi completeaza
informatiile corespunzatoare acestei situatii.
Metodele se comporta in acelasi fel:noile obiecte au acces la toate metodele clasei si
superclaselor de care apartin.Acest lucru este determinat dinamic, atunci cand o metoda este
folosita intr-un program aflat in executie.Daca apelam o metoda a unui anumit obiect,
interpretorul Java verifica mai intai clasa obiectului, pentru a gasi acea metoda.Daca metoda nu
este gasita interpretorul o cauta in superclasa clasei si asa mai departe pana la gasirea definitiei
metodei.
Problema se complica atunci cand o subclasa defineste o metoda cu acelasi nume, tip de rezultat
si argumente care sunt definite si intr-o superclasa.In acest caz se foloseste definitia metodei care
este gasita prima (incepand din partea de jos a ierarhiei si mergand in sus).Atfel intr-o subclasa
putem crea o metoda cu acelasi nume, tip de rezultat si argumente ca ale metodei din superclasa ;
aceasta procedura se numeste anulare prin suprascriere sau simplu suprascriere.
INTERFETE
Mostenirea simpla face ca relatiile intre clase si comportamentul pe care aceste clase il
implementeaza sa devina usor de inteles si de proiectat. Totusi ea poate fi restrictiva – mai ales
atunci cand avem un comportament similar care trebuie duplicat pe diferite ramuri ale ierarhiei
de clase.Java rezolva aceasta problema a comportamentului partajat prin folosirea interfetelor.
O interfata este o colectie de metode care indica faptul ca o clasa are un anumit comportament
suplimentar fata de ceea ce mosteneste de la superclasele sale.
Tehnic vorbind, o interfata Java nu contine nimic altceva decat definitii de metode abstracte si
constante – fara variabile de instanta sau implementari de metode (cuvantul cheie folosit pentru a
semnala folosirea unei interfete este implements).
PACHETE
Pachetele in Java reprezinta o modalitate de a grupa clasele si interfetele inrudite. Pachetele
permit grupurilor de clase sa fie disponibile doar daca este nevoie de ele, eliminand potentialele
conflicte intre numele claselor din diferite grupuri de clase.
Bibliotecile de clase Java sunt continute intr-un pachet denumit java. Clasele din pachetul Java
sunt disponibile garantat in orice implementare Java si sunt singurele disponibile in diferite
implementari. Pachetul Java contine pachete mai mici care definesc seturi specifice ale
caracteristicilor limbajului Java, cum ar fi caracteristicile standard, manipularea fisierelor,
multimedia, etc. Clasele din alte pachete, ca sun sau netscape, pot fi disponibile doar in anumite
implementari.
Pagina 34
CURSURI JAVA Alex Tabusca
In mod prestabilit clasele noastre Java au acces doar la clasele din java.lang (caracteristicile de
baza ale limbajului). Pentru a folosi clasele din alte pachete trebuie sa ne referim explicit la
numele pachetului sau sa importam clasele in fisierul nostru sursa.
Pentru a ne referi la o clasa din cadrul unui pachet trebuie sa introducem toate pachetele care
contin clasa, urmate de numele clasei, elementele fiind separate prin puncte. De exemplu sa
luam clasa Color. Ea este continuta in pachetul awt, care la randul lui este continut in pachetul
java.Pentru a referi clasa Color in program trebuie folosita notatia java.awt.Color.
Toate applet-urile reprezinta subclase ale clasei Applet (care face parte din pachetul java.applet).
Prin crearea unei subclase a clsei Applet vom mosteni automat comportamentul si atributele care
permit unui program Java sa ruleze ca parte a unei pagini web.
Aceste instructiuni definesc o clasa Palindrom; singurul lucru nou aparut este textul extends
java.applet.Applet.
Clauza extends reprezinta modul prin care se declara o clasa ca fiind o subclasa a alteia. Clasa
Palindrom este o subclasa a clasei Applet, care face parte din pachetul java.applet. Pentru a
indica in program faptul ca intre cele doua clase exista o relatie se foloseste clauza extends.
Cuvantul cheie public indica faptul ca clasa noastra este accesibila altor clase care ar putea avea
nevoie sa o foloseasca. In mod normal, singurul motiv pentru care am avea nevoie sa definim o
clasa drept publica este atunci cand dorim ca ea sa fie accesata de catre alte clase din programul
nostru. Totusi, in cazul applet-urilor trebuie sa folosim totdeauna declaratia public.
- se creaza un obiect de tip Font, numit f.Font, componenta a pachetului java.awt, este
folosit pentru a reprezenta un font pe ecran. Clasa este folosita pentru a afisa un font si un
stil diferite de cele folosite implicit de un applet.
- obiectului Font i se atribuie o valoare de font de 36 de puncte, stil TimesRoman, cu litere
aldine. Instructiunea new creaza un nou obiect de tip Font avand valorile specificate in
paranteze si care este atribuit variabilei f.
Pagina 35
CURSURI JAVA Alex Tabusca
Prin crearea unei variabile de instanta care sa-l contina, am facut obiectul Font disponibil tuturor
metodelor din clasa noastra. Urmatorul pas in proiectul nostru este de a crea o metoda care sa-l
foloseasca.
Atunci cand scriem applet-uri, exista mai multe metode definite in superclasa Applet, care, de
obicei, sunt anulate prin suprascriere. Printre acestea exista metode care configureaza applet-ul
inainte de a fi lansat in executie, care lanseaza applet-ul, care raspund la evenimentele mouse-
ului sau care elibereaza memoria cand applet-ul isi inceteaza executia.
Una dintre aceste metode este paint(), care se ocupa de orice se intampla cand applet-ul este
afisat pe pagina web. Metoda paint() mostenita de clasa Palindrom nu face nimic – este o
metoda goala. Prin suprascrierea metodei paint() vom indica ce anume dorim sa fie desenat in
fereastra applet-ului, ori de cate ori este nevoie sa se afiseze ceva, atunci cand programul ruleaza.
Sa adaugam la clasa noastra urmatoarele instructiuni:
Metoda paint() este declarata public, ca si applet-ul ; acest lucru apare deoarece metoda pe care o
suprascrie este si ea publica.O metoda publica apartinand unei superclase nu poate fi suprascrisa
decat de o metoda publica, altfel apar erori la compilare.
Metoda paint() preia un singur argument:o instanta a clasei Graphics, denumita ecran.Clasa
Graphics se ocupa cu reprezentarea fonturilor, culorilor si desenarea liniilor si altor forme.
In metoda paint() se realizeaza trei lucruri:
- am indicat obiectului Graphics faptul ca fontul pe care vrem sa-l folosim este cel continut
in variabila de instanta f
- am indicat obiectului Graphics faptul ca culoarea pe care dorim sa o folosim pentru text
si alte operatii de desenare este o instanta a clasei Color pentru culoarea rosu (red).
- in final am scris pe ecran un text la coordonatele x,y egale cu 5 si 40.
In cazul in care incercam sa compilam acest fisier sursa vom obtine o serie de erori de
genul:“Class not found”
Aceste erori apar deoarece clasele Graphics, Font si Color apartin pachetului java.awt, care nu
este disponibil implicit.Am referit clasa Applet din prima linie a sursei prin numele sau complet
– incluzand si numele pachetului din care face parte.In restul programului am referit insa
celelalte clase fara a folosi numele pachetului din care acestea fac parte.
Pagina 36
CURSURI JAVA Alex Tabusca
- referim toate clasele externe prin numele lor complet, cum ar fi java.awt.Graphics
- folosim instructiunea import la inceputul programului pentru a face disponibile unul sau
mai multe pachete si clase.
Pentru o scriere mai usoara si mai rapida a codului sursa se foloseste de obicei a doua varianta,
fapt tradus in programul nostru prin inserarea liniilor:
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
Pentru o si mai mare usurinta putem folosi simbolul “*” in locul unui anumit nume de
clasa.Putem astfel folosi instructiunea:
import java.awt.*;
Deoarece fisierul sursa contine o clasa publica, Palindrom, numele fisierului trebuie sa fie
identic cu numele clasei publice – cu folosirea corecta a majusculelor si minusculelor.
Pentru a putea vedea ce am realizat trebuie sa cream o pagina web care sa foloseasca applet-ul
nostru.
Vom crea o pagina web cu urmatorul continut:
In lipsa unui browser putem folosi pentru a vizualiza pagina noastra utilitarul appletviewer din
pachetul JDK, cu sintaxa:
appletviewer Palindrom.html
Acest utilitar, spre deosebire de un browser, va afisa doar applet-urile incluse in pagina web,
neafisand nimic altceva continut eventual in pagina.
OBIECTE
CREAREA DE NOI OBIECTE
Atunci cand scriem un program Java de fapt definim un set de clase ; clasele sunt modele dupa
care se genereaza obiecte.
In cele mai multe situatii vom folosi clasele pentru a crea instante si vom lucra cu aceste instante.
In cursurile anterioare am intalnit o instanta a clasei String creata prin folosirea unui literal sir (o
serie de carctere incadrate intre ghilimele).
Celelalte clase Java nu au aceasta posibilitate de creare a unui nou obiect.Crearea de noi instante
ale acestora se face explicit cu operatorul new.
Pagina 37
CURSURI JAVA Alex Tabusca
Pentru a crea un nou obiect folosim operatorul new impreuna cu numele clasei dupa modelul
careia dorim sa cream o instanta, urmata de paranteze:
Parantezele sunt foarte importante ; in cazul in care acestea sunt goale se creaza cel mai simplu
obiect – in cazul in care exista argumente intre ele acestea determina valorile initiale ale
variabilelor de instanta sau ale altor calitati initiale ale obiectului respectiv:
Numarul si tipul argumentelor pe care le folosim intre paranteze impreuna cu operatorul new
sunt definite de clasa folosind o metoda speciala denumita constructor.Daca incercam sa cream o
noua instanta a clasei folosind un numar gresit de argumente sau un tip eronat al acestora vom
obtine erori la compilarea programului.
La folosirea operatorului new se intampla mai multe lucruri:se creaza o noua instanta a clasei
date, se aloca memorie pentru aceasta si se apeleaza o metoda speciala a clasei.Aceasta metoda
speciala se numeste constructor.
Constructorii reprezinta metode speciale pentru crearea si initializarea noilor instante ale
claselor.Constructorii initializeaza noul obiect si variabilele sale, creaza orice alte obiecte de care
are nevoie obiectul creat si realizeaza orice alte operatii de care obiectul are nevoie la
initializarea sa.
Intr-o clasa pot exista mai multe definitii de constructori, fiecare avand un numar diferit de
argumente sau tipuri.Atunci cand folosim operatorul new putem specifica diferite argumente in
lista de argumente si va fi apelat constructorul corespunzator pentru acele argumente.La crearea
unei clase putem defini oricati constructori avem nevoie pentru implementarea
comportamentului clasei.
GESTIONAREA MEMORIEI
Gestionarea memoriei in Java se face dinamic si automat.Atunci cand cream un obiect nou Java
aloca automat o zona de memorie de dimensiunea corespunzatoare obiectului.Nu trebuie sa
alocam explicit memorie pentru obiecte.
Deoarece gestionarea memoriei se face automat nu este nevoie sa dezalocam memoria ocupata
de obiect atunci cand am terminat de lucrat cu acesta.Atunci cand am terminat lucrul cu obiectul
acesta nu mai poseda nici o referinta activa catre el (nu va mai fi atribuit nici unei variabile pe
care o folosim sau nu va mai fi stocat in vreun tablou).Java poseda un “garbage collector” care
cauta obiectele nefolosite si recupereaza memoria ocupata de acestea.Nu trebuie sa eliberam
explicit acea zona de memorie.
Pagina 38
CURSURI JAVA Alex Tabusca
OBTINEREA VALORILOR
Pentru a obtine valoarea unei variabile de instanta vom folosi notatia cu punct.In aceasta notatie
variabila de instanta sau de clasa este formata din doua parti:obiectul, in partea stanga a
punctului si variabila, in partea dreapta.
De exemplu, daca avem un obiect atribuit variabilei clientulMeu si acel obiect poseda o variabila
denumita totalFactura atunci ne vom referi la aceasta variabila astfel:
clientulMeu.totalFactura;
Aceasta forma de accesare a variabilelor este o expresie (deoarece intoarce o valoare) in care de
ambele parti ale punctului se afla tot expresii.Acest lucru inseamna ca putem insera mai multe
variabile de instanta.Daca variabila totalFactura refera ea insasi un obiect care poseda propria
variabila de instanta numita rezervat, putem sa ne referim la aceasta astfel:
clientulMeu.totalFactura.rezervat;
Expresiile cu punct sunt evaluate de la stanga spre dreapta, asa incat se va incepe cu variabila din
clientulMeu, totalFactura, care refera un alt obiect cu variabila rezervat.In final vom obtine
valoarea variabilei rezervat.
MODIFICAREA VALORILOR
Atribuirea unei valori acelei variabile se face pur si simplu prin utilizarea operatorului de
atribuire:
clientulMeu.totalFactura.rezervat=true;
import java.awt.Point;
class DefinirePuncte {
public static void main(String argumente[]) {
Point pozitie=new Point(4,13);
System.out.println(“Pozitia de inceput:”);
System.out.println(“X egal “+pozitie.x);
System.out.println(“Y egal “+pozitie.y);
System.out.println(“\nSe muta in (7,6)”);
pozitie.x=7;
pozitie.y=6;
System.out.println(“Pozitia finala:”);
System.out.println(“X egal “+pozitie.x);
System.out.println(“Y egal “+pozitie.y);
}
}
VARIABILE DE CLASA
Dupa cum am vazut in cursurile anterioare o variabila de clasa este definita si memorata chiar in
clasa respectiva.Valorile variabilelor de clasa se aplica clasei si tuturor instantelor sale.
In cazul variabilelor de instanta fiecare noua instanta primea o copie a variabilelor de instanta
definite in clasa.Fiecare instanta poate modifica apoi valorile acestor variabile fara a afecta alte
instante.In cazul variabilelor de clasa exista o singura copie a acesteia.Modificarea valorii sale
este vizibila in toate instantele clasei.
Pagina 39
CURSURI JAVA Alex Tabusca
Variabilele de clasa se definesc prin inserarea cuvantului cheie static inaintea numelui
variabilei.De exemplu, sa luam urmatoarea definitie de clasa:
class MembruFamilie {
static String numeFamilie=”Popescu”;
String prenume;
int varsta;
}
Instantele clasei noastre poseda propriile valori pentru prenume si varsta insa variabila de clasa
numeFamilie are o valoare comuna pentru toti membrii familiei.Daca se modifica valoarea
acestei variabile toate instantele clasei MembruFamilie vor fi afectate.
Pentru accesarea acestor variabile de clasa se foloseste aceeasi notatie cu punct.Pentru a obtine
sau modifica valoarea unei variabile de clasa in partea stanga a punctului putem folosi atat
numele instantei cat si al clasei.Ambele linii urmatoare vor afisa aceeasi valoare:
In practica este recomandabil sa folosim numele de clasa in stanga punctului cand ne referim la o
variabila de clasa.Astfel codul va fi mai usor de citit si depanat.
APELAREA METODELOR
Apelarea unei metode a unui obiect este asemanatoare referirii variabilelor de instanta:folosim
notatia cu punct.Obiectul a carui metoda o apelam este in stanga punctului iar numele metodei si
ale argumentelor sale in dreapta:
clientulMeu.adaugInFactura(codProdus,pret);
Mentionez din nou ca toate metodele sunt obligatoriu urmate de paranteze – cu sau fara
argumente.
Daca metoda apelata returneaza un obiect care poseda la randul lui metode putem imbrica
metodele la fel ca la variabile.Urmatorul exemplu apeleaza metoda discutaCuDirectorul(), care
este definita in obiectul returnat de metoda anuleazaToateComenzile(), care a fost definita in
obiectul clientulMeu:
clientulMeu.anuleazaToateComenzile().discutaCuDirectorul();
System.out.println() – metoda cea mai folosita pana acum este un exemplu de imbricare a
variabilelor si metodelor.Clasa System, parte a pachetului java.lang, descrie comportamentul
specific sistemului pe care ruleaza Java.
System.out este o variabila de clasa care contine o instanta a clasei PrintStream.Acest obiect
PrintStream reprezinta iesirea standard a sistemului, care in mod normal este ecranul.Obiectele
PrintStream poseda o metoda println() care trimite un sir catre fluxul de iesire.
In exemplul de mai jos vom putea vedea cele mai utilizate metode definite in clasa String:
class VerificareSir {
Pagina 40
CURSURI JAVA Alex Tabusca
METODE DE CLASA
Metodele de clasa, ca si variabilele de clasa, se aplica unei clase in intregul sau si nu instantelor
sale.Metodele de clasa sunt utilizate de obicei drept metode de uz general, care nu pot opera
direct asupra unei instante a clasei, dar se potrivesc conceptual in cadrul clasei.De exemplu, clasa
String contine o metoda numita valueOf(), care poate prelua mai multe tipuri de argumente
(intregi, booleeni, alte obiecte s.a.m.d.).Metoda valueOf() intoarce o noua instanta a clasei
String, care contine valoarea argumentului sub forma de sir.Aceasta metoda nu opereaza direct
asupra unei instante String insa obtinerea unui sir dintr-un alt tip de data este in mod clar o
operatie apartinand clasei String si are deci sens sa fie definita in clasa String.
Metodele de clase pot fi de asemenea folositoare pentru adunarea unor metode generale intr-un
singur loc (o clasa).De exemplu, clasa Math, definita in java.lang, contine un set larg de operatii
matematice definite ca metode de clase – nu exista instante ale clasei Math si totusi putem folosi
metodele sale impreuna cu argumente booleene sau numerice.De exemplu sa luam metoda de
clasa Math.max:
Int pretMaxim=Math.max(primulPret,alDoileaPret);
Ca si in cazul variabilelor de clasa accesarea metodelor de clasa se poate face folosind in stanga
punctului fie numele clasei fie numele de instanta.
Exemplul de mai jos va produce acelasi rezultat in ultimele sale doua linii:
String s,s2;
s=”articol”;
s2=s.valueOf(5);
s2=String.valueOf(5);
Pagina 41
CURSURI JAVA Alex Tabusca
CURSUL IV
REFERINTE LA OBIECTE
Pe masura ce lucram cu obiecte un lucru important de inteles il reprezinta folosirea referintelor.
O referinta este un tip de pointer folosit pentru a indica valoarea unui obiect.
Atunci cand atribuim un obiect unei variabile sau trasmitem un obiect ca argument pentru o
metoda nu folosim de fapt obiecte.Nu folositi nici macar copii ale obiectului.De fapt folosim
referinte catre acele obiecte.
Import java.awt.Point;
class TestReferinte {
public static void main(String arg[]) {
Point pt1,pt2;
pt1=new Point(100,100);
pt2=pt1;
pt1.x=200;
pt1.y=200;
System.out.println(“Punct 1: “+pt1.x+”, “+pt1.y);
System.out.println(“Punct 2: “+pt2.x+”, “+pt2.y);
}
}
Desi la o prima vedere variabilele pt1 si pt2 ar trebui sa aiba valori diferite totusi nu este
asa.Variabilele x si y pentru pt2 au fost si ele schimbate chiar daca in program nu se vede nimic
explicit.Motivul este ca in linia 6 s-a creat o referinta de la pt2 la pt1, in loc sa se creeze pt2 ca
un nou obiect, copiat din pt1.
pt2 este o referinta la acelasi obiect ca si pt1.Oricare dintre variabile poate fi folosita pentru a
referi obiectul sau pentru a-I modifica variabilele.
Daca doream ca pt1 si pt2 sa se refere obiecte separate, trebuiau folosite instructiuni new Point()
separate in liniile 5 si 6:
pt1=new Point(100,100);
pt2=new Point(100,100);
Folosirea referintelor in Java devine si mai importanta atunci cand transmitem argumentele
metodelor.
Pagina 42
CURSURI JAVA Alex Tabusca
compilatorul Java raspunde cu eroare daca incercam sa transmitem o valoare float.La fel, daca
incercam sa setam o variabila cu valoarea alteia, ele trebuie sa fie de acelasi tip.
Uneori obtinem intr-un program Java o valoare care nu este de tipul necesar.Poate fi dintr-o alta
clasa sau dintr-un tip de data necorespunzator – cum ar fi float cand avem nevoie de un int.
Pentru a inlatura acest neajuns trebuie sa folosim casting-ul.
Casting-ul reprezinta procesul de generare a unei valori de un alt tip decat sursa.
Atunci cand efectuam un cast valoarea variabilei nu se schimba ; de fapt se creaza o noua
variabila de tipul dorit.
Chiar daca conceptul de casting este relativ simplu, folosirea sa este destul de complicata de
faptul ca Java poseda atat tipuri primitive (int, float, boolean, etc) cat si tipuri obiect (String,
ZipFile, Point, etc.).Exista trei tipuri de cast si de conversie despre care vom vorbi:
De multe ori putem folosi automat un byte sau un char drept un int ; putem folosi un int drept un
long, un int drept un float sau orice drept un double.In majoritatea cazurilor, deoarece tipul de
dimensiuni mai mari ofera mai multa precizie decat cel cu dimensiuni mai mici, nu apare nici o
pierdere de informatie.Exceptia apare atunci cand facem un cast de la intregi la valori in virgula
mobila – castingul unui int sau al unui long intr-un float sau al unui long intr-un double poate
duce la pierderi ale preciziei.
Trebuie sa folosim un cast explicit pentru a converti o valoare mai mare intr-una mai mica,
deoarece conversia valorii poate duce la o pierdere de precizie.Cast-urile explicite au sintaza:
(numetip)valoare
numetip este numele tipului de data catre care facem conversia ; valoare reprezinta o expresie
care are ca rezultat valoarea tipului sursa.
Deoarece precedenta castingului este mai mare decat a operatiilor aritmetice trebuie sa folosim
paranteze – altfel putand apare probleme.
CASTINGUL OBIECTELOR
Instantelor claselor li se poate aplica operatia de cast catre instante ale altor clase, cu o restrictie ;
clasele sursa si destinatie trebuie sa fie inrudite prin mostenire.O clasa trebuie sa fie subclasa a
alteia.
Pagina 43
CURSURI JAVA Alex Tabusca
Asemanator conversiei unei valori primitive catre un tip de dimensiuni mai mari, unele obiecte
nu au nevoie de cast explicit.In particular, deoarece subclasele contin toate informatiile
superclasei lor putem folosi o instanta a unei subclase oriunde se asteapta folosirea unei
superclase.
De exemplu, sa luam o metoda care preia doua argumente:unul de tip Object si altul de tip
Window.Putem transmite o instanta a oricarei clase drept argument Object (pentru ca toate
clasele Java sunt subclase ale clasei Object) ; pentru argumentul Window putem transmite si
instante ale subclaselor sale (cum ar fi Dialog, FileDialog sau Frame).
(numeclasa)obiect
numeclasa este numele clasei destinatie, iar obiect este o referinta catre obiectul sursa.Retinem
ca operatia de cast creaza o referinta catre vechiul obiect, de tip numeclasa ; vechiul obiect
continua sa existe ca si inainte.
In exemplul de mai jos putem vedea un cast de la o instanta a clasei VicePresedinte catre o
instanta a clasei Angajat ; VicePresedinte este o subclasa a clasei Angajat, cu informatii
suplimentare care definesc faptul ca VicePresedinte are anumite drepturi suplimentare:
In afara de castingul obiectelor catre clase putem de asemenea face castingul obiectelor catre
interfete – insa numai daca clasa obiectului respectiv sau una dintre superclasele sale
implementeaza de fapt interfata.Castingul unui obiect catre o interfata inseamna ca putem apela
una dintre metodele interfetei, chiar daca clasa obiectului nu implementeaza de fapt interfata.
Ca alternativa, pachetul java.lang contine clase care corespund fiecarui tip de date
primitive:Integer, Float, Boolean s.a.m.d.Remarcam faptul ca numele acestor clase incep cu litera
mare.Java trateaza foarte diferit tipurile de date si versiunile clasa ale acestora ; programele nu se
vor compila cu succes daca se folosesc una in locul celeilalte.
Pagina 44
CURSURI JAVA Alex Tabusca
Folosind metodele de clasa definite in aceste clase putem crea un obiect pentru fiecare dintre
tipurile primitive, folosind operatorul new.Urmatoarea instructiune creaza o instanta a clasei
Integer cu valoarea 4455:
Odata creat un obiect in acest fel putem sa il folosim ca pe orice alt obiect.Atunci cand dorim sa
folosim valoarea din nou ca primitv exista metode speciale, ca mai jos:
O conversie de care este adesea nevoie in programe este conversia unui sir intr-un tip numeric,
cum ar fi un intreg.Acest lucru se poate face cu metoda parseInt a clasei Integer, ca in exemplul
de mai jos:
String nume=”12000”;
Int numar=Integer.parseInt(nume);
- compararea obiectelor
- gasirea clasei de care apartine un obiect
- testarea daca un obiect reprezinta o instanta a unei clase date
COMPARAREA OBIECTELOR
Aceasta operatie se realizeaza in Java cu ajutorul operatorilor “== “ si “!=”.Atunci cand sunt
folositi cu obiecte acesti operatori nu realizeaza ceea ce ne-am astepta.In loc de a verifica daca
unul dintre obiecte are aceeasi valoare cu celalalt obiect ele determina daca obiectele sunt de fapt
acelasi obiect.
Pentru a compara instantele unei clase si a obtine rezultate folositoare trebuie implementate
metode speciale in cadrul clasei si apoi apelate aceste metode.
Un bun exemplu este clasa String.Este posibil sa avem doua obiecte String diferite care sa
contina aceeasi valoare.Daca folosim operatorul “==” pentru a compara aceste obiecte ele vor fi
considerate diferite.Pentru a vedea daca doua obiecte String au valori identice se foloseste o
metoda a clasei, numita equals().Metoda testeaza fiecare caracter din sir si returneaza valoarea
true daca cele doua siruri contin aceleasi valori.
Exemplul de mai jos ilustreaza cele comentate mai sus:
class TestEgalitate {
public static void main(String arg[]) {
String str1,str2;
str1=”Test de egalitate intre siruri.”);
str2=str1;
System.out.println(“Sir1:“+str1);
System.out.println(“Sir2:“+str2);
System.out.println(“Acelasi obiect ? “+(str1==str2));
Str2=new String(str1);
Pagina 45
CURSURI JAVA Alex Tabusca
System.out.println(“Sir1:“+str1);
System.out.println(“Sir2:“+str2);
System.out.println(“Acelasi obiect ? “+(str1==str2));
System.out.println(“Aceeasi valoare ? “+str1.equals(str2));
}
}
Literalele sir sunt optimizate in Java – daca am crea un sir folosind un literal si apoi folosim un
literal cu aceleasi caractere, Java stie suficient pentru a ne oferi acelasi obiect String.Ambele
siruri reprezinta acelasi obiect – trebuie sa actionam diferit pentru a crea doua obiecte separate.
String nume=obj.getClass().getName();
Un alt test care poate fi folositor este operatorul instanceof.Acesta are doi operanzi:un obiect in
stanga si un nume de clasa in dreapta.Expresia intoarce true sau false in functie daca obiectul
este instanta a clasei numite sau a oricarei subclase a ei:
Listingul de mai jos prezinta o aplicatie Java care creaza un obiect de tip Random si apoi
foloseste reflexia pentru a afisa toate metodele publice care fac parte din clasa:
import java.lang.reflect.*;
import java.util.Random;
class AflaMetode {
public staic void main(String[] arg) {
Random rd=new Random();
Class numeClasa=rd.getClass();
Method[] metode=numeClasa.getMethods();
for (int i=0;i<metode.length;i++) {
Pagina 46
CURSURI JAVA Alex Tabusca
System.out.println(“Metoda:“+metode[i]);
}
}
}
Folosind reflexia, aplicatia AflaMetode poate afla informatii despre fiecare metoda a clasei
Random si despre toate metodele pe care le-a mostenit de la superclasa Random.
Aplicatia AflaMetode poate functiona pentru orice clasa de obiecte.
Reflexia este folosita de obicei de utilitare ca browserele de clasa sau depanatoarele, ca o
modalitate de a afla mai multe despre clasa de obiecte analizata sau depanata.Este de asemenea
folosita de JavaBeans, unde posibilitatea unui obiect de a interoga un alt obiect asupra a ceea ce
poate sa faca (urmata de o cerere de a efectua ceva) este folositoare in crearea aplicatiilor mai
mari.
In plus exista un numar de noi metode disponibile intr-o clasa de obiecte numita Class, care ajuta
la conectarea diferitelor clase de reflexie.
Reflexia reprezinta un element avansat de programare pe care este posibil sa nu il folosim in
programe prea des dar care devine foarte importanta atunci cand se lucreaza cu JavaBeans si alte
elemente de programare Java avansate.
CREAREA CLASELOR
DEFINIREA CLASELOR
Ca o scurta recapitulare prezentam mai jos o definitie de clasa:
class Stiri {
// corpul clasei
}
In mod prestabilit toate clasele mostenesc clasa Object, care este superclasa tuturor claselor din
ierarhia Java.
Daca respectiva noastra clasa este o subclasa folosim cuvantul cheie extends pentru a indica
superclasa noii clase:
Pagina 47
CURSURI JAVA Alex Tabusca
CONSTANTE
Variabilele sunt folositoare atunci cand avem nevoie sa pastram informatii ce vor fi modificate
pe parcursul rularii programului.Daca valoarea nu se schimba niciodata pe parcursul executiei
programului putem folosi un tip special de variabila, numit constanta.
Constantele se folosesc pentru definirea valorilor comune pentru toate metodele unui obiect, cu
alte cuvinte, pentru denumirea unor valori ce nu se vor schimba in cadrul obiectului.In Java
putem crea constante pentru toate tipurile de variabile:de instanta, de clasa sau locale.
Pentru a declara o constanta folosim cuvantul cheie final inainte de declararea variabilei si
atribuim valoarea initiala pentru variabila respectiva, ca in exemplele de mai jos:
Constantele pot fi folositoare pentru denumirea diferitelor stari ale unui obiect sau pentru testarea
acestor stari.Folosirea constantelor usureaza de cele mai multe ori intelegerea programului.
VARIABILE DE CLASA
Acestea se aplica unei clase in intregul sau (dupa cum am vazut si in cursurile precedente),
nefiind stocate individual in obiectele (instantele) clasei.
Variabilele de clasa folosesc la comunicarea intre diferite obiecte ale aceleiasi clase sau pentru
pastrarea unor informatii comune la nivelul intregii clase.
Pentru a declara o variabila de clasa se foloseste cuvantul cheie static, ca mai jos:
CREAREA METODELOR
Metodele definesc comportamentul unui obiect – actiunile efectuate la crearea obiectului sau pe
parcursul duratei sale de viata.
DEFINIREA METODELOR
Aceasta cuprinde patru parti:
- numele metodei
Pagina 48
CURSURI JAVA Alex Tabusca
Primele trei parti ale unei definitii de metoda formeaza ceea ce se numeste semnatura metodei.
In definirea metodei mai exista si doua alte parti optionale:un modificator (cuvintele cheie public
sau private) si cuvantul cheie throws (care indica exceptiile pe care le poate semnala metoda).
In alte limbaje numele metodei – numita si functie, subrutina sau procedura – este suficient
pentru a o distinge fata de celelalte metode din program.
In Java, in aceeasi clasa putem folosi mai multe metode cu acelasi nume, dar care difera prin
valoarea returnata sau prin lista de parametri.Aceasta practica este denumita supraincarcarea
metodei (overloading).
Mai jos putem vedea o definitie generala a unei metode:
tipRetur poate fi un tip primitiv, un nume de clasa sau cuvantul cheie void, atunci cand metoda
nu returneaza o valoare.
In cazul in care metoda returneaza un obiect tablou, trebuie folosite parantezele patrate fie dupa
tipRetur fie dupa lista de parametri:
Lista de parametri a metodei este un set de definitii de variabile, separate prin virgula si incadrate
intre paranteze rotunde.Acesti parametri devin variabile locale in corpul metodei, primind valori
la apelarea metodei.
In afara cazurilor cand este declarata cu tipul de retur void, o metoda returneaza la terminarea sa
o valoare de un anumit tip.Aceasta valoare trebuie specificata explicit in punctele de iesire ale
metodei, prin cuvantul cheie return.
In listingul de mai jos avem un exemplu de clasa care defineste o metoda care preia doi intregi si
creaza un tablou care contine toate numerele intregi aflate intre cele doua limite:
class ClasaDomeniu {
int[] creareDomeniu(int inf,int sup) {
int tabl[]=new int[(sup-inf)+1];
unTablou=unDomeniu.creareDomeniu(1,10);
System.out.print(“Tabloul:[ “);
Pagina 49
CURSURI JAVA Alex Tabusca
Metoda main() a clasei apeleaza metoda creareDomeniu() prin crearea unui domeniu marginit
inferior, respectiv superior, de valorile 1 si 10, dupa care foloseste un ciclu for pentru a afisa
valorile noului tablou.
In multe cazuri s-ar putea sa nu fie nevoie sa utilizam explicit cuvantul cheie this, deoarece este
presupus.De exemplu, putem sa ne referim atat la variabilele de instanta cat si la apelurile de
metode definite in clasa curenta prin simpla folosire a numelui lor, deoarece this este implicit
folosit in aceste referinte:
Deoarece this este o referinta a instantei curente a clasei trebuie sa o folosim doar in cadrul
corpului unei definitii de metoda de instanta.Metodele de clasa, declarate prin cuvantul cheie
static, nu pot folosi this.
O variabila cu domeniu de vizibilitate local poate fi folosita doar in cadrul blocului in care a fost
definita.Variabilele de instanta si de clasa poseda un domeniu de vizibilitate extins la intreaga
clasa, deci ele pot fi accesate de oricare dintre metodele din cadrul clasei.
Atunci cand referim o variabila in cadrul unei metode, Java verifica definitia acesteia mai intai in
domeniul de vizibilitate local, dupa aceea in domeniul exterior imediat urmator si, in cele din
urma, in domeniul metodei curente.Daca variabila nu este locala Java verifica existenta unei
definitii a acesteia ca variabila de instanta sau de clasa in clasa curenta.Daca Java tot nu gaseste
definitia variabilei ocauta pe rand in fiecare superclasa.
Pagina 50
CURSURI JAVA Alex Tabusca
METODE DE CLASA
Relatia dintre variabilele de instanta si cele de clasa este comparabila cu diferenta dintre
modurile de lucru ale metodelor de instanta si de clasa.
Metodele de clasa sunt disponibile oricarei instante a clasei si pot fi facute disponibile altor
clase.In plus, spre deosebire de o metoda de instanta, o clasa nu necesita o instanta a clasei
pentru a-I putea fi apelate metodele.
De exemplu, bibliotecile Java contin o clasa denumita Math.Clasa Math defineste un set de
operatii matematice pe care le putem folosi in orice program sau pentru diferite tipuri numerice:
float radical=Math.sqrt(453.0);
System.out.println(“Cel mai mare dintre x si y este:“+Math.max(x,y));
Pentru a defini metode de clasa se foloseste cuvantul cheie static, pozitionat in fata definitiei
metodei, la fel ca in cazul definirii variabilelor de clasa.De exemplu, metoda de clasa max(),
folosita in exemplul precedent, ar putea avea urmatoarea semnatura:
Java contine clase de impachetare (wrapper) pentru fiecare dintre tipurile de baza.
Lipsa cuvantului cheie static din fata numelui unei metode face ca aceasta sa fie o metoda de
instanta.
O aplicatie Java consta dintr-una sau mai multe clase ce pot avea orice dimensiune
dorim.Singurul element de care avem neaparat nevoie pentru a rula o aplicatie Java este o clasa
care sa serveasca drept punct de plecare pentru restul programului Java.
Clasa de pornire a aplicatiei are nevoie de un singur lucru:o metoda main().Aceasta metoda este
prima apelata.
Semnatura metodei main() arata totdeauna astfel:
- public – inseamna ca metoda este disponibila altor clase si obiecte.Metoda main() trebuie
declarata public.
- static – inseamna ca metoda main() este o metoda de clasa
- void – inseamna ca metoda main() nu returmeaza nici o valoare
Pagina 51
CURSURI JAVA Alex Tabusca
Pentru a transmite argumente care contin spatii acestea trebuie incadrate de ghilimele duble.
Atunci cand o aplicatie este rulata cu argumente, Java le memoreaza sub forma unui tablou de
siruri, pe care il transmite metodei main() a aplicatiei.Pentru a putea trata aceste argumente drept
altceva decat siruri trebuie mai intai sa le convertim.
Pagina 52
CURSURI JAVA Alex Tabusca
CURSUL V
Aceste doua caracteristici definesc semnatura metodei ; folosirea mai multor metode cu acelasi
nume si semnaturi diferite se numeste supraincarcare.
In exemplul clasei String, metodele valueOf() sunt supraincarcate deoarece preiau ca parametri
tipuri de date diferite.
Supraincarcarea metodelor elimina nevoia de a defini metode complet diferite care sa faca in
principiu acelasi lucru.Supraincarcarea face de asemenea posibila comportarea diferita a
metodelor in functie de argumentele primite.
Pagina 53
CURSURI JAVA Alex Tabusca
Metodele valueOf() pot fi folosite pentru a converti diverse tipuri de date sau obiecte in
siruri.Atunci cand apelam o metoda a unui obiect Java verifica numele si argumentele acesteia
pentru a vedea ce metoda va executa.
Pentru a crea o metoda supraincarcata intr-o clasa vom defini metode diferite, cu acelasi nume
insa cu liste de argumente diferite.Diferenta poate consta in numarul de argumente, in tipul de
argumente sau ambele.Java permite supraincarcarea metodelor atat timp cat lista de argumente
este unica pentru acelasi nume de metoda.
Mentionez ca Java nu ia in considerare tipul valorii returnate pentru a face diferentierea
metodelor supraincarcate.Daca incercam sa cream doua metode care difera doar prin tipul valorii
de retur vom obtine o eroare inca de la compilare.In plus numele variabilelor pe care le alegem
pentru fiecare argument nu au importanta – tot ceea ce conteaza este numarul si tipul acestora.
In continuare vom detalia un exemplu de metoda supraincarcata.Vom crea intai o clasa care
defineste o forma rectangulara cu patru variabile de instanta, pentru a preciza colturile din
stanga-sus si dreapta-jos ale unui dreptunghi:x1, y1, x2, y2.
class DreptunghiulMeu {
int x1=0;
int y1=0;
int x2=0;
int y2=0;
}
Atunci cand este creata o noua instanta a clasei noastre toate valorile vor fi initializate cu 0.In
continuare vom defini o metoda care preia patru argumente intregi si returneaza obiectul
rectangular.Deoarece argumentele au acelasi nume cu variabilele de instanta, in cadrul metodei
vom folosi cuvantul cheie this pentru a referi variabilele de instanta:
DreptunghiulMeu construireDreptunghi (int x1, int y1, int x2, int y2) {
this.x1=x1;
this.y1=y1;
this.x2=x2;
this.y2=y2;
return this;
}
Pagina 54
CURSURI JAVA Alex Tabusca
Pentru ca metoda anterioara sa functioneze clasa Point trebuie importata la inceputul codului
sursa.
O alta modalitate de a defini un dreptunghi este de a folosi coordonatele coltului din stanga-sus
impreuna cu valorile inaltimii si latimii sale:
Pentru a finaliza exemplul mai cream o clasa, afisareDreptunghi(), care urmeaza sa afiseze
coordonatele dreptunghiului, si o metoda main() care sa apeleze toate aceste metode:
import java.awt.Point;
class DreptunghiulMeu {
int x1=0;
int y1=0;
int x2=0;
int y2=0;
Pagina 55
CURSURI JAVA Alex Tabusca
void afisareDreptunghi() {
System.out.print(“Dreptunghiul meu:<”+x1+”, “+y1);
System.out.println(“, “+x2+”, “+y2+”>”);
}
Atunci cand avem mai multe metode care fac lucruri asemanatoare, intr-o metoda putem apela o
alta.De exemplu, in cazul de mai sus, metoda construireDreptunghi care primeste ca argumente
doua obiecte Point poate fi inlocuita cu o versiune mult mai scurta:
METODE CONSTRUCTOR
In afara de metode obisnuite in clase putem defini si metode constructor.
O metoda constructor este o metoda apelata la crearea unui obiect – cu alte cuvinte, atunci cand
obiectul este construit.
Spre deosebire de alte metode, o metoda constructor nu poate fi apelata direct ; Java apeleaza
metodele constructor in mod automat.
Atunci cand este folosita instructiunea new pentru crearea unui nou obiect, Java executa trei
activitati:
Pagina 56
CURSURI JAVA Alex Tabusca
- initializeaza variabilele de instanta ale obiectului fie la valorile initiale fie la cele
prestabilite (o pentru numere, null pentru obiecte, false pentru valori booleene si “\0”
pentru caractere)
- apeleaza metodele constructor ale clasei
Chiar daca o clasa nu are definita nici o metoda constructor este totusi posibila crearea unui
obiect.Exista insa cazuri in care dorim sa setam anumite variabile de instanta sau sa apelam alte
metode de care obiectul are nevoie pentru a se initializa.
Prin definirea unor metode constructor in clase, putem seta valorile initiale ale variabilelor de
instanta, putem apela metode pe bza acestor variabile, putem apela metode ale altor obiecte sau
putem seta proprietatile initiale ale unui obiect.Metodele constructor pot fi si ele supraincarcate,
la fel ca metodele obisnuite, pentru a crea un obiect care are proprietati specifice in functie de
argumentele transmise prin instructiunea new.
In exemplul de mai jos vom vedea o clasa Persoana care foloseste o metoda constructor pentru a-
si initializa variabilele de instanta pe baza argumentelor primite de new:
class Persoana {
String nume;
int varsta;
Persoana (String n, int a) {
nume=n;
varsta=a;
}
void printPersoana() {
System.out.print(“Eu sunt “+nume);
System.out.println(“ si am “+varsta+” de ani”);
}
public static void main (String argumente[]) {
Persoana p;
p=new Persoana(“Ion”,50);
p.printPersoana();
System.out.Println(“----“);
p=new Persoana(“Laura”,30);
p.printPersoana();
System.out.println(“----“);
}
}
Pagina 57
CURSURI JAVA Alex Tabusca
Folosirea cuvantului cheie this intr-o metoda constructor este similara modului lui de folosire
pentru accesul la variabilele de instanta ale obiectului.In instructiunea anterioara argumentele
primate de this() sunt argumentele metodei constructor.De exemplu, sa luam o clasa care
defineste un cerc folosind coordonatele (x,y) ale centrului si lungimea razei.Clasa CerculMeu
poate avea doi constructori:unul in care este definita raza si unul in care raza primeste valoarea
prestabilita 1:
class CerculMeu {
int x,y,raza;
CerculMeu (int coordX, int coordY, int lungRaza) {
this.x=coordX;
this.y=coordY;
this.raza=lungRaza;
}
CerculMeu (int coordX, int coordY) {
this(coordX, coordY, 1);
}
}
A doua metoda constructor din clasa CerculMeu preia doar coordonatele x si y ale
cercului.Deoarece nu este definite nici o raza se foloseste valoarea prestabilita 1 ; se apeleaza
apoi prima metoda constructor care primeste ca argumente coordX, coordY si literalul 1.
SUPRASCRIEREA METODELOR
Atunci cand apelam metoda unui obiect, Java cauta definitia metodei respective in clasa
obiectului.Daca nu o gaseste cauta mai sus in ierarhia de clase pana cand gaseste o
definitie.Procesul de mostenire a metodelor ne permite sa definim si sa folosim repetat metode in
subclase fara a fi nevoie sa replicam codul.
Pagina 58
CURSURI JAVA Alex Tabusca
Totusi pot exista cazuri cand dorim ca un obiect sa raspunda acelorasi metode, dar sa aiba un
comportament diferit la apelarea acestora.In acest caz, metoda se poate suprascrie.Pentru a
suprascrie o metoda, definim intr-o subclasa o metoda cu aceeasi semnatura ca a unei metode
dintr-o superclasa.Astfel, atunci cand metoda este apelata, metoda din subclasa este gasita prima
si executata in locul celei din superclasa.
class AfisareClasa {
int x=0;
int y=0;
void afisareDate() {
System.out.println(“x este “+x+” si y este “+y);
System.out.println(“Sunt o instanta a clasei “+this.getClass().getName());
}
}
Cream in continuare si o subclasa a clasei de mai sus, cu o singura diferenta, subclasa contine si
variabila z:
Pagina 59
CURSURI JAVA Alex Tabusca
}
}
In multe cazuri practice comportamentul metodei originale trebuie doar completat si nu inlocuit
definitiv, mai ales in cazurile cand se realizeaza acelasi tip de actiuni si in metoda originala si in
cea care o suprascrie.Prin apelarea metodei originale in cadrul metodei de suprascriere putem
adauga numai insusirea suplimentara.
Pentru a apela metoda originala in cadrul metodei de suprascriere folosim cuvantul cheie
super.In acest fel apelul metodei este transferat mai sus in cadrul ierarhiei de obiecte:
Cuvantul cheie super este asemanator cuvantului cheie this, deoarece este o denumire generica
pentru superclasa clasei curente.Il putem folosi oriunde am putea folosi si this, insa super refera
superclasa nu clasa curenta.
// din AfisareClasa
void afisareDate() {
System.out.println(“Sunt o instanta a clasei “+this.getClass().getName());
System.out.println(“X este “+x);
System.out.println(“Y este “+y);
}
Apoi, cand suprascriem metoda afisareDate() in subclasa putem apela metoda originala si adauga
doar codul suplimentar:
// din AfisareSubClasa2
Pagina 60
CURSURI JAVA Alex Tabusca
void afisareDate() {
super.afisareDate();
System.out.println(“Z este “+z);
}
SUPRASCRIEREA CONSTRUCTORILOR
Din punct de vedere tehnic constructorii nu pot fi suprascrisi.Pentru ca au totdeauna acelasi
nume ca al clasei curente, metodele constructor nu se mostenesc ci se creaza altele noi.Acest
sistem este multumitor in marea majoritate a cazurilor ; atunci cand este apelata metoda
constructor a clasei se apeleaza si metoda constructor cu aceeasi semnatura pentru toate
superclasele.Din aceasta cauza initializarea se face pentru toate partile clasei pe care o mostenim.
Totusi, atunci cand definim metode constructor pentru clasa noastra putem modifica felul in care
este initializat obiectul nu doar prin initializarea noilor variabile adaugate clasei, ci si prin
modificarea continutului variabilelor deja prezente.Pentru aceasta vom apela explicit metodele
constructor ale superclasei si apoi vom modifica variabilele dorite.
Retinem ca Java are o regula stricta pentru folosirea metodei super():aceasta trebuie sa sie prima
instructiune folosita in cadrul constructorului.Daca nu apelam super() explicit in cadrul
constructorului Java face acest lucru implicit, folosind super() fara argumente.Deoarece apelarea
super() trebuie sa fie prima instructiune nu putem folosi un cod de genul:
if (conditie==true)
super(1, 2, 3); // apelarea unui constructor al superclasei
else
super(1, 2); // apelarea unui alt constructor
La fel ca in folosirea this(...) intr-o metoda constructor, super(...) apeleaza metoda constructor
pentru superclasa imediat urmatoare (care la randul sau va apela constructorul superclasei sale si
asa mai departe).Retinem ca in superclasa trebuie sa existe un constructor cu semnatura
respectiva pentru ca apelul super() sa functioneze.Compilatorul Java verifica aceste lucruri
atunci cand incercam sa compilam fisierul sursa.
Nu trebuie sa apelam constructorul din superclasa care are aceeasi semnatura cu cea a
constructorului clasei noastre ; trebuie doar sa apelam constructorul pentru valorile pe care dorim
sa le initializam.De fapt, putem crea o clasa care are constructori cu semnaturi total diferite de
oricare dintre constructorii superclasei.
In exemplul urmator vom prezenta o clasa PunctCuNume care extinde clasa Point a pachetului
java.awt.Clasa Point are un singur constructor care preia argumentele x si y si returneaza un
Pagina 61
CURSURI JAVA Alex Tabusca
import java.awt.Poin;
class PunctCuNume (int x, int y, String nume) {
super(x,y);
this.nume=nume;
}
public static void main(String argumente[]) {
PunctCuNume pn=new PunctCuNume(5,5,”PunctulA”);
System.out.println(“x este “+pn.x);
System.out.println(“y este “+pn.y);
System.out.println(“Numele este “+pn.nume);
}
}
Metoda constructor definita aici pentru PunctCuNume apeleaza metoda constructor a clasei Point
pentru a initializa variabilele de instanta x si y.Chiar daca am putea initializa si singuri, explicit,
variabilele x si y exista posibilitatea sa existe si alte lucruri care s-ar intampla la initilizarea
obiectelor Point ; din aceasta cauza este mai bine sa apelam metodele constructor aflate deasupra
in ierarhie, pentru a fi siguri ca totul se configureaza corect.
METODE DE FINALIZARE
Metodele de finalizare sunt opusul metodelor constructor.O metoda constructor este folosita
pentru a initializa un obiect iar metodele de finalizare sunt apelate chiar inainte de distrugerea
obiectului si recuperarea memoriei ocupate.
In cadrul metodei finalize() putem specifica toate actiunile de “curatare” pe care dorim sa le
realizam in legatura cu obiectul.De asemenea putem apela super.finalize() pentru a permite
superclasei clasei noastre sa finalizeze obiectul daca este nevoie.
Putem apela metoda finalize() oricand – este o metoda ca oricare alta.Totusi apelarea ei nu
semnaleaza sistemului distrugerea obiectului si recuperarea memoriei ocupate.Numai stergerea
tuturor referintelor la obiectul respectiv duce la marcarea lui pentru distrugere.
Metodele de finalizare sunt folosite de obicei pentru optimizarea distrugerii unui obiect – de
exemplu, pentru distrugerea referintelor catre alte obiecte.In marea majoritate a cazurilor practice
nu este nevoie se folosim deloc metoda explicita finalize().
Pagina 62
CURSURI JAVA Alex Tabusca
CURSUL VI
Aplicatiile sunt rulate prin intermediul unui interpretor Java care incarca fisierul clasa principal
al aplicatiei. Acest lucru se face de obicei din linia de comanda folosind utilitarul “java.exe” al
pachetului Java2 SDK (sau JDK in versiunile mai vechi).
Pe de alta parte, applet-urile sunt rulate de orice browser care suporta Java – cum ar fi Netscape
Navigator, Internet Explorer, Sun HotJava sau Opera. Applet-urile pot fi testate si cu ajutorul
utilitarului “appletviewer.exe”, inclus in pachetul Java2 SDK. Trebuie mentionat ca
“appletviewer” ignora toate celelalte elemente ale paginii web in care inseram applet-ul nostru
scris in Java.
Pentru a rula un applet acesta trebuie iglobat intr-o pagina web folosind tag-uri HTML, in acelasi
mod in care sunt inglobate imagini sau alte elemente.Atunci cand un utilizator cu un browser
compatibil cu Java incarca o pagina web care contine un applet, browser-ul transfera codul
applet-ului de pe serverul web si il executa pe sistemul local al utilizatorului. Nu este nevoie de
un interpretor Java separat – el este inclus in browser. Ca orice aplicatie, un applet Java contine
un fisier clasa si orice alte clase externe necesare rularii. Biblioteca de clase standard a Java este
inclusa automat.
Deoarece applet-urile Java ruleaza in cadrul unui browser Java, o parte din efortul crearii unei
interfete utilizator este eliminata; exista deja o fereastra in care applet-ul poate rula, un loc unde
sa se afiseze grafica si de unde sa se primeasca datele de intrare precum si interfata browser-ului.
OBS: Este posibil ca un program Java sa functioneze atat ca applet cat si ca aplicatie
independenta. Cu toate ca pentru crearea acestor tipuri de programe se folosesc proceduri
separate, acestea nu intra in conflict una cu alta. Caracteristicile specifice applet-urilor vor fi
ignorate atunci cand programul ruleaza ca aplicatie si viceversa.
Pagina 63
CURSURI JAVA Alex Tabusca
In acest moment Java 1.02 este singura versiune de limbaj suportata absolut complet atat de
Netscape Navigator cat si de Microsoft Internet Explorer (aplicatii ce detin in jur de 90 de
procente din piata browser-elor). Netscape si Microsoft au implementat si versiunile Java 1.1 si 2
(la momentul actual – inceputul lui 2002 – ultima versiune) dar implementarile mai produc
anumite surprize neplacute, in unele cazuri existand applet-uri care nu functioneaza corect in
cazul programarii lor folosind ultima versiune a limbajului.
Sun a gasit o modalitate de a ocoli aceste neajunsuri creand un program add-on (complementar)
pentru browser-e, denumit Java Plug-in, care ne permite sa utilizam imbunatatirile aduse de Java
1.2 sau Java 2. Acest program add-on este continut in pachetul JDK 1.2 si in toate celelate
versiuni ale mediului de dezvoltare: 1.3 si 1.4 (ultima versiune la momentul februarie 2002 a
pachetului de dezvoltare al Sun pentru limbajul Java 2 numindu-se Java2 SDK 1.4.0).
- applet-urile se scriu folosind elemente Java 1.02 deoarece functioneaza pe toate browser-
ele compatibile Java
- aplicatiile se scriu folosind Java 2 deoarece pot fi rulate pe orice sistem care contine un
interpretor Java
Java 2 a fost proiectat astfel incat un program care foloseste numai facilitatile Java 1.02 sa se
poata compila si sa ruleze cu succes in cadrul unui browser compatibil Java.
Daca un applet foloseste una dintre facilitatile introduse de Java 1.1 sau Java 2 programul nu va
rula pe browser-ele care nu suporta aceste versiuni si care nu au instalat add-on-ul de care
aminteam mai sus. De multe ori imbunatatirile aduse limbajului de versiunile 1.1 sau 2 nici nu
sunt vitale pentru aplicatiile de tip applet, gasindu-si o utilitate mult mai mare in domeniul
aplicatiilor Java independente.
In unele cazuri de applet-uri scrise pentru Java 1.02, compilatorul ne va atentiona ca anumite
elemente au fost inlocuite si ca exista o solutie mai buna; aceste atentionari (warnings) nu sunt
mesaje de eroare ale compilatorului, SDK-ul creand un fisier clasa compilat si atragand doar
atentia programatorului.
Ca regula generala, applet-urile Java functioneaza dupa principiul “better safe than sorry “; unui
applet ii sunt interzise urmatoarele activitati:
Pagina 64
CURSURI JAVA Alex Tabusca
Toate aceste reguli se aplica applet-urilor in mod normal dar exista si posibilitatea (din
configurarea browser-elor) de a modifica nivelul de securitate dorit, permitand accesul din
anumite directoare sau conexiuni catre anumite site-uri.
CREAREA APPLET-URILOR
Un program Java contine o metoda main(), folosita pentru crearea obiectelor, stabilirea
variabilelor de instanta si apelarea altor metode.
Applet-urile nu poseda o metoda main() care sa fie apelata automat la lansarea programului. In
schimb exista mai multe metode apelate in diferite puncte ale executiei unui applet.
Toate applet-urile sunt subclase ale clasei Applet, care apartine pachetului java.applet. Clasa
Applet prezinta doua tipuri de comportament, care trebuie sa fie comune tuturor applet-urilor:
Cu toate ca un applet poate folosi orice alte clase are nevoie, clasa Applet este clasa principala
care declanseaza executia unui applet. Subclasele pe care le vom crea, apartinand clasei Applet,
vor avea formula:
Toate applet-urile trebuie declarate public deoarece clasa Applet este o clasa publica. Aceasta
cerinta este valabila numai pentru clasa principala a applet-ului; orice alte clase externe pot fi
publice sau private.
Atunci cand un browser compatibil Java intalneste un applet Java intr-o pagina web, clasa
applet-ului este incarcata impreuna cu celelalte clase externe folosite. Browser-ul creaza automat
o instanta a clasei applet-ului si apeleaza metode ale clasei Applet atunci cand au loc anumite
evenimente.
Diferite applet-uri care folosesc aceeasi clasa folosesc instante diferite deci vom putea introduce
mai multe copii ale applet-ului in aceeasi pagina si fiecare se va comporta diferit.
Pagina 65
CURSURI JAVA Alex Tabusca
Un exemplu de astfel de metoda este paint() care este apelata ori de cate ori fereastra applet-ului
trebuie afisata sau redesenata.
In mod prestabilit aceste metode sunt nule – ele nu fac practic nimic. De exemplu metoda
paint(), mostenita de la clasa Applet, este o metoda nula. Pentru a afisa ceva in fereastra applet-
ului metoda paint() trebuie suprascrisa cu un comportament care sa permita afisarea de text,
grafica sau alte elemente.
a. Initializarea
Initializarea apare o data cu incarcarea applet-ului. Initializarea poate consta in crearea obiectelor
de care are nevoie applet-ul, setarea starii initiale, incarcarea unor imagini sau fonturi sau setarea
uno parametri. Pentru a defini codul de initializare al unui applet trebuie suprascrisa metoda
ini():
b. Pornirea
Un applet este pornit dupa initializare. Pornirea poate aparea si daca applet-ul a fost anterior
oprit. De exemplu un applet este oprit daca utilizatorul browser-ului urmeaza o legatura catre o
alta pagina si este pornit din nou atunci cand utilizatorul revine in pagina care contine applet-ul.
Pornirea poate aparea de mai multe ori pe parcursul ciclului de viata al unui applet, insa
initializarea apare doar o data. Pentru a defini codul de pornire al unui applet trebuie suprascrisa
metoda start():
Codul metodei start() poate contine trimiterea anumitor mesaje obiectelor externe sau
specificarea intr-un anumit mod a faptului ca applet-ul isi incepe rularea.
c. Oprirea
Oprirea si pornirea merg una alaturi de cealalta. Oprirea apare atunci cand utilizatorul paraseste
pagina care contine applet-ul curent sau atunci cand applet-ul se opreste singur apeland metoda
stop(). In mod prestabilit orice fire de executie (threads) pe care applet-ul le-a lansat isi vor
continua executia si dupa ce utilizatorul paraseste pagina. Prin suprascriere metodei stop() putem
suspenda executia acestor fire si le putem reporni daca applet-ul este vizualizat din nou. In
continuare se prezinta o forma a metodei stop():
d. Distrugerea
Metoda destroy() permite applet-ului sa-si faca “curatenie” chiar inainte de a se elibera memoria
alocata sau de a parasi browser-ul. Putem folosi aceasta metoda pentru a distruge orice fire de
Pagina 66
CURSURI JAVA Alex Tabusca
executie sau pentru a elibera orice alte obiecte care ruleaza. De obicei nu se suprascrie metoda
destroy() decat daca exista anumite resurse care trebuie neaparat eliberate, cum ar fi fire de
executie create de applet. Pentru a defini codul de distrugere al unui applet trebuie suprescrisa
metoda destroy():
In cursurile anterioare a aparut un element inrudit cu destroy(): metoda finalize(). Diferenta intre
aceste doua metode consta in faptul ca metoda destroy() se aplica doar applet-urilor iar finalize()
este o metoda generica, ce permite unui obiect de orice tip sa-si elibereze resursele.
Java poseda un recuperator automat al resurselor utilizate (garbage collector), care administreaza
memoria in locul nostru. Acesta recupereaza memoria ocupata de resurse dupa ce programul nu
le mai foloseste, asa ca, in mod normal, nu trebuie sa folosim decat foarte rar metode ca
destroy() sau finalize().
e. Desenare
Desenarea este modul prin care un applet afiseaza ceva pe ecran: text, linii, imagini, etc.
Desenarea poate aparea de foarte multe ori pe parcursul ciclului de viata al unui applet: o data
dupa initializarea applet-ului, alta data atunci cand fereastra browser-ului este adusa in prim plan,
alta data atunci cand fereastra browser-ului este mutata si asa mai departe. Pentru a se putea afisa
ceva, metoda paint() din subclasa noastra Applet, trebuie suprascrisa. Metoda paint() arata in
felul urmator:
Trebuie sa observam ca, spre deosebire de celelalte metode descrise anterior, metoda paint()
preia un argument: o instanta a clasei Graphics. Acest obiect este creat si transmis metodei
paint() de catre browser, deci nu trebuie sa ne facem probleme legate de definirea sa. Totusi, nu
trebuie sa uitam sa importam clasa Graphics din pachetul java.awt in codul applet-ului nostru:
import java.awt.Graphics;
1: import java.awt.Graphics;
2: import java.awt.Color;
3: import java.awt.Font;
4:
5: public class Palindrom extends java.applet.Applet {
6: Font f=new Font("TimesRoman",Font.BOLD,36);
7:
Pagina 67
CURSURI JAVA Alex Tabusca
Acest applet suprascrie metoda paint(). Deoarece applet-ul afiseaza doar cateva cuvinte pe ecran
nu este nevoie de nici o initializare. Astfel nu este nevoie de metodele start(), stop() sau init().
Metoda paint() este locul unde se face toata treaba. Obiectul Graphics transmis metodei paint()
pastreaza starea sistemului grafic, prin care se cunosc atributele curente ale suprafetei de
desenare. Starea mai contine si detalii privind fontul curent sau culoarea folosita pentru operatiile
de desenare.
Liniile 9 si 10 definesc fontul si culoarea folosite pentru operatiile grafice. Obiectul Font este
pastrat in variabila de instanta f iar obiectul reprezentand culoarea rosie este memorat in
variabila red a clasei Color.
Linia 11 foloseste fontul si culoarea curente pentru a desena sirul “Go hang a salami, I'm a
lasagna hog" in pozitia 5, 40. Reamintesc ca pozitia 0 pentru x si y este punctul din stanga – sus
al suprafetei de desenare a applet-ului, cu valoarea y crescand in jos asa incat valoarea 40
deplaseaza textul in jos.
Daca implementam in clasa metodele corecte pentru applet – init(), start(), stop(), sau paint() –
atunci applet-ul nostru va functiona corect fara a avea nevoie de un punct de start explicit.
Applet-urile se insereaza intr-o pagina folosind eticheta HTML <applet>, o comanda care
functioneaza asemanator altor elemente HTML. Exista de asemenea diferite utilitare pentru
dezvoltarea de pagini web – ca Microsoft FrontPage sau Macromedia Dreamweaver – care pot fi
folosite pentru a insera applet-uri in paginile noastre web fara a folosi explicit cod HTML.
Scopul tag-ului <applet> este de a pozitiona applet-ul nostru in pagina web si de a controla
modul cum arata acesta in relatie cu celelalte parti ale paginii.
Browser-ele compatibile Java folosesc informatia continuta de aceasta eticheta pentru a gasi si
executa fisierele compilate cu clasele applet-ului.
Eticheta <applet> este de fapt o extensie speciala a limbajului HTML, care permite includerea
applet-urilor Java in paginile web; eticheta este suportata de toate browser-ele compatibile Java.
Mai jos avem codul sursa HTML pentru o pagina in care am inserat applet-ul Palindrom:
<html>
<head>
<title>Pagina cu applet</title>
</head>
<body>
<p>Palindromul prezentat este:<br>
Pagina 68
CURSURI JAVA Alex Tabusca
Fisierul care contine clasa indicata de atributul CODE trebuie sa se afle in acelasi director ca
pagina web care contine applet-ul, cu exceptia cazurilor cand folosim atributul CODEBASE
pentru a specifica un alt director.
WIDTH si HEIGHT sunt atribute necesare deoarece browser-ul trebuie sa stie cat spatiu sa aloce
applet-ul in pagina. Este usor sa desenam intr-o zona exterioara ferestrei applet-ului asa ca
trebuie sa ne asiguram ca am prevazut o fereastra suficient de mare.
Intre etichetele <applet> si </applet> pot fi incluse si alte elemente de pagina web, cum ar fi text
sau imagini. Acestea sunt afisate in pagina web doar de browser-ele care nu sunt compatibile
Java; este in general bine sa le includem deoarece utilizatorii sunt astfel anuntati ca nu pot vedea
un applet pentru ca browser-ul lor nu este pus la curent. Daca nu specificam nimic intre aceste
doua etichete browser-ele incompatibile Java nu vor afisa nimic in locul applet-ului.
In exemplul de mai sus cei care nu au browser compatibil Java vor vedea textul:
in locul applet-ului.
Cele trei atribute ale tag-ului <applet> prezentate mai sus sunt cele de baza; totusi, eticheta
<applet> contine si alte atribute, care pot ajuta la integrarea mai eficienta a applet-ului in
structura generala a paginii web:
a. atributul ALIGN
Acest atribut defineste modul cum va fi aliniat applet-ul in pagina web, relativ la celelalte
elemente ale paginii ; atributul poate lua urmatoarele valori:
- left - aliniaza applet-ul la stanga textului care urmeaza in pagina dupa applet
- right - aliniaza applet-ul la dreapta textului care urmeaza in pagina dupa applet
- texttop - aliniaza partea superioara a applet-ului cu partea superioara a celui mai inalt
text de pe linie
- top - aliniaza applet-ul cu cel mai de sus element prezent pe linie (un alt applet, o
imagine sau un text)
- absmiddle - aliniaza mijlocul applet-ului cu mijlocul celui mai mare element de pe linie
- middle - aliniaza mijlocul applet-ului cu mijlocul liniei de baza a textului
- baseline - aliniaza partea inferioara a applet-ului cu linia de baza a textului
- bottom - acelasi lucru ca si baseline
- absbottom - aliniaza partea inferioara a applet-ului cu cel mai de jos element de pe linie
Pentru a finaliza formatarea specifica prin atributul ALIGN, putem folosi eticheta de terminare
de rand <br>, impreuna cu atributul CLEAR, acesta din urma putand lua trei valori:
Pagina 69
CURSURI JAVA Alex Tabusca
- left - continua afisarea restului paginii web la urmatoarea margine libera din stanga
- right - continua afisarea restului paginii web la urmatoarea margine libera din dreapta
- all - continua afisarea restului paginii web la urmatoarea margine libera din stanga si din
dreapta
Atributele HSPACE si VSPACE sunt folosite pentru a determina spatiul, in numar de pixeli, intre
applet si textul inconjurator.HSPACE controleaza spatiul orizontal in stanga si in dreapta applet-
ului iar VSPACE controleaza spatiul vertical existent deasupra si dedesuptul applet-ului.
c. CODE SI CODEBASE
Aceste doua atribute sunt folosite pentru a indica unde pot fi gasite fisierele cu clasa principala a
applet-ului si alte fisiere necesare rularii acestuia. Aceste atribute sunt folosite de un browser
Java in momentul in care incearca sa ruleze applet-ul.
CODE indica numele fisierului care contine clasa principala a applet-ului. Cand CODE este
folosit fara atributul optional CODEBASE fisierul care contine clasa va fi cautat in acelasi loc in
care se afla pagina web care contine applet-ul.
In cadrul atributului CODE trebuie specificata si extensia .class.
Atributul CODEBASE se foloseste pentru a indica browser-ului sa caute applet-ul si alte fisiere
necesare rularii acestuia intr-un alt director. CODEBASE indica un alt director sau chiar un alt
site de unde urmeaza a se incarca clasele:
Trebuie mentionat ca eticheta <applet> este folosita special pentru a insera programe Java in
paginile web. In prezent exista si alte tipuri de programe care ruleaza interactiv intr-o pagina.
Pentru a trata toate aceste tipuri de programe fara a fi nevoie de cate o eticheta pentru fiecare
explicit, specificatiile HTML au introdus si eticheta <object>.
Aceasta eticheta este folosita pentru toate obiectele – programe interactive sau alte elemente
externe – care pot fi prezente drept parte a unei pagini web.
- atributul code trebuie inlocuit cu classid; in plus, inainte de numele clasei applet-ului
trebuie specificat “java:”.
- eticheta <applet> se inlocuieste cu <object>
Pagina 70
CURSURI JAVA Alex Tabusca
Parametrii unui applet sunt compusi din doua parti:un nume, care este ales de dumneavoastra, si
o valoare, care determina valoarea respectivului parametru.De exemplu, putem indica intr-un
applet culoarea unui text folosind un parametru cu numele culoare si valoarea rosu.Putem
determina viteza de derulare a unei animatii folosind un parametru cu numele viteza si o anumita
valoare.
In fisierul HTML care contine applet-ul, fiecare parametru este indicat folosind eticheta
<param>, care contine doua atribute, pentru nume si valoare, denumite NAME si
VALUE.Eticheta <param> se introduce intre etichetele <applet> de inceput si de sfarsit de
container:
Exemplul de mai sus defineste doi parametri pentru applet-ul “Clasa”:unul, denumit font, care
are valoarea TimesRoman si celalalt, denumit dim, care are valoarea 24.
Folosirea etichetei <param> este aceeasi pentru applet-urile care folosesc tag-ul object> in loc de
<applet>.
Parametri sunt transmisi applet-ului la incarcarea acestuia.In metoda init() a applet-ului putem
obtine acesti parametri folosind metoda getParameter().Aceasta preia ca argument un sir ce
reprezinta numele parametrului cautat si intoarce un sir care contine valoarea respectivului
parametru.Pentru a obtine valoarea parametrului font din fisierul HTML de mai sus, metoda
init() ar trebui sa contina:
Retineti ca daca parametrul asteptat nu a fost specificat in fisierul HTML, metoda getParameter()
intoarce valoarea null.De obicei, ar trebui testata valoarea null a parametrului si sa oferim o
valoare implicita.ca in exemplul de mai jos:
if (numeFont==null)
Pagina 71
CURSURI JAVA Alex Tabusca
numeFont=”Courier”;
Mai trebuie reamintit din nou ca metoda getParameter() returneaza un sir ; daca dorim ca
parametrul sa fie de alt tip de obiect sau data trebuie sa il convertim explicit.Pentru a trata
parametrul dim si a-l atribui unei variabile intregi, numita dimensiunea, am putea folosi
urmatorul cod:
int dimensiunea ;
String s = getParameter(“dim”);
if (s==null)
dimensiunea =12;
else
dimensiunea = Integer.parseInt(s);
Primul lucru pe care trebuie sa il adaugam acestei clase este o variabila in care va fi pastrata
valoarea parametrului Palindrom.Deoarece vom folosi acest nume in cadrul applet-ului, vom
adauga o variabila de instanta dupa numele variabilei pentru font:
String Palindrom;
Pentru a seta valoarea numelui, trebuie sa obtinem parametrul.Cel mai bun loc de obtinere a
parametrilor applet-ului este in cadrul metodei init().Metoda init() este definita asemanator cu
paint() – publica, fara argumente si fara tip de retur.De asemenea trebuie sa ne asiguram ca
testam valoarea null a parametrului.Daca Palindromul nu este specificat se va afisa implicit
textul “Dennis and Edna sinned”, ca in exemplul de mai jos:
O data adaugata aceasta metoda tot ce na mai ramane este sa modificam metoda paint().Metoda
originala drawString() arata astfel:
Pentru a desena noul sir pe care il stocam in variabila de instanta Palindrom, tot ceea ce trebuie
sa facem este sa inlocuim variabila cu sirul:
ecran.drawString(Palindrom,5,40);
1: import java.awt.Graphics;
2: import java.awt.Color;
3: import java.awt.Font;
Pagina 72
CURSURI JAVA Alex Tabusca
4:
5: public class PalindromNou extends java.applet.Applet {
6: Font f=new Font("TimesRoman",Font.BOLD,36);
7: String Palindrom;
8: public void paint(Graphics ecran) {
9: ecran.setFont(f);
10: ecran.setColor(Color.red);
11: ecran.drawString(Palindrom,5,40);
12: }
13: public void init() {
14. Palindrom = getParameter(“Palindrom”);
15. if (Palindrom==null)
Palindrom=”Dennis and Edna sinned”;
16: }
17: }
<html>
<head>
<title>Pagina noua cu Palindrom</title>
</head>
<body>
<p>
<applet code=”PalindromNou.class” width=600 height=100>
<param name=Palindrom value=”No sir prefer prison”>
Browser-ul nu suporta Java
</applet>
</body>
</html>
Daca nu este specificata nici o valoare pentru parametrul Palindrom textul implicit este “Dennis
and Edna sinned”.
Serverul web trebuie configurat pentru a oferi applet-uri Java browser-elor ce suporta acest
limbaj.
Pagina 73
CURSURI JAVA Alex Tabusca
- toate fisierele.class folosite de applet si care nu fac parte din biblioteca de clase standard
a Java
In general daca stim cum sa publicam o pagina web, fisiere cu imagini si alte elemente
multimedia vom putea sa publicam fara probleme si applet-uri Java pe site-ul nostru.
ARHIVE JAVA
Modalitatea standard de amplasare a unui applet Java intr-o pagina web este de a folosi etichetele
<applet> si <object> pentru a indica numele clasei primare a applet-ului.Se foloseste apoi un
browser compatibil Java care transfera si executa applet-ul.Orice alte clase sau fisiere folosite de
applet sunt transferate de pe serverul web.
Problema cu rularea in acest fel a applet-urilor este ca fiecare fisier de care are nevoie applet-ul,
fie acesta o clasa externa, un fisier imagine, audio, text sau orice altceva – necesita o conexiune
separata de la browser la serverul web care contine fisierul.Deoarece intervalul de timp necesar
pentru a stabili conxiunile acestea nu este neglijabil acest lucru poate mari timpul total pentru
transferul applet-ului si fisierelor sale pana la durate inacceptabile.
Solutia acestei probleme este crearea unei arhive Java, adica un fisier JAR.O arhiva Java
reprezinta o colectie de clase Java si alte fisiere, impachetate intr-un singur fisier.Folosind o
arhiva Java browser-ului ii este suficienta o singura conexiune la serverul web.Reducand
numarul de fisiere transferate de pe server appelt-ul poate fi incarcat si rulat mai rapid.Arhivele
Java pot fi si comprimate, scazandu-le astfel dimensiunea si micsorandu-se timpul de transfer –
dar in schimb va dura ceva mai mult din partea browser-ului decomprimarea inainte de rulare.
Pentru a crea arhive JAR putem folosi utilitarul JAVA denumit jar, care poate impacheta sau
despacheta fisierele in/din arhive Java.Urmatoarea comanda impacheteaza toate clasele si
imaginile.gif dintr-un director intr-o singura arhiva Java, denumita Animat.jar:
Argumentul cf specifica doua optiuni in linie de comanda care sunt folosite de programul
jar.Optiunea c indica faptul ca arhiva Java trebuie creata iar f arata ca unul dintre urmatoarele
argumente din linia de comanda reprezinta numele arhivei.
Putem, de asemenea, adauga intr-o arhiva Java alte fisiere folosind comanda:
Ruland utilitarul jar fara nici un argument vom obtine list a de optiuni care pot fi folosite.
Dupa ce am creat arhiva Java, in eticheta <applet> se foloseste atributul ARCHIVE pentru a
indica locul unde se gaseste arhiva.Putem folosi arhiva Java in felul urmator:
Aceasta eticheta specifica faptul ca arhiva numita Smiley.jar contine fisierele folosite de
applet.Browser-ele si utilitarele de navigare care suporta fisiere JAR stiu sa caute in interiorul
arhivelor fisierele necesare pe timpul rularii applet-ului.
Pagina 74
CURSURI JAVA Alex Tabusca
OBS:cu toate ca o arhiva Java poate contine fisiere clasa atributul ARCHIVE nu presupune
eliminarea atributului CODE.Pentru a o incarca browser-ul trebuie totusi sa stie numele clasei
principale a applet-ului.
Pagina 75
CURSURI JAVA Alex Tabusca
CURSUL VII
In exemplul urmator avem un applet care foloseste drawString() pentru a afisa un text:
import java.awt.Graphics;
public class Harta extends java.applet.Applet {
public void paint(Graphics ecran) {
ecran.drawString("Harta",185,75);
}
}
Pentru a insera acest applet trebuie sa cream un fisier HTML ca cel de mai jos:
<body bgcolor=c4c4c4>
<div align=center>
<applet code="Harta.class" height=350 width=350>
</applet>
</div>
</body>
Toate comenzile de baza de desenare sunt metode ale clasei Graphics, apelate din cadrul metodei
paint().Acesta este locul ideal unde se pot desfasura toate operatiile de desenare deoarece metoda
este apelata automat oricand este nevoie de reimprospatarea ferestrei appletului.Daca fereastra
altui program se suprapune peste applet si acesta trebuie redesenat, introducerea tuturor
operatiilor de desenare in metoda paint() asigura ca nici o parte a ferestrei nu va fi eventual
stricata.
DESENAREA SI UMPLEREA
Pentru majoritatea formelor pe care putem sa le desenam intr-un applet exista doua tipuri de
metode:de desenare - care deseneaza conturul formei, si de umplere - care umplu forma cu
culoarea curenta.In fiecare tip de metoda, conturul obiectului este desenat si el cu culoarea
curenta.
Pagina 76
CURSURI JAVA Alex Tabusca
LINIILE
Metoda drawLine() este folosita pentru a desena o linie intre doua puncte.Metoda primeste patru
argumente:coordonatele x, y ale punctului de inceput si coordonatele x, y ale punctului final:
ecran.drawLine(185,80,222,80);
DREPTUNGHIURI
Clasa Graphics contine metode pentru doua tipuri de dreptunghiuri:normale si cu colturile
rotunjite.
Ambele tipuri de dreptunghiuri pot fi desenate sub forma de contur sau umplute cu culoarea
curenta.
Pentru a desena un dreptunghi normal se foloseste metoda drawRect() pentru contururi si
fillRect() pentru forma umplute.
Ambele metode preiau patru argumente:
- coordonatele x si y ale coltului din stanga-sus al dreptunghiului
- latimea dreptunghiului
- inaltimea dreptunghiului
ecran.drawRect(2,2,345,345);
ecran.drawRoundRect(182,61,43,24,10,8);
Rezultatul acestei instructiuni este desenarea unui dreptunghi rotunjit cu o latime de 43 de pixeli
si o inaltime de 24 de pixeli.Zona dreptunghiulara pentru fiecare colt rotunjit este de 10 pixeli
latime si 8 inaltime.
POLIGOANE
Poligoanele se realizeaza cu metodele drawPolygon() si fillPolygon().
Pentru a realiza desenarea avem nevoie de coordonatele x si y ale fiecarui punct care defineste
colturile poligonului.Poligoanele pot fi definite ca o serie de linii interconectate.
Putem specifica aceste coordonate in doua moduri:
Pagina 77
CURSURI JAVA Alex Tabusca
A doua metoda este mai flexibila deoarece permite adaugarea individuala a punctelor unui
poligon inainte de desenarea sa.
In afara de coordonatele x si y trebuie sa specificam si numarul de puncte al poligonului.Nu se
pot specifica mai multe coordonate x, y decat numarul de puncte si nici invers.In oricare din
aceste cazuri compilatorul va semnala eroare.
pentru a crea un obiect Poligon primul pas este crearea unui poligon gol, printr-o instructiune
new:
int x[]={10,20,30,40,50};
int y[]={15,25,35,45,55};
int puncte=x.length;
Polygon polig=new Polygon(x,y,puncte);
Dupa crearea obiectului Polygon se pot adauga puncte folosind metoda addPoint().Aceasta preia
ca argumente coordonatele x si y si adauga punctul in poligon:
polig.assPoint(60,65);
Atunci cand obiectul poligon are toate punctele el poate fi desenat folosind una dintre metodele
drawPoliyon() sau fillPolygon().Aceste metode au drept unic argument obiectul Polygon:
ecran.drawPoligon(polig);
Daca folosim metoda drawPolyg() putem inchide poligonul stabilind ultimele coordonate x, y
identice cu primele.Altfel poligonul va ramane deschis.
Metoda fillPolygon() inchide automat forma poligonala fara a mai fi nevoie de specificarea
coordonatei finale identice cu cea initiala.
Incepand cu versiunea 1.1 a Java metoda drawPolygon() inchide si ea automat poligonul, daca
dorim un poligon deschis folosim o alta instructiune:drawPolyline() - cu aceeasi functionare ca
drawPolygon() din Java anterior versiunii 1.1.
int x[]={10,234,253,261,344,295,259,205,211,195,191,120,94,81,12,10};
int y[]={12,15,25,71,209,278,310,274,188,171,174,118,56,68,49,37,12};
int pct=x.length;
Polygon polig=new Polygon(x,y,pct);
ecran.drawPolygon(polig);
Pagina 78
CURSURI JAVA Alex Tabusca
Clasa Plygon face parte din pachetul java.awt, deci acesta trebuie importat prin adaugarea
instructiunii urmatoare la inceputul appletului:
import java.awt.Polygon;
OVALE
Metodele drawOval() si fillOval sunt utilizate pentru a desena cercuri si ovale.
Metodele preia patru argumente:
ecran.fillOval(235,140,15,15);
ecran.fillOval(225,130,15,15);
ecran.fillOval(245,130,15,15);
Acestea sunt metode de umplere iar rezultatul lor vor fi trei cercuri colorate in culoarea curenta.
ARCE DE CERC
Desenarea arcelor de cerc este o operatie ceva mai complexa ; un arc este parte a unui oval, fiind
implementat de fapt ca parte a unui oval partial desenat.
Arcele sunt folosite cu ajutorul metodelor drawArc() si fillArc(), care preiau sase argumente:
Primele patru argumente sunt identice cu cele din cazul ovalelor si au acelasi rol ca si in acel caz.
Unghiul de inceput al arcului ia valori intre 0 si 359 de grade si creste in sens trigonometric
(invers acelor de ceas).Pe un cerc de forma unui ceas putem vedea 0 grade in dreptul orei 3, 90
de grade la ora 12, 180 de grade la ora 9 si 270 de grade la ora 6.
numarul de grade pe care se intinde arcul ia valori de la 0 la 359 tot in sens contrar acelor de ceas
sau de la 0 la -359 in sensul acelor de ceas.
Arcele umplute sunt desenate ca si cand ar fi felii dar, in loc sa se uneasca direct cele doua
puncte terminale acestea sunt unite prin intermediul centrului formei eliptice (ovalului).
ecran.drawArc(20,25,315,150,5,-190);
Pagina 79
CURSURI JAVA Alex Tabusca
Aceasta instructiune deseneaza un arc oval cu coordonatele 20 si 25, o latime de 315 pixeli si o
inaltime de 150 pixeli.Arcul incepe la valoarea de 5 grade si se intinde pe o distanta de 190 de
grade in sensul acelor de ceas.
- ovalul fiecarui arc are o latime si o inaltime egale cu 10 pixeli, deci ovalul devine de fapt
cerc
- fiecare arc va incepe la 0 grade si va merge 180 de grade in sensul acelor de ceas
desenand un semicerc
for(int ax=50;ax<150;ax+=10)
for (int ay=120;ay<320;ay+=10)
ecran.drawArc(ax,ay,10,10,0,-180);
COPIEREA SI STERGEREA
Clasa Graphics contine si cateva functii de gen cut&paste, aplicabile ferestrei appletului:
- metoda copyArea() - care copiaza o regiune dreptunghiulara a ferestrei intr-o alta regiune
a ferestrei
- metoda clearRect() - care decupeaza o regiune dreptunghiulara din fereastra appletului
Urmatoarea instructiune copiaza o regiune de 100 pe 100 de pixeli intr-o zona aflata cu 50 de
pixeli mai la dreapta si cu 25 de pixeli mai jos:
ecran.copyArea(0,0,100,100,50,25);
Metoda clearRect() preia aceleasi patru argumente ca si metoda drawRect() sau fillRect(),
umpland regiunea dreptunghiulara astfel creata cu culoarea curenta de fundal a appletului.
Daca dorim sa stergem intreaga fereastra applet putem determina mai intai dimensiunea ferestrei
folosind metoda size().Aceasta returneaza un obiect Dimension, care poseda variabilele width si
height ; acestea reprezinta dimensiunile appletului.
ecran.clearRect(0,0,size().width,size().height);
In versiunile mai noi de Java compilatorul ne va anunta ca functia size() este depreciata, ea
putand fi inlocuita cu getSize(), care functioneaza identic.
Pagina 80
CURSURI JAVA Alex Tabusca
TEXT SI FONTURI
Obiectele clasei java.awt.Font sunt folosite pentru a putea utiliza metoda drawString() cu diferite
tipuri de caractere.Obiectele Font contin numele, stilul si dimensiunea in puncte a unui font.O
alta clasa, FontMetrics, ofera metode pentru determinarea dimensiunilor si a caracterelor
afisabile cu un anumit font, care pot fi folosite pentru formatarea sau centrarea textului.
- numele fontului
- stilul fontului
- dimensiunea in puncte a fontului
Numele poate fi denumirea unui font specifc - de exemplu Arial sau Garamond - care va poutea
fi folosit daca este disponibil pe sistemul unde ruleaza programul.Exista si alte nume care pot fi
folosite pentru selectarea fonturilor interne ale Java:TimesRoman, Helvetica, Courier, Dialog si
DialogInput.
In versiunile mai noi de Java numele fonturilor TimesRoman, Helvetica si Courier trebuie
inlocuite cu serif,sanserif si monospaced.
Stilul de font poate avea trei valori, apelate folosind constantele Font.PLAIN, Font.BOLD si
Font.ITALIC.Aceste constante sunt intregi si pot fi insumate pentru a obtine o combinatie de
efecte.
Dimensiunea fontului este data in puncte, ca in exemplul de mai jos care implementeaza un font
Dialog de 24 de puncte, cu caractere bold si italice:
ecran.setFont(f);
Textul poate fi afisat intr-o fereastra applet cu ajutorul lui drawString().Aceasta functie foloseste
fontul curent selectat - sau cel implicit.
Urmatoarea metoda paint() creaza un nou obiect Font, stabileste fontul curent la acest obiect si
afiseaza un text la coordonatele 10, 100:
Valoarea x reprezinta locul de inceput al marginii din stanga a textului iar y este valoarea la care
se afiseaza linia de baza a sirului de text.
Pagina 81
CURSURI JAVA Alex Tabusca
Pentru a folosi metodele acestei clase, trebuie mai intai creat un obiect FontMetrics prin metoda
getFontMetrics().Aceasta metoda primeste un singur argument:un obiect Font.
Un obiect FontMetrics poate apela mai multe metode:
import java.awt.Font;
import java.awt.Graphics;
import java.awt.FontMetrics;
Determinarea dimensiunii ferestrei appletului in cadrul sau este preferabila metodei de definire a
unei dimensiuni statice in applet, deoarece este mai flexibila.Putem modifica codul sursa HTML
al appletului in pagina web fara a modifica si programul nostru, acesta functionand in continuare
corect.
CULORI
Clasele Color si ColorSpace din pachetul java.awt pot fi folosite pentru a aduce culoare in
appleturi si aplicatii.Cu ajutorul acestor clase putem stabili culorile curente folosite in operatiile
de desenare, ca si culoarea de fundal pentru un applet sau alte ferestre.De asemenea putem
translata o culoare dintr-un sistem de descriere in altul.
In mod prestabilit Java foloseste culorile conform sistemului RGB.In acest sistem o culoare este
descrisa prin cantitatea de rosu, verde si albastru pe care o contine (red - green - blue).Fiecare
dintre cele trei componente poate fi reprezentata cu un intreg din gama 0 - 255.Combinatia 0,0,0
reprezinta negru.Putem specifica o combinatie RGB si prin trei valori in virgula mobila, in gama
0 - 1.
Un alt sistem de culori - sau spatiu de culori - este CYMK, care specifica o culoare prin
cantitatea de azuriu (cyan), mov (magenta), galben (yellow) si negru (black).
Java2 suporta folosirea oricarui tip de spatiu de culori atata timp cat folosim un obiect
ColorSystem care defineste sistemul respectiv de descriere a culorilor.
Reprezentarea interna a culorilor in Java folosind RGB este spatiul de culoare utilizat in program
; dispozitivele de iesire pot avea si ele propriile spatii de culoare.
Pagina 82
CURSURI JAVA Alex Tabusca
In practica o culoare definita RGB poate sa apara usor diferit pe un alt dispozitiv de iesire decat
monitorul.Pentru un control mai bun asupra culorii putem folosi ColorSpace sau alte clase din
pachetul java.awt.color.
Pentru a crea o culoare avem doua metode de apelare a metodei constructor Color:
- black, blue, cyan, darkGray, gray, green, lightGray, magenta, orange, pink, red, white,
yellow.
Urmatoarea instructiune stabileste culoarea curenta pentru obiectul ecran folosind una dintre
variabilele standard de clasa:
ecran.setColor(Color.pink);
Din acest moment toate operatiile de desenare vor folosi aceasta culoare.
Putem stabili culoarea de fundal intr-o fereastra applet folosind metodele setBackground() si
setForeground().Acestea sunt mostenite de clasa Applet de launa dintre superclasele sale asa
incat toate appleturile create vor mosteni si ele aceste metode.
Pagina 83
CURSURI JAVA Alex Tabusca
Daca vrem sa aflam care este culoarea curenta putem folosi culoarea getColor() pentru un obiect
grafic, respectiv una dintre metodele getForeground() sau getBackground() pentru clasa Applet.
Urmatoarea instructiune stabileste culoarea curenta pentru ecran - un obiect Graphics - ca fiind
aceeasi cu fundalul appletului:
ecran.setColor(getBackground());
Pentru toate operatiile de desenare de pana acum singurul spatiu de coordonate folosit era cel al
dispozitivului.Se specificau coordonatele x si y ale unei suprafete de iesire - ca fereastra Applet -
si aceste coordonate erau folosite pentru a desena linii, text si altele.
Java2D are nevoie de un al doilea spatiu de coordonate, la care facem referire atunci cand cream
si desenam un obiect.Acesta este numit spatiu de coordoante al utilizatorului.
Inainte de a folosi operatii de desenare Java2D in program, spatiul dispozitivului si cel al
utilizatorului au puctul de coordonate 0, 0 in acelasi lod, coltul din stanga-sus al zonei de
desenare.
Coordonata 0,0 a spatiului utilizator se poate depalsa ca urmare a unei operatii de desenare
2D.Chiar si axele x, y se pot modifica drept urmare a unei rotiri 2D.
Obiectul ecran2D din exemplul nostru a fost produs printr-o conversie cast.El este obiectul
ecran, convertit dintr-o clasa in alta.
Toate operatiile grafice Java2D trebuie apelate pentruun obiect Graphics2D ; aceasta clasa,
Graphics2D, face si ea parte din java.awt.
Pagina 84
CURSURI JAVA Alex Tabusca
CULORI 2D
Culorile sunt specificate folosind metoda setColor(), care funtioneaza la fel cu metoda Graphics
cu acelasi nume - diferenta constand in obiectul argument care acum este de tip Graphics2D.
MODELE DE UMPLERE
Texturile sau modelele de umplere, definesc modul cum este umplut un obiect.In Java2D putem
folosi o culoare solida, un degrade, o textura sau un model oarecare.
Un model de umplere este definit prin folosirea metodei setPaint() a clasei Graphics2D, avand ca
argument un obiect Paint.Interfata Paint este implementata de fiecare clasa care poate juca rolul
unui model de umplere - ca de exemplu GradientPaint, TexturePaint sau Color.
O umplere in degrade inseamna o trecere gradata de la o culoare la alta intre doua
coordonate.Aceasta deplasare a culorii poate aparea o singura data intre cele doua coordonate,
caz in care se numeste aciclica sau poate apare in mod repetat, caz in care se numeste ciclica.
Punctele de coordonate dintr-un degrade nu se refera direct la punctele obiectului Graphics2D pe
care desenam.De fapt ele se refera la spatiul utilizator si se pot afla chiar in afara obiectului ce
urmeaza a fi umplut cu respectivul degrade.
GradientPaint(x1,y1,culoare1,x2,y2,culoare2);
Punctul x1,y1 este punctul de unde incepe culoare culoare1 iar x2,y2 este punctul unde se
termina trecerea la culoare2.
GradientPaint(x1,y1,culoare1,x2,y2,culoare2,true);
Ultimul argument este o valoare booleana care are valoarea true pentru degrdeul ciclic ;
argumentul false poate fi folosit pentru varianta aciclica sau poate fi omis.
Dupa ce am definit un obiect GradientPaint il vom declara atribut curent de desenare cu
setPaint():
Toate operatiile de desenare care vor urma pentru obiectul ecran2D vor folosi acest model de
umplere.
Pagina 85
CURSURI JAVA Alex Tabusca
Stilurile de terminatie (endcap) sunt aplicate liniilor care nu se conecteaza la alte linii.Stilurile de
imbinare (juncture) sunt aplicate capetelor de linie care se conecteaza la alte linii.
Stilurile posibile pentru terminatii sunt CAP_BUTT (fara terminatie), CAP_ROUND (pentru
terminatii circulare) si CAP_SQUARE (pentru terminatii rectangulare)
Diferenta intre primul si ultimel stil este foarte mica, o linie cu CAP_SQUARE fiind mai lunga,
datorita terminatiei de forma patrata.
Exemplul de mai jos creaza un obiect BasicStroke si il stabilesc drept stil de tusa curent:
BasicStroke creion=BasicStroke(2.0f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND);
ecran2D.setStroke(creion);
Efectul liniilor de mai sus este o tusa de 2 pixeli, terminatii netede ale segmentelor si colturi de
imbinare rotunjite.
Clasa Graphics2D nu poseda metode diferite pentru desenarea fiecareia dintre forme.In schimb
se defineste mai intai forma dorita si apoi se foloseste ca argument pentru una dintre metodele
fill() sau draw().
LINII
Se creaza folosind clasa Line2d.Float.Aceasta clasa preia patru argumente:coordonetele x, y ale
unui capat de segment si coordonatele x, y ale celuilalt capat:
Aceasta instructiune creeaza o linie intre punctele 60,5 si 13,28.Mentionam utilizarea literei f
pentru specificarea tipului float pentru argumente.
DREPTUNGHIURI
Acestea sunt create folosind clasele Rectangle2D.Float sau Racrtangle2D.Double.Diferenta intre
cele doua este tipul argumentelor.
Pagina 86
CURSURI JAVA Alex Tabusca
ELIPSE
Obiectele ovale sunt numite in Java2D elipse si pot fi create cu clasa Ellipse2D.Float.Este nevoie
de patru argumente:coordonatele x, y, latimea si inaltimea.
Instructiunea de mai jos creaza o elipsa la coordonata 113,25 cu o latime de 22 pixeli si o
inaltime de 40 pixeli:
ARCE
Acestea sunt create prin clasa Arc2D.Float.Sunt create asemanator cu versiunea lor non-2D dar
cu o diferenta:putem stabili modul de inchidere.
Arc2D.Float primeste sapte argumente.Primele patru se refera la elipsa din care face parte
arcul:coordonatele x, y, latimea si inaltimea.Ultimele trei se refera la unghiul de unde incepe
desenarea, numarul de grade pe care se intinde si un intreg care stabileste modul de inchidere.
Exista o deosebire fata de arcele non-2D:numarul de grade pe care se intinde arcul 2D este
specificat ca avand sensul pozitiv in sensul acelor de ceas.
Ultimul argument foloseste una dintre variabilele de clasa:Arc2D.OPE (pentru arc dechis),
Arc2D.CHORD (pentru un arc ale carui capete sunt unite printr-o linie dreapta) si Arc2D.PIE
(pentru un arc cu capetele unite prin intermediul centrului elipsei.Mai trebuie mentionat ca stilul
de inchidere Arc2D.OPEN nu se aplica arcelor umplute ; un astfel de arc umplut va fi autonat
inchis cu stilul Arc2D.CHORD.
Instructiunile de mai jos creaza un arc dintr-o elipsa cu coordonatele 27,22, 42 de pixeli latime si
30 inaltime.Arcul incepe la 33 de grade, se intinde pe 90 de grade in sensul acelor de ceas si va fi
inchis prin intermediul centrului elipsei:
POLIGOANE
Acestea sunt create in Java2D prin deplasarile dintr-un punct al poligonului in altul.Un poligon
poate fi format din linii drepte, curbe patratice sau curbe Bezier.
Deplasarile necesare pentru crearea poligonului sunt definite in obiectul GeneralPath, care
apartine pachetului java.awt.geom.
Metoda moveTo() a clasei GeneralPath este folosita pentru a crea primul punct al
poligonului.Urmatoarea instructiune poate fi folosita pentru a incepe poligonul de la
coordonatele 5,0:
polig.moveTo(5f,5f);
Dupa crearea primului punct, metoda lineTo() se foloseste pentru crearea unei linii care incepe
din punctul curent si se termina intr-un nou punct.Metoda primeste doua argumente:coordonatele
x si y ale noului punct.
Urmatoarele instructiuni creaza trei linii pentru obiectul polig:
Pagina 87
CURSURI JAVA Alex Tabusca
polig.lineTo(205f,0f);
polig.lineTo(205f,90f);
polig.lineTo(5f,90f);
Metodele lineTo() si moveTo() primesc ca argumente ale coordonatelor valori float().Daca vrem
sa inchidem un poligon se poate folosi metoda closePath() fara nici un argument:
polig.closePath();
Aceasta metoda inchide un poligon prin conectarea punctului curent cu punctul specificat in cel
mai recent apel de metoda moveTo().Putem inchide poligonul si fara aceasta metoda, prin
folosirea metodei LineTo() care conecteaza punctul curent cu punctulinitial al poligonului.
O data creata forma poligonala ea poate fi reprezentata (desenata) ca orice alt obiect, cu
metodele fill() sau draw().
DESENAREA OBIECTELOR
Toate obiectele pe care le vom desena in continuare folosesc metode ale clasei
Graphics2D:draw() si fill().Aceste metode primesc ca unic argument obiectul ce trebuie desenat.
Sirurile sunt desenate in Java2D tot cu drawString().Aceasta preia trei argumente:obiectul String
si coordonatele x si y - cu mentiunea ca aceste coordonate sunt de tip float, ca la toate
coordonatele din Java2D.
import java.awt.*;
import java.awt.geom.*;
Pagina 88
CURSURI JAVA Alex Tabusca
f1.lineTo(344F,209F);
f1.lineTo(336F,278F);
f1.lineTo(295F,310F);
f1.lineTo(259F,274F);
f1.lineTo(205F,188F);
f1.lineTo(211F,171F);
f1.lineTo(195F,174F);
f1.lineTo(191F,118F);
f1.lineTo(120F,56F);
f1.lineTo(94F,68F);
f1.lineTo(81F,49F);
f1.lineTo(12F,37F);
f1.closePath();
ecran2D.fill(f1);
//Desenare elipse
ecran2D.setColor(Color.black);
BasicStroke creion2=new BasicStroke();
ecran2D.setStroke(creion2);
Ellipse2D.Float e1=new Ellipse2D.Float(235,140,15,15);
Ellipse2D.Float e2=new Ellipse2D.Float(225,130,15,15);
Ellipse2D.Float e3=new Ellipse2D.Float(245,130,15,15);
ecran2D.fill(e1);
ecran2D.fill(e2);
ecran2D.fill(e3);
}
}
Pagina 89
CURSURI JAVA Alex Tabusca
CURSUL VIII
- desenarea
- comandarea sistemului de ferestre pentru a afisa desenul realizat anterior
Odata cu utilizarea firelor de executie trebuie sa facem unele modificari in fisierul nostru clasa:
Pagina 90
CURSURI JAVA Alex Tabusca
Runnable este o interfata ; ea reprezinta sistemul prin care o clasa poate mosteni metode pe care
altfel nu le-ar fi mostenit de la superclasele sale.Aceste metode pot fi astfel disponibile oricarei
metode care are nevoie de ele.Runnable contine o metode run() de care avem nevoie pentru a
porni un fir de executie si de aceea trebuie implementata aceasta interfata in cazul nostru.
Thread este o clasa din pachetul java.lang - asa incat nu avem nevoie de o instructiune import
pentru a o utiliza.De obicei obiectul de tip Thread se creaza in metoda start() si va avea o valoare
null pana la crearea efectiva a obiectului - creare care se face tot in metoda start().Pentru a rula
un fir de executie creat avem nevoie de metoda sa start():
obiect_thread.start();
Apelarea acestei metode duce la apelarea metodei run() - mostenita prin interfata Runnable.
Metoda run() este cea mai importanta a appletului devenit fir de executie.Ea este folosita pentru
a controla secventele animatiei prin stabilirea tuturor operatiilor legate de desenare si de
modificarile intre secventele de animatie.
Dupa definirea in metoda run() a comportamentului necesar firului de executie trebuie sa definim
si metoda stop() - pentru oprirea appletului.
Acest lucru - oprirea - il putem face prin atribuirea valorii null obiectului Thread ; de fapt acest
lucru nu duce la oprirea automata a executie firului dar problema se rezolva prin metoda run()
care va fi creata astfel incat sa permita rularea doar daca obiectul Thread nu este null.
Pentru a clarifica problematica firelor de executie vom prezenta un applet care creaza un ceas - o
animatie simpla - cu actualizari constante.
In cadrul appletului vom folosi un ciclu while care ar putea fi periculos in conditii normale:acest
ciclu ar monopoliza resursele si practic nu am vedea nimic pe ecran deoarece Java ar astepta la
infinit oprirea ciclului.
Appletul va defini un anumit font pentru afisare si un obiect de tip Date care pastreaza data
curenta.Metodele start() si stop() au rolul de a porni si respectiv opri firul de executie.
Metoda run() este cea mai importanta - cea care realizeaza de fapt toata animatia.Aici vom avea
si buclucasul ciclu while de mai sus ; primul lucru facut in ciclu este apelarea repaint() pentru
redesenarea ferestrei.Tot aici vom intalni si o noua metoda:sleep().Aceasta metoda a clasei
Thread determina o pauza in executie.Daca nu s-ar folosi aceasta metoda appletul ar rula la
viteza maxima, lucru care poate sa nu fie conform cu dorinta programatorului.Instructiunile try si
catch vor apare aici pentru tratarea erorilor si pentru moment le putem ignora.
Metoda paint() a appletului creaza o noua instanta a clasei Date - pentru folosirea acestei clase
trebuie sa o importam, ea fiind inclusa in java.util.De asemenea apare si metoda toString() a
clasei Date, necesara pentru afisarea ca sir a datei si orei.La fiecare apelare a metodei paint()
vom avea astfel un nou obiect Date care va tine ora si data curente.
Sa vedem in continuare codul sursa al appletului descris anterior :
import java.awt.*;
import java.util.*;
Pagina 91
CURSURI JAVA Alex Tabusca
Thread executabil;
- suprascrierea metodei update() astfel incat aceasta sa nu mai stearga ecranul sau sa nu
stearga partile de fereastra care nu se vor modifica.
- suprascrierea metodelor paint() si update() impreuna cu folosirea dublei memorari
(double buffering).
Vom prezenta mai intai prima metoda, suprascrierea lui update() - aceasta fiind cea mai simpla ;
in multe cazuri insa ea nu este aplicabila la programe mai complexe si va trebui utilizata cea de a
doua tehnica de mai sus.
Pagina 92
CURSURI JAVA Alex Tabusca
Putem alege o versiune de rezolvare a problemei palpairii prin anularea totala a stergerii
ecranului.Aceasta solutie nu poate fi aplicata pe scara larga dar in cazurile in care se poate aplica
este cea mai simpla solutie.
Sa luam ca exemplu codul sursa de mai jos:
import java.awt.*;
Pagina 93
CURSURI JAVA Alex Tabusca
Pentru a intelege cat mai bine appletul sa incercam un comentariu aproape linie cu linie al
codului sursa:
Cea de a doua metoda de evitare a flickerului este dubla memorare.Aceasta consta in procesul de
a desena un cadru intreg de animatie intr-o zona invizibila inainte de a-l copia in zona vizibila de
pe ecran.Zona invizibila in care lucram se numeste buffer (sau memorie tampon).
Prin aceasta tehnica se creaza practic inca o suprafata de desenare, se fac toate operatiunile de
desenare pe ea dupa care se deseneaza dintr-o data intreaga suprafata in fereastra principala a
appletului - toate acestea in loc sa se deseneze direct in fereastra appletului, pe rand fiecare
element.
Tehnica dublei memorari este destulde performanta, ea reusind sa elimine practic flickerul dar
aduce dezavantajul unei folosiri intensive a memoriei sistemului de calcul.Pentru a crea un
applet bazat pe aceasta tehnica trebuie sa avem o imagine pe care o desenam in buffer si un
context grafic pentru acea imagine.Acestea vor simula efectul desenarii pe suprafata
appletului:contextul grafic (de fapt o instanta a clasei Graphics) care ofera metodele de desen si
obiectul Image, care memoreaza ceea ce se va desena.
Pagina 94
CURSURI JAVA Alex Tabusca
Ca sa reusim implementarea corect a tehnicii de mai sus trebuie sa parcurgem patru etape.
Mai intai imaginea invizibila si contextul grafic trebuie stocate in variabile de instanta care vor
putea apoi fi trimise metodei paint().Acest lucru se face sintactic la modul urmator:
Image imagineInvizibila;
Graphics invizibil;
In al doilea rand pe parcursul initializarii appletului vom crea obiecte Image si Graphics pe care
le vom atribui acestor variabile.Metoda createImage() returneaza o instanta a clasei Image, pe
care apoi o putem transmite metodei getGraphics() pentru a obtine un nou context pentru
imaginea respectiva:
In acest moment, ori de cate ori va trebui sa desenam pe ecran - cu metoda paint() - vom desena
in contextul grafic invizibil ; ca exemplu, pentru a desena o imagine numita img la pozitia
100,100 folosim linia de cod:
invizibil.drawImage(img,100,100,this);
In ceea ce priveste cuvantul cheie this folosit aici nu va faceti probleme pentru ceea ce reprezinta
- va fi prezentat mai detaliat in paginile urmatoare.
Ultima etapa, dupa ce s-a terminat de desenat totul in contextul invizibil, instructiunea urmatoare
copiaza zona tampon invizibila pe ecran:
ecran.drawImage(imagineInvizibila,0,0,this);
Pentru a elimina si umplerea ecranului cu culoarea de fond (operatia default a metodei update())
este indicat sa suprascriem si metoda update() la modul urmator:
Pentru a realiza in practica implementarea dublei memorari vom prezenta un exemplu de applet
care deseneaza si misca un cer intre doua patrate colorate diferit - appletul se numeste "Dame",
dupa asemanarea rezultatului vizual cu o piesa din acest joc:
import java.awt.*;
Pagina 95
CURSURI JAVA Alex Tabusca
invizibil=imgInvizibila.getGraphics();
}
invizibil.setColor(Color.black);
invizibil.fillRect(0,0,100,100);
invizibil.setColor(Color.white);
invizibil.fillRect(100,0,100,100);
invizibil.setColor(Color.red);
invizibil.fillOval(pozX,5,90,90);
ecran.drawImage(imgInvizibila,0,0,this);
}
Pagina 96
CURSURI JAVA Alex Tabusca
- variabila pozX este folosita pentru a muta cercul dintr-un loc in altul, ea pastrand
coordonatele unde se afla piesa la un moment dat.Valoarea variabilei se modifica
continuu in metoda run().
- primul pas pentru dubla memorare consta in crearea unui obiect Image care sa pastreze
cadrul invizibil pana cand acesta este complet si a unui obiect Graphics care sa permita
desenarea in aceasta zona invizibila.Acest lucru il fac liniile:
Image imgInvizibila;
Graphics invizibil;
- metoda paint() este modificata pentru a scrie zona tampon invizibila in locul obiectului
principal Graphics ; practic, doar ultima linie a metodei paint() afiseaza in fereastra
appletului.Aceasta instructiune afiseaza cadrul de animatie complet la coordonatele
0,0.Deoarece obiectul imgInvizibil a fost creat de aceeasi dimensiune ca zona de ecran el
va acoperi complet fereastra appletului.
Pagina 97
CURSURI JAVA Alex Tabusca
Pentru a afisa o imagine in appletul nostru trebuie intai sa o incarca in program din World Wide
Web.Imaginile se vor pastra in fisiere grafice separate de fisierele sursa si compilate Java, asa ca
trebuie specificat clar locul in care le putem gasi.Cand folosim clasa Image fisierele grafice pe
care le utilizam trebuie sa fie de tip.GIF sau.JPG.
O adresa web este reprezentata printr-un obiect URL.Clasa URL face parte din pachetul java.net
care va trebui deci importat pentru a-l pune la dispozitia programului nostru.
Obiectul URL este creat prin transmiterea adresei paginii web ca argument pentru metoda
constructor a clasei URL, ca in exemplul de mai jos:
Dupa ce am creat obiectul URL il putem folosi pentru a crea un obiect Image care reprezinta
propriu-zis fisierul grafic.
Pentru a incarca o imagine noua intr-un obiect Image clasa Applet contine o metoda numita
getImage(), care poate fi folosita in doua moduri:
Ultima metoda este putin mai complicata dar ofera o mai mare flexibilitate.
Clasa Applet poseda doua metode care pot fi folosite pentru a crea o adresa URL de baza fara a
folosi in program o adresa fixa explicita (lucru care ar face ca la orice modificare a adresei
necesitate de applet sa fie necesara si o recompilare a appletului):
Calea relativa catre o resursa se foloseste ca al doilea argument pentru metoda getImage() si se
modifica in functie de ce s-a folosit in primul argument.
Sa luam un exemplu cu o pagina web cu adresa:http://www.site.com/index.html, care incarca o
imagine din acelasi director, imagine numita imagine1.gif.Pentru a folosi aceasta imagine in
appletul nostru ne trebuie o instructiune de genul:
Image imagine=getImage(getDocumentBase(),"imagine1.gif");
Pagina 98
CURSURI JAVA Alex Tabusca
DESENAREA IMAGINILOR
Dupa ce am pus o imagine intr-un obiect Image aceasta poat fi afisata in applet cu metoda
drawImage() a clasei Graphics.Pentru a afisa o imagine la dimensiunile reale vom apela metoda
cu patru argumente:
Daca fisierul grafic trebuie afisat la o alta scara decat originalul trebuie sa folosim sase
argumente pentru metoda drawImage():
Scalarea imaginii are efect doar pentru afisarea in applet, obiectul propriu-zis nefiind alterat de
aceste apeluri de metoda.
Pentru a afla dimensiunile unei imagini afisate avem la dipsozitie metodele getHeight() si
getWidth() care returneaza inaltimea si respectiv latimea imaginii afisate.
Ultiimul argument al metodei drawImage este cuvantul cheie this - element folosit in general
intr-un obiect pentru a face o referinta la el insusi.
Folosirea sa in acest context este necesara pentru a identifica un applet care poate urmari
incarcarea imaginii de pe web.Incarcarea imaginii este urmarita prin intermediul unei interfete
ImageObserver.Clasele care implementeaza aceasta interfata - printre care si Applet - pot observa
gradul de incarcare al unei imagini.Acest lucru poate fi folositor de exemplu pentru un program
care sa afiseze altceva in timpul incarcarii unor imagini (procese care uneori pot dura destul de
mult).
import java.awt.*;
Pagina 99
CURSURI JAVA Alex Tabusca
setBackground(Color.pink);
ecran.drawImage(poza,10,10,latime,inaltime,this);
xPoz+=latime+5;
ecran.drawImage(poza,xPoz,10,latime*4,inaltime*4,this);
}
}
Appletul de mai sus presupune ca dispunem de un fisier grafic numit poza1.gif, pe care dorim sa-
l afisam mai intai la dimensiunile sale reale si apoi cu latime si inaltimea de patru ori mai mari.
Variabila xPoz contine valoarea coordonatei x a locului unde se doreste inceperea afisarii
imaginii.
FOLOSIREA SUNETULUI
Clasa Applet are posibilitatea de a reda si sunet.De la versiunea 2 a limbajului Java putem folosi
fisiere audio in mai multe formate:AIFF, AU, MIDI si WAV.
Cea mai simpla metoda de incarcare si redare a unui sunet este prin utilizarea metodei play() a
clasei Applet.Aceasta metoda are doua forme de apelare:
Instructiunea de mai jos incarca si reda un fisier audio numit sunet.wav, aflat in acelasi director
cu appletul:
play(getCodeBase(),"sunet.wav");
Metoda play() incarca si reda sunetul cat mai repede posibil.In cazul in care fisierul de sunet nu
este disponibil la adresa servita metodei play() nu vom obtine nici un mesaj de eroare - pur si
simplu nu se va auzi nici un sunet !
Avem posibilitatea de a reda continuu un sunet, de a-l porni si a-l opri la dorinta.Acesta lucru se
poate face incarcand fisierul audio intr-un obiect AudioClip, folosind metoda getAudioClip a
acestuia.Clasa AudioClip este inclusa in pachetul java.awt.
Metoda getAudioClip() primeste unul sau doua argumente.Primul argument (care poate fi si
unic) este un obiect URL care identifica fisierul de sunet iar al doilea poate fi o referinta la cale.
In exemplul de mai jos putem vedea cum se incarca un fisier audio - "sunet.wav", aflat intr
subdirectorul "audio" al appletului - intr-un obiect AudioClip:
AudioClip clip=getAudioClip(getCodeBase(),"audio/sunet.wav");
Metoda getAudioClip() poate fi apelata numai in cadrul unui applet.Pentru incarcarea unui fisier
audio intr-o aplicatie independenta Java trebuie sa folosim metoda newAudioClip() a clasei
Applet:
AudioClip clip=newAudioClip("audio/sunet.wav");
Pagina 100
CURSURI JAVA Alex Tabusca
Odata creat obiectul AudioClip putem apela si metodele play(), stop() sau loop() ale
acestuia.Play() reda sunetul, stop() opreste redarea sunetului iar loop() provoaca redarea continuu
a fisierului audio.
Spre deosebire de apelarea simpla play() pentru un anumit fisier de sunet (caz in care inexistenta
fisierului audio nu provoaca nici o eroare) folosirea metodelor getAudioClip() sau
newAudioClip() poate duce la erori in cazul in care fisierul de sunet indicat de argumente nu
exista ; acest lucru se datoreaza faptului ca obiectul AudioClip creat de noi va avea valoarea null,
iar redarea unui obiect null produce o eroare.
In cazul in care vrem sa redam mai multe sunete simultan nu exista nici o problema - vom folosi
mai multe fire de executie.
Trebuie mentionata si o problema - in cazul in care utilizam o redare continuua a unui sunet in
appletul nostru oprirea firului de executie al appletului nu va duce si la oprirea automata a
sunetului.In practica daca un utilizator va trece in alta pagina web sunetul va continua sa se
auda ! Rezolvarea acestei probleme se face prin utilizarea metodei stop() pentru sunetul redat in
acelasi timp cu oprirea firului de executie al appletului.
In continuare avem un exemplu care reda continuu un sunet - sunet1.wav - si o data la fiecare 5
secunde reda si fisierul sunet2.wav:
import java.awt.*;
import java.applet.*;
AudioClip sunetFundal;
AudioClip bip;
Thread executabil;
Pagina 101
CURSURI JAVA Alex Tabusca
Thread firExecutie=Thread.currentThread();
while (executabil==firExecutie) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {}
if (bip!=null) bip.play();
}
}
Pagina 102
CURSURI JAVA Alex Tabusca
CURSUL IX
AWT
Dupa cum am mai spus AWT reprezinta un set de clase care ne ajuta - printre altele - sa cream o
interfata grafica utilizator care sa reactioneze la datele de intrare primite de la mouse sau
tastatura.
Deoarece Java este un limbaj independent de platforma AWT ofera modalitatea de a proiecta o
interfata care sa fie la fel reprezentata si cu aceleasi caracteristici pe orice sistem pe care ar
rula.Folosind pachetul AWT avem de luat in calcul mai multe elemente care compun o interfata
grafica:
Toate clasele AWT sunt bineinteles incluse in pachetul java.awt.Pentru a le putea folosi trebuie
importat acest pachet explicit la inceputul codului nostru sursa.
Importarea intregului pachet are ca rezultat disponibilizarea pentru programator a tuturor
componentelor, containerelor si administratorilor de dispunere folositi pentru realizarea unei
interfete grafice.O alta modalitate de a putea folosi clasele necesare este si importarea
individuala a claselor necesare.
Pagina 103
CURSURI JAVA Alex Tabusca
Datorita faptului ca un Applet este un container putem folosi metoda add() in cadrul unui applet
pentru a adauga o componenta direct in fereastra Applet.
Fiecare componenta AWT la randul ei este o clasa, deci componenta este creata propriu-zis prin
crearea unui obiect al clasei respective.
De exemplu, clasa Button reprezinta butoanele din cadrul unei interfete grafice. Un buton se
creaza specificand eticheta sa in metoda constructorului, ca mai jos:
Parametru de tip string primit de constructor se refera la textul care se va afisa pe suprafata
butonului.
Dupa ce s-a creat componenta cea mai simpla metoda de a o adauga este folosirea metodei add()
cu numele componentei ca argument:
add(butonNou);
import java.awt.*;
ETICHETE
O eticheta este de fapt cea mai simplista componenta a unei intergete grafice, ea fiind
implementata prin clasa Label.Etichetele se folosesc pentru a identifica rolul celorlalte
Pagina 104
CURSURI JAVA Alex Tabusca
componente si nu pot fi modificate direct de utilizator - de fapt reprezinta niste siruri afisate in
dreptul celorlalte componente pentru a ne arata cu ce se ocupa componenta respectiva.
Folosirea etichetelor pentru text se foloseste in locul metodei drawString() din mai multe cauze:
- o eticheta este desenata automat si nu are nevoie de tratare explicita de catre metoda
paint()
- etichetele pot fi dispuse in fereastra conform cu administratorii de dispunere folositi si nu
nevoie de o pozitionare prin coordonate date in pixeli
- Label() - aceasta instructiune creaza o eticheta goala, cu textul aliniat automat la stanga
- Label(sir) - creaza o eticheta cu textul specificat prin variabila de tip String, alinierea
textului fiind la stanga
- Label(sir,argument2) - creaza o eticheta cu sirul dat ca text si cu alinierea indicata de
argumentul al doilea.Pentru a seta alinierea se pot folosi variabilele de
clasa:Label.RIGHT, Label.LEFT si Label.CENTER, care duc la alinierea textului la
dreapta, la stanga si respectiv centrat.
Pentru a modifica textul etichetei dupa crearea acesteia putem folosi metoda setText(sir) ; noul
sir dat ca parametru este afisat dupa reimprospatarea componentei. O alta metoda folositoare este
si getText() care ne returneaza valoarea textului etichetei.
In continuare avem un exemplu de applet in care s-au creat trei etichete ; in codul sursa apare si
un obiect de tip GridLayout - acesta este folosit pentru a putea vedea efectul alinierii etichetelor.
In cazul in care nu l-am fi folosit Java ar fi apelat implicit administratorul FlowLayout care nu
ne-ar mai fi permis sa aliniem etichetele. Administratorii de dispunere vor fi prezentati mai tarziu
detaliat.
import java.awt.*;
Pagina 105
CURSURI JAVA Alex Tabusca
BUTOANE
Un buton reprezinta de fapt o zona pe care putem efectua un clic ; el poate fi creat cu ajutorul
clasei Button.In general aceste butoane sunt folosite pentru a declansa o actiune atunci cand se
efectueaza un clic pe suprafata lor.
Ca sa cream un buton trebuie sa urmam una dintre caile urmatoare:fie apelam constructorul
Button() care ne creaza un buton fara nici un text fie apelam constructorul cu un argument de tip
String care este de fapt chiar textul butonului.
Odata creat acest buton ii mai putem modifica textul cu ajutorul metodei setLabel() sau putem
folosi metoda getLabel() pentru a afla textul acestui buton.
OBS.:setLabel() si getLabel() nu au legatura cu clasa Label, ele se refera doar la clasa Button.
In continuare avem un exemplu de applet care va prezenta cinci butoane pentru functiile unui
casetofon (de exemplu):
import java.awt.*;
CASETE DE VALIDARE
Aceste componente, numite in engleza checkbox, sunt in practica niste casete patrate care pot fi
bifate sau nu cu ajutorul unui clic de mouse.Scopul lor este in general de a selecta sau deselecta
anumite facilitati ale unui program.
In majoritatea cazurilor in care se folosesc casete de validare acestea sunt neexclusive, adica
oricare dintre casete poate avea valoare bifat sau nu, putand deci fi bifate la un moment dat chiar
si toate casetele sau nici una.O alta modalitate de folosire a acestor casete este si gruparea lor
care duce la realizarea asa numitelor butoane radio ; proprietatea acestora de baza este faptul ca
la un moment dat poate fi activ (bifat) doar un singur caz, o singura caseta.
Ambele tipuri de casete de validare sunt implementate cu ajutorul clasei Checkbox.Pentru a crea
o caseta de validare neexclusiva putem folosi unul dintre urmatorii constructori:
Pagina 106
CURSURI JAVA Alex Tabusca
- Checkbox(sir) - care creaza o caseta de validare cu eticheta fiind sirul dat ca parametru si
nevalidata.
Odata creat un obiect Checkbox se foloseste metoda setState(boolean) pentru a modifica starea
acestuia:valoarea true pentru a bifa caseta si valoarea false pentru a debifa caseta de
validare.Metoda getState() returneaza o valoare Boolean care ne indica starea de validare a
casetei la momentul respectiv.
In listingul de mai jos avem un exemplu de applet care creaza cinci casete de validare
neexclusive care permit selectarea unor marci de automobile:
import java.awt.*;
In cazul in care dorim sa grupam mai multe casete de validare intr-un grup pentru a realiza niste
butoane radio vom crea un obiect CheckboxGroup:
Acest obiect va pastra starea tuturor casetelor din grupul respectiv si va fi folosit ca argument
suplimentar pentru constructorul Checkbox.Pentru a crea o caseta de validare care apartine unui
grup vom folosi o instructiune de genul:
Checkbox(sir,grupCaseteValidare,boolean)
Aceasta instructiune va crea o caseta cu eticheta conform a cu sirul si cu starea de bifare sau
nebifare setata de argumentul de tip boolean.
In continuare avem un exemplu care creaza un grup cu trei casete de validare:
import java.awt.*;
Pagina 107
CURSURI JAVA Alex Tabusca
In cazul in care vrem sa modificam starea de validare a unui buton radio dintr-un grup putem
folosi metoda setCurrent(validare).Putem folosi si metoda getCurrent() pentru a intoarce
valoarea curenta de bifare a unei casete de validare.
LISTE DE OPTIUNI
Acestea sunt create cu ajutorul clasei Choice si permit alegerea unei singure optiuni dintr-o lista
derulanta pe verticala.
Pentru a crea o astfel de lista trebuie mai intai sa cream un obiect Choice care va pastra lista
propriu-zisa:
import java.awt.*;
In cadrul clasei Choice exista mai multe metode folositoare pentru controlul asupra unei liste de
selectie:
Pagina 108
CURSURI JAVA Alex Tabusca
OBS.: Trebuie sa facem cateva observatii legate de unele metode prezentate in paragrafele de
mai sus:
- metoda Checkbox(String,grup,boolean) a fost inlocuita in Java 2 cu metoda
Checkbox(String,boolean,grup); putem folosi in continuare si prima varianta dar la
compilare vom obtine un mesaj legat de deprecierea metodei respective
- metoda addItem(String) folosita pentru a adauga un element intr-o lista de optiuni se va
inlocui incepand cu Java 2 cu metoda add(String) a clasei Choice
CAMPURI DE TEXT
Textul introdus in applet prin componentele precedente nu era modificabil de catre utilizator,
doar programatorul avand posibilitatea de a face acest lucru.Campurile de text dau posibilitatea
utilizatorului sa poata introduce propriul text in program.Aceste componente ale interfetei sunt
implementate cu ajutorul clasei TextField.
Pentru a crea un camp de text putem folosi una dintre urmatoarele patru variante:
Atributele responsabile cu latimea campului de text au de fapt importanta doar in cazul folosirii
unor administratori de dispunere care nu redimensioneaza componentele - ca de exemplu
FlowLayout.
In cazul in care vrem ca textul introdus de la tastatura de utilizator sa nu fie vizibil in clar - de
exemplu in cazul parolelor - putem folosi o metoda numita setEchoCharacter(char) care va primi
ca argument un caracter ce trebuie inclus intre apostroafe (de exemplu:'@').
In continuare este prezentat un applet care utilizeaza mai multe campuri de text in clar si un
camp de text care ascunde textul introdus de utilizator:
import java.awt.*;
Pagina 109
CURSURI JAVA Alex Tabusca
Clasa TextField are si ea cateva metode foarte des folosite pentru a controla campurile de text:
ZONE DE TEXT
Aceste componente - numite text area in engleza - sunt de fapt niste campuri de text care contin
mai multe linii (spre deosebire de campurile de text clasice care apar doar pe un rand).O zona de
text poseda si bare de scroll pentru eventualul text care nu incape in partea vizibila a zonei de
text.
Pentru a crea o astfel de zona de text trebuie sa folosim unul dintre cei patru constructori de mai
jos:
import java.awt.*;
Pagina 110
CURSURI JAVA Alex Tabusca
In cazul zonelor de text mai trebuie sa mentionam ca ele sunt inrudite cu campurile de text nu
numai din punct de vedere logic ci si ca ierarhie de clase Java ; ambele componente mostenesc
de fapt o clasa numita TextComponent, clasa care de fapt poseda metodele setText(), getText(),
setEditable() si isEditable() si astfel aceste metode sunt disponibile si clasei TextArea.
Zonele de text poseda si ele unele metode proprii foarte utile:
LISTE DERULANTE
Aceste componente - scrolling lists - sunt create cu ajutorulclasei List si sunt asemanatoare cu
listele de optiuni avand de fapt doar doua diferente majore:
1. o lista derulanta poate fi configurata astfel incat sa poata fi selectate mai multe optiuni
2. aceste liste se prezinta ca o zona de text in care sunt afisate mai multe optiuni iar daca
lista contine mai multe optiuni decat pot fi afisate atunci apare bara de scroll.
Lista derulanta este definita prin crearea unui obiect List la care apoi se adauga elementele
propriu-zise ale listei.Pentru a realiza acest lucru putem folosi unul dintre constructorii de mai
jos:
Odata creat un obiect List ii folosim metoda addItem(String) pentru a adauga elemente la acest
obiect - OBS.:Ca si in cazul listei de optiuni, incepand cu Java 2 metoda aceasta se recomanda a
fi inlocuita cu metoda add(String) a clasei List.
Ca si orice alta componenta si lista derulanta trebuie adaugata intr-un container cu ajutorul
metodei add().
Pagina 111
CURSURI JAVA Alex Tabusca
Exemplul de mai jos ne prezinta o lista derulanta cu patru elemente vizibile la un moment dat
(dintr-un total de sase elemente ale listei):
import java.awt.*;
BARE DE SCROLL
Componentele numite bare de derulare - scrollbars - sunt cele care permit selectarea unei valori
prin deplasarea unei casete intre doua sageti.Dupa cum am vazut in cazul componentelor
anterioare mai multe dintre acestea au incorporate astfel de bare de derulare (de exemplu zonele
de text sau listele derulante).Clasa Scrollbar este cea responsabila pentru alte tipuri noi de bare
de scroll.O astfel de bara de scroll poate fi orizontala sau verticala.
Barele de derulare sunt folosite in general pentru a specifica valorile minime si maxime care pot
fi stabilite prin utilizarea componentei.
Pentru a crea o bara de scroll trebuie sa folosim unul dintre constructorii urmatori:
- Scrollbar() - creaza o bara de scroll verticala cu valorile minima si maxima setate initial
la 0
- Scrollbar(int) - creaza o bara de scroll cu valorile maxima si minima setate la 0 iar
orientarea este data de argumentul intreg.Acest argument poate lua ca valori urmatoarele
variabile de clasa:Scrollbar.HORIZONTAL, Scrollbar.VERTICAL.
- Scrollbar(int,int,int,int,int) - se creaza astfel o bara de scroll cu caracteristicile urmatoare:
Pagina 112
CURSURI JAVA Alex Tabusca
In exemplul de mai jos se creaza o bara de scroll orizontala.Pentru a afisa bara de scroll pe toata
latimea ecranului trebuie sa folosim un administrator de dispunere - si se va folosi GridLayout
pentru a imparti ecranul in 15 linii iar bara noastra de scroll va acoperi prima linie astfel creata a
ecranului ; caseta care gliseaza pe bara noastra de scroll va fi initial la o cincime din lungimea
barei si va avea ca latime tot o cincime din lungimea barei, lucru setat din constructorul folosit
pentru crearea barei noastre:
import java.awt.*;
SUPRAFETE DE DESENARE
Aceste componente sunt in general folosite ca loc pentru afisarea de imagini sau
animatii.Bineinteles ca putem desena si pe alte componente - ca de exemplu in fereastra Applet -
insa obiectele Canvas (aceasta fiind clasa responsabila de implementarea suprafetelor de
desenare) sunt cele mai simplu de folosit in acest scop.
Pentru a folosi o suprafata de desenare trebuie mai intai sa cream o subclasa a clasei Canvas ;
aceasta subclasa se poate ocupa de toate operatiunile de desenare care trebuie sa aiba loc in
metoda sa paint().
Dupa ce s-a creat o subclasa Canvas aceasta poate fi folosita in aplicatia noastra prin apelarea
constructorului sau si prin adaugarea noului obiect Canvas intr-un container.
Pentru a exemplifica teoria de mai sus sa studiem putin applet urmator ; acesta deseneaza o cruce
in centrul ferestrei Applet si poate muta centru acesteia daca fereastra care publica appletul este
redimensionata:
Pagina 113
CURSURI JAVA Alex Tabusca
import java.awt.*;
Acest applet contine in codul sau sursa doua clase ; prima dintre ele:- Cruce, este chiar appletul
insusi.A doua clasa este o clasa creata de noi ca fiind o subclasa a clasei Canvas.
Clasa Cruce creaza un obiect GridLayout care va fi stabilit drept administrator de dispunere cu
ajutorul metodei setLayout(), creaza un obiect de tipul celei de a doua clase create in applet si
apoi adauga acest obiect in containerul desemnat de insasi fereastra Applet.Datorita folosirii
administratorului de dispunere suprafata de desenare numita "suprafata" va cuprinde de fapt toata
suprafata ferestrei appletului.
In cadrul clasei canvasNou se determina mai intai mijlocul ferestrei Applet - lucru facut dinamic
astfel incat totdeauna, indiferent de eventuala redimensionare a ferestrei, variabilele x si y vor
contine coordonatele corecte pentru jumatatea laturilor ferestrei.Tot aici este setata si culoare
pentru desenare, culoarea albastra.Trebuie atrasa atentia ca aceasta metoda - ca si metodele de
desenare propriu-zisa a liniilor ce compun vrucea - este apelata pentru obiectul de tip Graphics al
metodei paint() si nu pentru suprafata de desenare.Obiectul ecran, de tipul Graphics, se ocupa de
toate eventualele operatii de desenare care au loc pe obiectul suprafata de desenare.Finalul clasei
canvasNou se ocupa de desenarea directa a celor patru linii care formeaza crucea, fiecare linie
avand cate 6 pixeli lungime si terminandu-se la 4 pixeli de punctul care reprezinta exact centrul
ferestrei.
Pagina 114
CURSURI JAVA Alex Tabusca
CURSUL X
Acest administrator nou creat trebuie apoi declarat ca administrator pentru container cu ajutorul
metodei setLayout().Administratorul de dispunere trebuie stabilit inainte de a adauga
componente containerului.Daca nu este stabilit un administrator explicit atunci apare automat cel
de dispunere secventiala (FlowLayout).
In exemplul de mai jos avem inceputul unui applet care foloseste un administrator de dispunere:
Pagina 115
CURSURI JAVA Alex Tabusca
In mod automat administratorul de dispunere secventiala lasa un spatiu de trei pixeli intre
componente pe un rand si tot cate trei pixeli intre randuri.Daca vrem sa modificam aceste
caracteristici putem folosi un constructor de genul:
In exemplul de mai jos avem un applet ce creaza un tabel cu 9 celule spatiate la 10 pixeli atat pe
verticala cat si pe orizontala:
import java.awt.*;
public class Tabelare extends java.applet.Applet {
GridLayout tabelul=new GridLayout(3,3,10,10);
Button b1=new Button("Steaua");
Button b2=new Button("Dinamo");
Button b3=new Button("Rapid");
Button b4=new Button("National");
Button b5=new Button("Bacau");
Button b6=new Button("Astra");
Button b7=new Button("Otelul");
Button b8=new Button("Sportul");
Button b9=new Button("Petrolul");
Pagina 116
CURSURI JAVA Alex Tabusca
add(b8);
add(b9);
}
}
add(string, componenta);
Primul argument are valori intre:"North", "South", "East", "West" si "Center".Al doilea argument
este chiar componenta care trebuie adaugata.
Programul de mai jos implementeaza un administrator de dispunere marginala:
import java.awt.*;
public class Margini extends java.applet.Applet {
BorderLayout b=new BorderLayout(10,15);
Button nord=new Button("Nord");
Button sud=new Button("Sud");
Button est=new Button("Est");
Button vest=new Button("Vest");
Button centru=new Button("Centru");
Pagina 117
CURSURI JAVA Alex Tabusca
add(string, container);
Primul argument al metodei este un sir care reprezinta numele cardului.Al doilea argument
specifica containerul sau componenta care reprezinta cardul.Daca este vorba de un container
acesta trebuie sa contina deja toate componentele necesare lui.
Dupa ce am adaugat cardul in containerul principal al programului putem folosi metoda show()
a administratorului de dispunere in stiva pentru a afisa o anumita cartela.Metoda show() primeste
doua argumente:
- primul este containerul in care au fost adaugate cardurile ; daca respectivul container este
chiar fereastra principala a appletului putem folosi cuvantul cheie this ca argument
- numele cardului
import java.awt.*;
Pagina 118
CURSURI JAVA Alex Tabusca
if (executabil==null) {
executabil=new Thread(this);
executabil.start();
}
}
Pagina 119
CURSURI JAVA Alex Tabusca
In forma generala crearea unei dispuneri tabelare neproportionale presupune cativa pasi:
Aceasta parte se realizeaza pe hartie, unde vom schita interfata grafica.Fiecare componenta a
interfetei trebuie plasata intr-o celula separata - desi o componenta poate ocupa mai multe celule.
Nume
Parola
OK
La pasul urmator ar trebui sa tabelam deja interfata noastra etichetand celulele cu coordonatele
lor x, y:
0,0 1,0
Nume
0,1 Parola 1,1
0,2 OK 1,2
In aceasta etapa ne vom axa pe dispunere doar asa ca vom folosi doar niste butoane care sa tina
locul elementelor reale ce vor apare pe panou.
Pentru usurinta specificarii restrictiilor vom defini o metoda care preia mai multe valori si
stabileste restrictiile pentru aceastea.Metoda definireRestrictii() preia sapte argumente:un obiect
GridBagConstraints si sase intregi care reprezinta variabilele gridx, gridy, gridwidth, gridheight,
weightx si weighty.
Primele doua argumente reprezinta valorile coordonatelor celulei respective - in cazul in care o
componenta ocupa mai multe celule coordonatele date sunt cele ale celului aflate cea mai in
stanga-sus ca pozitie.
Urmatoarele doua argumente reprezinta numarul de celule pe care le ocupa
componenta:gridwidth pentru coloane si gridheight pentru linii.
Ultimele doua argumente sunt date pentru latimea si inaltimea celulei - ca proportii din totalul pe
orizontala respectiv verticala.
Pentru atribuirea restrictiilor unui obiect se foloseste metoda setConstraints() ; aceasta preia doua
argumente:componente si restrictiile acesteia.Dupa ce toate acestea s-au realizat componenta
poate fi adaugata in panou.
Pagina 120
CURSURI JAVA Alex Tabusca
Acum se vor determina proportiile liniilor si coloanelor in relatiile cu alte linii si coloane.Cel mai
usor este sa luam valorile weightx si weighty ca procente din latimea si inaltimea totale ale
panoului.In acest caz valorile insumate pentru toate variabilele weightx si weighty trebuie sa fie
100.
Celulele care ocupa mai multe linii sau coloane trebuie sa aiba totdeauna valoarea o in directia in
care se extind.In afara de acest lucru trebuie sa ne hotaram doar asupra celulei care va primi o
valoare ; toate celelalte de pe rand sau de pe coloana trebuie sa aiba valoarea 0.
Scopul acestei etape este de a incerca sa stabilim proportiile de baza ale liniilor si celulelor care
vor apare pe ecran.In general in aceasta etapa vor apare mai multe incercari pana la obtinerea
rezultatului dorit.
Aici mai apar restrictiile care sa aranjeze componentele in cadrul celulelor.Avem doua astfel de
restrictii:fill si anchor.
Restrictia fill determina - pentru componentele care se pot extinde in orice directie - in ce
directie se face aceasta extindere (cum ar fi casetele de text sau butoanele).Restrictia fill poate
avea una dintre urmatoarele patru valori, definite drept variabile de clasa in GridBagConstrints:
A doua restrictie care afecteaza aparitia unei componente intr-o celula este anchor.Aceasta se
aplica doar componentelor care nu umplu intreaga celula si indica functiilor AWT unde sa
plaseze componenta in cadrul celulei.Valorile posibile pentru aceasta restrictie sunt:
- GridBagConstraints.NORTH
- GridBagConstraints.NORTHEAST
- GridBagConstraints.SOUTH
- GridBagConstraints.SOUTHWEST
- GridBagConstraints.EAST
- GridBagConstraints.SOUTHEAST
- GridBagConstraints.WEST
- GridBagConstraints.NORTHWEST
- GridBagConstraints.CENTER
Pagina 121
CURSURI JAVA Alex Tabusca
- etapa a cincea:ajustari
In realitate aceasta etapa apare aproape totdeauna ; pentru ca totul sa arate perfect va trebui sa
mai facem anumite modificari ale unor restrictii de obicei.
In listingul de mai jos avem un exemplu complet de creare a unui applet care implementeaza o
interfata grafica similara celei prezentate in etapa intai a constructiei teoretice a unei interfete ce
foloseste un administrator de dispunere tabelara neproportionala:
import java.awt.*;
void definireRestrictii(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy) {
gbc.gridx=gx;
gbc.gridy=gy;
gbc.gridwidth=gw;
gbc.gridheight=gh;
gbc.weightx=wx;
gbc.weighty=wy;
}
definireRestrictii(restrictii,0,0,1,1,10,40);
restrictii.fill=GridBagConstraints.NONE;
restrictii.anchor=GridBagConstraints.EAST;
Label eticheta1=new Label("Nume:",Label.LEFT);
tabelnp.setConstraints(eticheta1,restrictii);
add(eticheta1);
definireRestrictii(restrictii,1,0,1,1,90,0);
restrictii.fill=GridBagConstraints.HORIZONTAL;
TextField tfnume=new TextField();
tabelnp.setConstraints(tfnume,restrictii);
add(tfnume);
definireRestrictii(restrictii,0,1,1,1,0,40);
restrictii.fill=GridBagConstraints.NONE;
restrictii.anchor=GridBagConstraints.EAST;
Label eticheta2=new Label("Parola:",Label.LEFT);
tabelnp.setConstraints(eticheta2,restrictii);
add(eticheta2);
definireRestrictii(restrictii,1,1,1,1,0,0);
restrictii.fill=GridBagConstraints.HORIZONTAL;
TextField tfparola=new TextField();
Pagina 122
CURSURI JAVA Alex Tabusca
tfparola.setEchoCharacter('*');
tabelnp.setConstraints(tfparola,restrictii);
add(tfparola);
definireRestrictii(restrictii,0,2,2,1,0,20);
restrictii.fill=GridBagConstraints.NONE;
restrictii.anchor=GridBagConstraints.CENTER;
Button butonok=new Button("OK");
tabelnp.setConstraints(butonok,restrictii);
add(butonok);
}
}
In afara restrictiilor discutate anterior mai trebuie amintite inca doua restrictii ipadx si
ipady.Acestea doua controleaza bordurile - spatiul care inconjoara o componenta dintr-un
panou.In mod prestabilit componentele nu au nici un spatiu liber in jurul lor.Restrictia ipadx
adauga un spatiu in stanga si in dreapta componentei iar ipady adauga deasupra si dedesubtul
componentei.
Pentru a determina spatiul lasat in jurul unui panou putem folosi insertiile (insets).Clasa Insets
contine valori pentru insertiile din partea de sus, de jos, din stanga si din dreapta, valori folosite
la desenarea panoului.
Insertiile determina spatiul dintre marginile panoului si comonentele acestuia.
Pentru a modifica insertiile trebuie sa suprascriem metoda insets() - in Java 1.02, sau metoda
getInsets() din Java2 - ambele metode realizand acelasi lucru.
In cadrul metodei getInsets() (sau insets()) se creaza un nou obiect Insets unde constructorul
clasei primeste ca argumente patru valori intregi reprezentand insertiile pentru partea de sus, din
stanga, de jos si din dreapta panoului.Metoda va returna apoi obiectul Insets.In continuare avem
o prezentare a codului necesar pentru adaugarea insertiilor intr-o dispunere tabelara:10 pentru
partea de sus si de jos si 30 pentru laterale:
Un eveniment este generat ca raspuns la aproape orice actiune pe care o poate intreprinde un
utilizator.In programele noastre nu trebuie tratate toate evenimentele - ne vom ocupa de fapt doar
de cele la care vrem sa reactioneze programul nostru ignorand restul.Intre evenimentele care pot
Pagina 123
CURSURI JAVA Alex Tabusca
fi tratate amintim:clicuri demouse, miscari ale mouseului, apasari de taste sau evenimente ale
interfetei grafice utilizatoru (clicuri pe diferite componente, derulari de liste, etc).
METODA handleEvent()
Tratarea evenimentelor in Java 1.02 se face prin metoda handleEvent().Aceasta este definita in
clasa Component care este mostenita de java.applet.Applet - devenind astfel disponibila
appleturilor.
Cand un eveniment este transmis metodei hendleEvent() aceasta apeleaza o metoda specifica de
tratare a evenimentului respectiv.Pentru a trata un anumit eveniment va trebui sa suprascriem
aceste metode specifice.Apoi, la aparitia evenimentului respectiv metoda noua va fi apelata si
executata.
La executarea unui clid de mouse apar de fapt doua evenimente:mouse down, la apasarea
butonului si mouse up la eliberarea butonului mouseului.
Semnatura metodei pentru evenimentul mouse down este:
Trebuie metionat ca aceasta metoda returneaza o valoare booleana, spre deosebire de majoritatea
metodelor folosite pana acum.Valoarea de retur true sau false a unei metode de tratare de
evenimente determina daca o anumita componenta poate intercepta evenimentul sau daca trebuie
sa il transmita mai departe altor componente.Regula este ca daca metoda intercepteaza si trateaza
evenimentul ea trebuie sa returneze true ; daca metoda ignora evenimentul ea trebuie sa
returneze false pentru ca celelalte componente ale interfetei sa aiba sansa de a trata ele
evenimentul.
In listingul de mai jos vom vedea un applet care va trata apasarea mouseului - la fiecare clic de
mouse in fereastra este desenata o pata, pana la totalul de maxim 15 pete:
import java.awt.*;
Pagina 124
CURSURI JAVA Alex Tabusca
2. Dublu clicuri
Clasa Event din Java poseda o variabila denumita clickCount care pastreaza aceasta
informatie.clickCount este o variabila intreaga care contine numarul de clicuri consecutive
aparute - consecutivitatea este determinata de sistemul de operare sau de hardwareul
mouseului.In cazul in care vrem sa tratam ca evenimente clicuri multiple trebuie sa testam
valoarea variabilei sus amintite in corpul metodei noastre:
Pagina 125
CURSURI JAVA Alex Tabusca
Daca rulam un program care implementeaza aceasta metoda si executam un triplu clic rezultatul
obtinut va fi:
Numar de clicuri:1
Numar de clicuri:2
Numar de clicuri:3
3. Miscarile mouseului
AWT defineste doua tipuri distincte de miscari ale mouseului:tragerea sa - miscarea se face cu
butonul semnificativ apasat, si miscarea simpla - cu butonul neapasat.Evenimentele de mai sus
sunt interceptate si tratate cu ajutorul metodelor mouseDrag() si mouseMove().
Metoda mouseMove() seamana mult cu metodele care tratau clicurile de mouse:
Meotda mouseDrag() are o semnatura similara si mai trebuie sa mentionam ca in ambele metode
argumentele pentru coordonatele x si y reprezinta noua pozitie a mouseului si nu cea initiala.
Metodele mouseEnter() si mouseExit() sunt apelate cand mouseul patrunde sau paraseste un
applet sau o portiune a acestuia.Ambele metode au semnaturi similare cu cele intalnite mai
inainte, coordonatele x si y referindu-se aici la puctul unde mouseul a patruns sau respectiv a
parasit appletul:
Pentru a utiliza aceste evenimente si a le trata vom prezenta un exemplu de applet care traseaza
linii drepte pe ecran prin tragerea mouseului dintr-un punct in altul.Numarul de linii va fi
restrictionat la 20:
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Event;
import java.awt.Point;
Pagina 126
CURSURI JAVA Alex Tabusca
Pagina 127
CURSURI JAVA Alex Tabusca
g.setColor(Color.red);
if (pctCurent!=null)
g.drawLine(pctInitial.x, pctInitial.y, pctCurent.x, pctCurent.y);
}
}
Pagina 128
CURSURI JAVA Alex Tabusca
CURSUL XI
buton1.requestFocus();
Putem selecta chiar intreaga fereastra Applet prin apelarea metodei sale requestFocus().
Valorile generate de evenimentele keyDown, care sunt transmise metodei ca argumentul tasta,
sunt intregi care reprezinta valori Unicode ; pentru a putea sa le folosim drept caractere trebuie
sa folosim o convertire:
caracter=(char)tasta;
In exemplul de mai jos avem o metoda care afiseaza exact tasta pe care am apasat, ca si caracter
si ca valoare Unicode:
Metoda inrudita keyUp() are o semnatura identica - exceptand bineinteles numele metodei.
TASTE PRESTABILITE
Clasa Event are un set de variabile de clasa care reprezinta unele taste nealfanumerice ca tastele
functionale sau cele directionale.Daca interfata appletului nostru foloseste aceste taste putem
testa folosirea lor in cadrul metodei keyDown().Valorile acestor variabile de clasa sunt intregi,
Pagina 129
CURSURI JAVA Alex Tabusca
acest lucru fiind important mai ales pentru folosirea instructiunii switch in cadrul testarii acestor
variabile.Mai jos este prezentat un tabel care arata variabilele de clasa amintite mai sus:
Pentru a exemplifica utilizarea evenimentelor de tastatura vom prezenta un scurt applet in cadrul
carui vom tasta un caracter si apoi il vom misca cu ajutorul tastelor directionale (sageti) ; in orice
moment putem schimba caracterul prin simpla tastare a unui alt caracter.
Pentru realizarea acestei operatii folosim de fapt doar trei metode:init(), keyDown() si paint().
Metoda init() va stabili culoarea de fond, fontul si pozitia initiala a caracterului ; aceasta metoda
va contine si un apel requestFocus() - care are ca scop asigurarea faptului ca respectivele
caractere pe care le vom introduce vor fi tratate chiar de fereastra Applet.
Actuinile propriu-zise ale appletului se desfasoara in cadrul metodei keyDown() ; aceasta se
bazeaza pe un switch pentru a testa evenimentele de tastatura iar in cazul in care apare un
eveniment al unei taste directionale se vor face modificarile necesare modificarii pozitiei
caracterului din fereastra Applet.Daca evenimentul este provocat de apasarea unei taste
nedirectionale acest lucru va duce la schimbarea caracterului afisat in fereastra Applet.
Metoda paint() afiseaza doar caracterul curent la pozitia curenta. Unicul lucru de mentionat este
faptul ca la lansarea appletului nu se deseneaza nimic - inca nu s-a tastat nici un caracter ;
variabila tastaCrt va fi initializata cu 0 iar desenarea se va face doar dupa testarea acestei
variabile:
import java.awt.*;
public class Taste extends java.applet.Applet {
char tastaCrt;
int xCrt;
int yCrt;
Pagina 130
CURSURI JAVA Alex Tabusca
yCrt=(size().height/2)-16;
setBackground(Color.red);
setFont(new Font("Helvetica",Font.BOLD,36));
requestFocus();
}
public boolean keyDown(Event evt, int tasta) {
switch (tasta) {
case Event.DOWN:
yCrt+=5;
break;
case Event.UP:
yCrt-=5;
break;
case Event.LEFT:
xCrt-=5;
break;
case Event.RIGHT:
xCrt+=5;
break;
default:
tastaCrt=(char)tasta;
}
repaint();
return true;
}
public void paint(Graphics g) {
if (tastaCrt!=0) {
g.drawString(String.valueOf(tastaCrt),xCrt,yCrt);
}
}
}
Pagina 131
CURSURI JAVA Alex Tabusca
Aceste metode mai pot fi folosite si pentru a testa care dintre butoanele mouseului au generat un
anumit eveniment de mouse in cazul sistemelor cu doua sau trei butoane ale mouseului.In mod
prestabilit evenimentele de mouse sunt generate indiferent de butonul apasat.Totusi Java asociaza
apasarile pe butonul din drepata sau din mijloc cu apasarile tastelor de modificare Meta si
Control asa ca prin testarea acestor taste se poate afla butonul de mouse care a fost apasat.Prin
testarea tastelor de modificare putem afla care buton de mouse a fost folosit executand alte
actiuni diferite decat cele pe care le-am fi folosit in mod normal pentru butonul din stanga.Se
poate folosi instructiunea if pentru a testa fiecare caz, ca in exemplul de mai jos:
Pagina 132
CURSURI JAVA Alex Tabusca
}
}
In ceea ce priveste evenimentele de mouse putem testa si in cazul lor mai multe evenimente:
Mentionam ca la suprascrierea metodei handleEvent() in clasa noastra nici una dintre metodele
prestabilite de tratare a evenimentelor nu va mai fi apelata decat daca o vom apela explicit in
corpul metodei handleEvent().Cea mai buna modalitate de a rezolva aceasta problema este de a
testa evenimentele de care suntem interesati iar daca acestea nu apara sa apelam metoda
super.handleEvent() - pentru ca superclasa care defineste metoda sa poata procesa
evenimentele.Pentru a exemplifica acest lucru prezentam listingul de mai jos:
Pagina 133
CURSURI JAVA Alex Tabusca
lor ; nu mai conteaza evenimentele mouse down sau mouse up sau locul unde a aparut un clic -
componenta se va ocupa de tratarea tuturor acestor evenimente.
Exista trei tipuri de evenimente ce pot fi generate prin interactiunea cu componentele interfetei:
In metoda action() primul lucru facut este testarea componentei care a generat actiunea.Obiectul
Event pe care il primim ca argument in apelul action() contine o variabila de instanta numita
target, care contine o referinta catre obiectul ce a generat evenimentul.Putem folosi operatorul
instanceof pentru a afla ce componenta a generat evenimentul, ca in exemplul de mai jos:
Pagina 134
CURSURI JAVA Alex Tabusca
return false;
}
In exemplul anterior metoda action putea fi generata de o componenta TextField sau de un meniu
de optiuni.
Metoda action() returneaza o valoare booleana, true daca va trata evenimentul si false in caz
contrar.
In cazul in care avem mai multe componente din aceeasi clasa - de exemplu butoane - pot apare
unele probleme.Toate pot genera actiuni si toate sunt instante ale aceleiasi clase Button.Aici
apare utilizarea argumentului suplimentar:folosind comparatii simple de siruri, putem folosi
etichete, elemente sau continutul componentei pentru a determina care dintre ele a generat
evenimentul.
Un exemplu de astfel de solutie apare in continuare:
In cazul casetelor de validare sau al butoanelor radio argumentul suplimentar este totdeauna true
si nu ne ajuta la diferentiere componentelor.In general nu se prea reactioneaza direct la activarea
unei casete de validare sau la apasarea unui buton radio, acestea fiind de obicei selectate si abia
apoi valorile lor sunt testate in alt loc, de obicei dupa apasarea unui buton.Daca vrem totusi ca
programul sa reactioneze direct la evenimentele amintite putem folosi in locul argumentului
suplimentar metoda getLabel() pentru a extrage eticheta casetei de validare si a diferentia astfel
intre ele componentele de acest tip.
Pentru tratarea primelor doua evenimente trebuie folosita metoda handleEvent(), ca in exemplul
de mai jos:
Pagina 135
CURSURI JAVA Alex Tabusca
Toate detaliile teoretice de pana acum s-ar putea sa para greu de inteles fara o exemplificare
practica.Tocmai pentru a arata utilizarea diferitelor evenimente si tratarea lor vom prezenta un
applet care va avea cinci butoane cu denumirea a cinci culori ; la executarea unui clic pe oricare
Pagina 136
CURSURI JAVA Alex Tabusca
buton fondul appletului se va modifica la culoarea inscrisa pe buton si va apare un text care ne va
anunta culoarea pe care am selectat-o.
Intr-o prima etapa a construirii appletului nostru vom crea componentele si se va stabili modul
lor de dispunere in fereastra.In exemplul nostru vom folosi un administrator de dispunere de tip
FlowLayout pe care il vom aplica apoi containerului nostru.
Odata cu apasarea butoanelor noastre se vor genera evenimente de actiune.Pentru tratarea lor
vom folosi metoda action() care in practica va realiza mai multe lucruri:
Pentru a modulariza cat mai corect codul sursa vom crea o metoda action() care va apela in fapt
o alta metoda schimbaCuloare() ; aceasta metoda primeste ca argument chiar obiectul buton care
a initiat evenimentul.
Folosind faptul ca argumentul suplimentar al metodei action() este eticheta (in cazul butoanelor)
putem afla care dintre butoane a fost apasat.In cazul de fata nu vom mai folosi solutia
comparatiei etichetei butonului cu un anumit text.Obiectul transmis ca argument metodei
schimbaCuloare() este o instanta a clasei Button iar una dintre variabilele de instanta este o
referinta la acelasi obiect.In metoda noastra vom compara cele doua variabile pentru a testa daca
este vorba de acelasi obiect, dupa care vom stabili culoarea de fond si apelam metoda repaint().
In continuare avem si listingul complet al aplicatiei comentate in randurile anterioare:
import java.awt.*;
butonRosu=new Button("Rosu");
add(butonRosu);
butonAlbastru=new Button("Albastru");
add(butonAlbastru);
butonVerde=new Button("Verde");
add(butonVerde);
butonAlb=new Button("Alb");
add(butonAlb);
butonNegru=new Button("Negru");
add(butonNegru);
}
Pagina 137
CURSURI JAVA Alex Tabusca
void schimbaCuloare(Button b) {
if (b==butonRosu) { setForeground(Color.white);sir="Fond
rosu";setBackground(Color.red);}
else if (b==butonAlbastru) { setForeground(Color.white);sir="Fond
albastru";setBackground(Color.blue);}
else if (b==butonVerde) { setForeground(Color.red);sir="Fond
verde";setBackground(Color.green);}
else if (b==butonAlb) { setForeground(Color.red);sir="Fond
alb";setBackground(Color.white);}
else { setForeground(Color.white);sir="Fond
negru";setBackground(Color.black);}
repaint();
}
Pagina 138