Sunteți pe pagina 1din 12

Programare Java

Curs – 7

UTILIZAREA CLASELOR LEGATE DE GRAFICA , FONTURI SI CULORI

CLASA GRAPHICS

Un applet foloseste metoda drawString() pentru a desena text . Fontul si culoarea textului au fost deja
alese anterior desenarii textului .
Textul nu este singurul lucru pe care il putem desena in fereastra appletului ; tot aici putem insera linii ,
cercuri , ovaluri , dreptunghiuri si alte forme geometrice .
Majoritatea operatiilor de desenare sunt metode definite in clasa Graphics . Intr-un applet nu este
nevoie sa cream un obiect Graphics pentru a putea desena ceva - unul dintre argumentele metodei
paint() este un obiect Graphics - acesta reprezinta fereastra appletului iar metodele sale sunt folosite
pentru a desena in applet .
Clasa Graphics este parte a pachetului java.awt , deci toate appleturile care deseneaza ceva trebuie sa
foloseasca instructiunea import pentru a putea folosi aceasta clasa .

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 .

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 :

drawLine (x1 , y1 , x2 , y2 );

Aceasta metoda deseneaza linia cu grosimea de un pixel .


Adaugarea urmatoarei linii de cod in appletul nostru anterior - Harta.java - are ca rezultat trasarea unei
linii intre coordonatele (185,80) si (222,80) :

1
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

Adaugam acum urmatoarea linie la appletul nostru :

ecran.drawRect(2,2,345,345);

Aceasta instructiune adauga un contur dreptunghiular aproape de marginile ferestrei appletului . Daca
am fi folosit metoda fillRect() toata zona appletului ar fi fost acoperita de un dreptunghi plin de culoare
, fapt ce ar fi dus la acoperirea textului .

Dreptunghiurile cu colturile rotunjite se deseneaza cu ajutorul metodelor drawRoundRect() si


fillRoundRect() . Acestea preiau aceleasi patru argumente pentru dreptunghiuri normale plus inca doua
argumente suplimentare . Aceste doua argumente definesc latimea si inaltime zonei unde se rotunjesc
colturile . Cu cat aceasta zona este mai mare cu atat mai rotunjite sunt colturile . Daca aceste argumente
sunt suficient de mari dreptunghiul poate deveni chiar un cerc sau un oval .

Pentru a exemplifica si aceasta comanda sa adaugam o noua linie in appletul nostru :

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 :

- ca o pereche de tablouri cu intregi , dintre care unul pastreaza valorile coordonatei x si celalalt
pastreaza toate valorile coordonatei y
- ca un obiect Polygon creat folosind un tablou cu valori intregi ale coordonatei x si un tablou
cu valori intregi ale coordonatei y

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 :

Polygon polig=new Polygon();

Putem crea un poligon si pornind de la un set de puncte , folosind tablouri cu valori intregi . Aceasta
necesita un apel catre constructorul Polygon(int[],int[],int[]) , unde se specifica tabloul cu valori pentru
coordonata x , tabloul cu valori pentru coordonata y si numarul de puncte ( colturi ) :

2
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 .

Pentru a desena un poligon in appletul nostru adaugam liniile de cod :

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

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 :

- coordonatele x si y ale ovalului


- latime si inaltime ovalului - care in cazul cercurilor iau valori egale

Deoarece ovalele nu au colturi asa ca respectivele coordonate x si y pe care le primesc aceste metode se
refera de fapt la punctul din stanga-sus al zonei in care va fi desenat ovalul , aflandu-se de fapt la
stanga si mai sus decat forma geometrica propriu-zisa .

In appletul nostru sa adaugam urmatoarele instructiuni :

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

3
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 :
- coordonatele x si y ale ovalului din care face parte arcul
- latime si inaltime acestui oval
- unghiul de unde incepe trasarea arcului
- numarul de grade al arcului

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

In continuare avem un exemplu de metoda pentru desenarea arcelor :

ecran.drawArc(20,25,315,150,5,-190);

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 .

Sa adaugam in appletul nostru o serie de arcuri cu caracteristicile urmatoare :

- 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

Coordonatele x si y ale arcului se vor modifica folosindu-se doua cicluri for :

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

Metoda copyArea() preia sase argumente :

- coordonatele x si y ale regiunii de copiat


- latimea si inaltimea regiunii
- distanta pe orizontala si verticala - in pixeli - cu care se deplaseaza copia fata de regiunea
initiala , inainte de afisare

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 .

4
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 .

In continuare avem si un exemplu de utilizare a metodei :

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 .

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 .

CREAREA OBIECTELOR FONT


Un astfel de obiect se creaza prin apelarea constructorului sau cu trei argumente :

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

Font f=new Font("Dialog",Font.BOLD+Font.ITALIC,24);

DESENAREA CARACTERELOR SI SIRURILOR


Pentru a stabili fontul folosit in applet se utilizeaza metoda setFont() a clasei Graphics , impreuna cu un
obiect Font :

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 :

public void paint(Graphics ecran) {


Font f=new Font("TimesRoman",Font.PLAIN,72);
ecran.setFont(f);
ecran.drawString("Text de afisat in applet",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 .

5
AFLAREA DE INFORMATII DESPRE FONT
Clasa FontMetrics poate fi folosita pentru a afla informatii detaliate despre fontul curent , cum ar fi
latimea sau inaltimea caracterelor pe care le paote afisa .
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 :
- stringWidth(String) - intoarce latimea totala a sirului , in pixeli
- charWidth(char) - intoarce latimea unui caracter dat
- getHeight() - intoarce inaltimea totala a fontului

In continuare avem un exemplu de utilizare a metodelor acestei clase FontMetrics :

import java.awt.Font;
import java.awt.Graphics;
import java.awt.FontMetrics;

public class SoLong extends java.applet.Applet {


public void paint(Graphics ecran) {
Font f=new Font("Courier",Font.BOLD,18);
FontMetrics fm=getFontMetrics(f);
ecran.setFont(f);
String s="La revedere.";
int x=(size().width-fm.stringWidth(s))/2;
int y=size().height/2;
ecran.drawString(s,x,y);
}
}

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 ) , galbe ( 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 .

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 .

FOLOSIREA OBIECTELOR COLOR


Pentru a stabili culoarea curenta de desenare trebuie sa cream un obiect Color care sa reprezinte
culoarea dorita , fie sa folosim una dintre culorile standard existente in clasa .

6
Pentru a crea o culoare avem doua metode de apelare a metodei constructor Color :

- folosirea a trei intregi pentru valorile RGB dorite


- folosirea a trei numerel reale intre 0 si 1 care sa reprezinte acelasi lucru

Putem defini valoarea RGB a culorii in urmatoarele moduri :

Color c1=new Color(0.807F,1F,0F);


Color c2=new Color(255,204,102);

TESTAREA SI STABILIREA CULORILOR CURENTE


Culoarea curenta pentru desenare este desemnata folosind metoda setColor() a clasei Graphics .
Aceasta metoda trebuie apelata pentru obiectul Graphics care reprezinta zona in care desenam . Intr-un
applet acest obiect este cel transmis metodei paint() .
O modalitate de a stabili culoarea de desenare este folosirea uneia dintre culorile standard disponibile
ca variabila de clasa in clasa Color .

Aceste culori folosesc urmatoarele variabile 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);

Daca am creat un obiect Color el poate fi utilizat in mod asemanator :

Color culoare=new Color(255,204,102);


ecran.setColor(culoare);

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 .

Metoda setBackground() seteaza culoare de fundal primind ca argument un obiect Color .


Metoda setForeground() functioneaza la fel ca metoda setColor , dar schimba culoarea unei
componente a interfetei grafice - ca de exemplu un buton sau o fereastra . Datorita faptului ca un applet
este o fereastra putem folosi setForeground() in metoda init() pentru a seta culorile pentru operatiile de
desenare . Aceasta culoare va fi folosita pana la alegerea unei alte culori cu una dintre metodele
setForeground() sau setColor() .
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());

OPERATII GRAFICE FOLOSIND JAVA2D


Una dintre imbunatatirile aduse de Java2 este Java2D , un set de clase pentru crearea unor imagini si
texte bidimensionale de inalta calitate . Clasele Java2D extind facilitatile claselor grafice din java.awt ,
cum sunt cele pe care le-am vazut in paginile anterioare . Ele nu inlocuiesc clasele existente ci doar
aduc posibilitati noi .

Functiile Java2D contin printre altele :

7
- metode speciale de umplere cu degradeuri si texturi
- tuse care definesc grosime si stilul desenului
- posibilitati de netezire a marginilor obiectelor desenate ( anti-aliasing )

SPATIUL DE COORDONATE AL UTILIZATORULUI SI CEL AL DISPOZITIVULUI


Unul dintre conceptele din Java2D este diferentierea intre spatiul de coordonate al dispozitivului de
iesire si spatiul de coordonate la care ne referim cand desenam .

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 .

CONVERSIA LA UN OBIECT GRAPHICS2D


Operatiile de desenare de pana acum sunt apelate pentru obiecte Graphics ce reprezinta zona in care
desenam ; pentru Java2D acest obiect trebuie folosit pentru a crea un nou obiect Graphics2D , ca in
urmatoarea metoda paint() :

public void paint(Graphics ecran) {


Graphics2D ecran2D=(Graphics)ecran;
}

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 .

SPECIFICAREA ATRIBUTELOR DE RANDARE


Desenele care nu sunt 2D pot selecta un singur atribut : culoarea . 2D ofera o gama larga de atribute de
culoare , grosimea liniei , modelul de umplere , transparenta si altele .

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 .

Un apel catre constructorul GradientPaint este de forma :

GradientPaint(x1,y1,culoare1,x2,y2,culoare2);

8
Punctul x1,y1 este punctul de unde incepe culoare culoare1 iar x2,y2 este punctul unde se termina
trecerea la culoare2 .

Pentru a implementa un degrede ciclic introducem un argument suplimentar :

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() :

GradientPaint model=new GradientPaint(0f,0f,Color.white,100f,45f,Color.blue);


ecran2D.setPaint(model);

Toate operatiile de desenare care vor urma pentru obiectul ecran2D vor folosi acest model de umplere .

STABILIREA UNEI TUSE DE DESEN


Liniile desenate in operatiile non-Java2D au grosimea standard de 1 pixel . Java2D da posibilitatea de a
modifica grosimea liniei de desenare cu metoda setStroke() pentru un obiect BasicStroke .

Un constructor BasicStrole simplu preia trei argumente :


- o valoare float pentru grosimea liniei , valoarea implicita fiind 1.0
- o valoare int care determina stilul terminatiei liniei
- o valoare int care determina stilul imbinarii intre doua segmente de linie

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 .

Stilurile de imbinare sunt JOIN_MITER ( pentru imbinarea prin prelungirea muchiilor exterioare ) ,
JOIN_ROUND ( pentru imbinarea rotunjita ) si JOIN_BEVEL ( pentru o imbinare tesita ) .

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 .

CREAREA OBIECTELOR CE VOR FI DESENATE


Desenarea obiectelor in Java2D se face prin definirea lor ca forme geometrice , folosind clasele
pachetului java,awt.geom . Putem desena toate formele intalnite pana acum - linii , dreptunghiuri ,
ovale , arce si poligoane .

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 :

Line2D.Float ln=new Line2D.Float(60f,5f,13f,28f);

9
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 .

Rectangle2D.Float primeste patru argumente : coordonatele x , y , latimea si inaltimea :

Rectangle2D.Float dr=new Rectangle2D.Float(10f,13f,40f,20f);

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 :

Ellipse2D.Float el-new Ellipse2D.Float(113,25,22,40);

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 :

Arc2D.Float arc=new Arc2D.Float(27,22,42,30,33,90,Arc2D.PIE);

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 .

Un obiect GeneralPath poate fi creat fara argumente :

GeneralPath polig=new GeneralPath();

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

10
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 :

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 .

Sa incheiem problematica abordata in acest curs cu un exemplu de desenare 2D :

import java.awt.*;
import java.awt.geom.*;

public class Harta2D extends java.applet.Applet {


public void paint(Graphics ecran) {
Graphics2D ecran2D=(Graphics2D)ecran;
setBackground(Color.blue);
//Desenare valuri
ecran2D.setColor(Color.white);
BasicStroke creion=new BasicStroke(2F,BasicStroke.CAP_BUTT,BasicStroke.JOIN_ROUND);
ecran2D.setStroke(creion);
for (int ax=10;ax<340;ax+=10)
for (int ay=30;ay<340;ay+=10){
Arc2D.Float val=new Arc2D.Float(ax,ay,10,10,0,-180,Arc2D.OPEN);
ecran2D.draw(val);
}
//Desenare harta
GradientPaint degrade=new GradientPaint(0F,0F,Color.green,50F,50F,Color.orange,true);
ecran2D.setPaint(degrade);
GeneralPath f1=new GeneralPath();
f1.moveTo(10F,12F);
f1.lineTo(234F,15F);
f1.lineTo(253F,25F);
f1.lineTo(261F,71F);
f1.lineTo(344F,209F);
f1.lineTo(336F,278F);
f1.lineTo(295F,310F);
f1.lineTo(259F,274F);
f1.lineTo(205F,188F);
f1.lineTo(211F,171F);

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

12

S-ar putea să vă placă și