introducere in Grafiva Java
-
Upload
alina-iftimiu -
Category
Documents
-
view
217 -
download
0
Transcript of introducere in Grafiva Java
-
7/23/2019 introducere in Grafiva Java
1/15
24
2 INTRODUCERE N GRAFICA JAVA
2.1 Interfeele utilizator grafice n Java
Interfaa utilizator grafic (engl: GUI - Graphical User Interface) este o interfa om-main
care permite comunicarea omului cu calculatorul prin intermediul unor obiecte grafice, afi ate pe
ecran. Toi utilizatorii de calculatoare sunt familiarizai n prezent cu interfeele grafice care conin
ferestre, butoane, casete de validare, liste, meniuri, cmpuri de text etc. Cele mai rspndite sunt cele
din categoriile Windows (ale firmei Microsoft) i X-Window (pentru diferite platforme Unix sau Linux).
Cele mai multe componente ale acestor interfee au reprezentri grafice predefinite. Unele din acestea
pot servi, ns, i drept suport pentru reprezentri grafice programate n programele de aplicaie.
Programatorii n limbajul Java dispun de dou familii de pachete de clase pentru realizarea interfeelor
utilizator grafice, prezente n Java API (Application Programming Interface - interfaa pentru
programarea de aplicaii): AWT i Swing.
2.1.1 Interfeele grafice AWT
Java AWT(Abstract Windowing Toolkit - setul de creare a ferestrelor abstracte) este constituit
din pachetele:
-
java.awt,
-
java.awt.event,
-
java.awt.color,- java.awt.font,
- java.awt.geom,
- java.awt.image,
- java.awt.print,
- i altele.
Tot aici se poate ncadra i pachetul java.applet, destinat realizrii de appleturi. Ideea de baz
care a stat la realizarea AWT este c, ntruct limbajul Java trebuie s fie independent de platforma pe
care se execut programul, iar mijloaceleconcrete prin care se realizeaz reprezentrile grafice difer
de la o platform la alta, programatorul n Java trebuie s creeze n aplicaiile sale nite ferestre
abstracte, n care plaseaz nite obiecte abstracteasupra crora va aciona utilizatorul n timpulexecutrii programului. Aspectul grafic al acestor obiecte abstracte este dependent de platform. De
exemplu, un buton, o list sau o caset de validare vor avea alt aspect pe ecran dac programul este
executat sub Windows, dect atunci cnd este executat sub Linux sau sub alt sistem de operare. n
schimb, pentru programator i pentru utilizator este esenial funcionalitatea obiectului grafic
respectiv. De exemplu, pe orice platforma, butonul este un obiect grafic care emite un semnal (mai
exact genereaz un anumit eveniment) atunci cnd este apsat cu mouse -ul. Funcionalitatea
obiectelor grafice din AWT este aceeai pe toate platformele.
Principalul avantaj al AWT este c utilizeaz pentru reprezentarea pe ecran i manipularea
obiectelor interfeei grafice resursele proprii ale platformei pe care se execut programul. n
consecin, timpul de calcul necesar pentru aceste operaii la executarea programului este mic, fiindoptimizat de ctre realizatorii sistemului de operare al platformei pe care se lucreaz. Pe de alta parte,
-
7/23/2019 introducere in Grafiva Java
2/15
25
programatorul n limbajul Java nu trebuie s cunoasc particularitile programrii interfeelor grafice
pe diferitele platforme, ntruct el lucreaz numai cu clasele de obiecte abstracte oferite de pachetele
din Java AWT.
Principalul dezavantaj al AWT este c autorii lui au fost nevoii s ia n consideraie numai acele
clase de obiecte grafice, care exist ntr-o form sau alta pe toate platformele. Aceasta a fcut canumrul de clase de obiecte grafice din Java AWT s fie destul de restrns, renunndu-se la
funcionalitile specifice numai anumitor platforme.
2.1.2 Interfeele grafice Swing
Pentru a se realiza interfee grafice mai bogate i mai diversificate dect cele posibile n AWT, a fost
creat o familie de pachete de clase cunoscut sub numele de Swing. Din aceastfamilie fac parte
pachetele:
-
javax.swing,
-
javax.swing.event
-
i altele.
Remarcm c Swing nu nlocuiete, ci completeaz AWT cu noi pachete de clase. Multe din
clasele AWT sunt necesare i atunci cnd se lucreaz n Swing. Obiectele grafice din Swing au nu numai
aceeai funcionalitate, ci i acelai aspect pe orice platform. Mai mult, acest aspect poate fi ales de
programator dintre mai multe variante posibile. Pentru a se realiza acest obiectiv, autorii Swing au
renunat la ideea de a folosi pentru reprezentrile grafice metodele native de pe platformele pe care
se execut aplicaia. Toate obiectele grafice din Swing sunt reprezentate pe ecran i manipulate prin
metode scrise n limbajul Java. Aceasta confer interfeei grafice independen total fa de platformi posibilitatea diversificrii claselor de obiecte folosite, dar preul pltit este creterea complexitii
programelor i a timpului de calcul.
2.2
Componente grafice i containere
Interfeele grafice Java (att AWT, ct i Swing) se bazeaz pe conceptul de component
grafic. Se numete component graficun obiect care are o reprezentare pe ecran i care poate
interaciona cu utilizatorul. Orice component ocup pe ecran o arie de form dreptunghiular, cu
baza orizontal. Este posibil ca unele componente s acopere total sau parial alte componente.
2.2.1 Clasa Component
n limbajul Java, componentele grafice sunt instane ale unor clase. Aceste clase formeaz o
ierarhie, care are ca rdcina clasa Componentdin pachetul java.awt. Aceasta este o clasa abstract,
care ofer metodele care sunt prezente n toate clasele de componente. Numrul acestor metode este
mare (peste 120) i sunt descrise in documentaia Java API, astfel c vom prezenta aici numai pe cele
necesare n acest capitol:
-
7/23/2019 introducere in Grafiva Java
3/15
26
public void setVisible(boolean b)- afieaz componenta pe ecran, dac argumentul b
este true, sau o ascunde dac acesta este false;
public void setBackground(Color c)- seteaz culoarea de fond a componentei;
public void setForeground(Color c) - seteaz culoarea de prim plan a componentei
(culoarea textului);
public void setFont(Font f)- seteaz fontul (forma caracterelor folosite n component);
public void setLocation(int x, int y)- deplaseaz componenta ntr-o nou poziie,
astfel nct colul din stnga-sus al acesteia s fie situat n punctul de coordonate (x,y);
public void setSize(int width, int height)- stabilete dimensiunile componentei,
respectiv limea i nlimea acesteia;
public void paint(Graphics g) - traseaz pe aceast component un desen, folosind
contextul grafic g. Conceptul de context grafic va fi tratat ntr-o seciune special a acestui capitol.
Metoda
paint()nu este invocat direct de ctre programator, ci indirect, prin intermediul metodeirepaint();
public void update(Graphics g) - actualizeaz desenul de pe component, folosind
contextul grafic g; este invocat de metodarepaint();
public void repaint()- invoc metoda update().
Componentele grafice pot fi componente atomice sau containere. Se numesc containere acele
componente, care pot conine alte componente. Remarcm c, ntruct i containerul este o
component,un container poate conine alte containere.
n Java AWT i Swing, clasele de containere formeaz o ierarhie, a crei rdcin este clasa
Container, care extinde clasa Componenti se gsete, de asemenea, n pachetul java.awt.
Cele mai frecvent utilizate clase de containere sunt:
- n AWT clasele Frame, Applet, Panel i Dialog;
-
n Swing clasele JFrame, JApplet, JPanel i JDialog.
Fereastra principal a oricrei aplicaii trebuie s aparin uneia din clasele Frame sau JFrame,
dup cum se lucreaz cu componente AWT, respectiv Swing sau trebuie s fie o subclas auneia dintre
acestea. n mod corespunztor, orice clas applet este derivat din una din clasele Applet sau JApplet.
2.2.2 Clasa Applet
ntruct, n exemplele din seciunile urmtoare, vom folosi clasa Applet, facem aici o scurt
prezentare a acestei clase.
Clasa java.applet.Applet extinde clasa java.awt.Panel, care are superclasa
java.awt.Container. Aceasta, la rndul ei, are superclasa java.awt.Component. n consecin, clasa
Applet motenete toate metodele acestor clase.
Instanele clasei Applet i ale subclaselor sale sunt appleturi, adic mici programe cu interfagrafic, ce pot fi transmise prin reea i executate ntr-un browser de Web sau ntr-un appletviewer.
-
7/23/2019 introducere in Grafiva Java
4/15
27
Suprafaa applet-ului, vizibil n fereastra browserului, are form dreptunghiular i nu are
chenar, la fel ca n cazul unui panou (Panel). Pe aceast suprafa se poate desena, sau se pot
reprezenta imagini. De asemenea, ntruct appletul este un container, se pot aduga diferite
componente grafice. Toate acestea se realizeaz prin crearea de subclase n care se extinde clasa
Applet, redefinindu-i-se metodele. Putem spune, deci, c aceast clas este doar un prototip, pe care
programatorii l extind pentru a deriva propriile lor clase de appleturi.
Principalele metode ale clasei Applet (n afar de cele motenite de la superclasele sale) sunt
urmtoarele:
public void init()- este invocat de ctre browser o singur dat, atunci cnd este ncrcat
appletul pentru a fi executat. Prin redefinirea acestei metode, se prevd de ctre programator toate
operaiile care trebuie efectuate la iniializarea appletului: desenare, importare de imagini, adugare
de componente, diferite calcule auxiliare.
public void start()-este invocat de ctre browser atunci cnd appletulncepe s fie executat
efectiv, adic atunci cnd este afiat pe ecran pagina HTML n care se gsete appletul respectiv. Dac
appletul conine anumite operaii care nu este necesar s fie efectuate atunci cnd pagina nu estevizibil (de exemplu o animaie), se va redefini metoda stop()pentru a opri executarea operaiilor
respective i metoda start()pentru a le reporni.
public void stop() - este invocat de ctre browser atunci cnd nceteaz executarea
appletului, adic atunci cnd se trece la alt pagin HTML, dect cea care conine appletul respectiv.
public void destroy()- este invocat de browser pentru a informa appletul c el urmeaz a
fi distrus. Programatorul poate redefini aceast metod pentru a efectua operaiile care se execut
nainte de distrugere. de exemplu, dac appletul folosete fire de execuie, acestea vor fi create n
metoda init()i vor fi distruse (ucise) n metoda destroy().
public Image getImage(URL url)- aduce imaginea care se gsete pe Internet la URL-ul dat
ca argument, prezentnd-o ca un obiect cu interfaa Image. Acesta trebuie s fie un URL absolut.
public Image getImage(URL url, String name)- aduce imaginea care se gsete pe
Internet la URL-ul primit ca prim argument, completat cu irul primit ca al doilea argument. Imaginea
este pus sub forma unui obiect cu interfaa Image. URL-ul trebuie s fie absolut, iar al doilea argument
indic locaia relativ a fiierului imagine fa de directorul indicat de primul argument.
public AudioClip getAudioClip(URL url)- aduce un clip audio de la locaia de Internet
primit ca argument sub form de URL absolut.
public AudioClip getAudioClip(URL url, String name)- aduce un clip audio de lalocaia dat prin argumente. Primul argument este un URL absolut, iar al doilea indic loca ia relativ
a fiierului fa de directorul indicat de primul argument.
public void play(URL url)- execut clipul audio situat pe Internet la locaia dat de URL-ul
absolut primit ca argument.
public void play(URL url, String name) - execut clipul audio a crui locaie este dat
prin argumente (primul este un URL absolut iar al doilea este locaia relativ la directorul dat de primul
argument).
public URL getCodeBase()- ntoarce URL-ul la care se gsete appletul.
-
7/23/2019 introducere in Grafiva Java
5/15
28
public String getParameter(String name) - ntoarce valoarea parametrului al crui
nume este dat ca argument. Parametrii appletului sunt cei dai prin tagul din pagina
HTML, fiecare parametru avnd forma "NUME" = "VALOARE".
2.3
Culori i fonturi
n AWT culorile i fonturile sunt obiecte, respectiv instane ale claselor Color i Font.
2.3.1
Clasa Color
n AWT, culorile sunt obiecte ale clasei java.awt.Color. Instanele acestei clase conin valorile
celor trei componente ale culorii, aplicnd sistemul RGB (Red Green Blue - rou, verde, albastru). n
acest sistem, fiecare culoare este descompus n cele trei culori fundamentale, fiecare component
fiind reprezentat printr-un numr ntreg, n intervalul [0, 255]. Valoarea 0 reprezint lipsa
componentei respective, iar valoarea 255 reprezint intensitatea maxim. O a patra component,
alpha, reprezint opacitateaculorii respective: valoarea 0 nseamn transparen total, iar valoarea
255 corespunde opacitii totale.
Clasa Color are mai muli constructori, dintre care cei mai folosii sunt urmtorii:
public Color(int red, int green, int blue)
public Color(int red, int green, int blue, int alpha)
public Color(int rgba)
n care argumentele sunt valorile sub form de numere ntregi n intervalul [0, 255] ale celor patru
componente ale culorii. Dac alpha lipsete, se consider implicit c are valoarea maxim. n ultimul
constructor, ultimul argument de tip int mpacheteaz toate cele patru componente, folosind pentru
fiecare un singur octet.
Odat cu trecerea de la contextul grafic Graphics la Graphics2D, s-a introdus reprezentarea
culorilor n sistemul sRGB (standard RGB), care respect standardul adoptat de International Color
Consortium. Conform acestui standard, componentele fundamentale RGB sunt reprezentate prin
numere reale n intervalul [0.0, 1.0]. Constructorii menionai mai sus au fost meninui, dar au fost
introdui n plus constructorii:
public Color(float red, float green, float blue)
public Color(float red, float green, float blue, float alpha).
Clasa Color conine, de asemenea cmpuri statice, care conin instane ale clasei Color pentru
culorile cele mai larg folosite. Acestea sunt:white(alb), lightGray(gri deschis), gray(gri), darkGray(gri
nchis), black(negru), red(rou), green(verde), blue(albastru), pink(roz), orange(portocaliu), yellow
(galben), magenta(violet), cyan(albastru deschis). ntruct acestea sunt cmpuri statice, la utilizarea
n program trebuie calificate prin numele clasei. De exemplu, culoarea albastru va fi scris sub forma
Color.blue.
-
7/23/2019 introducere in Grafiva Java
6/15
29
Pentru schimbarea culorii curente a contextului grafic se folosete metoda setColor(Color c) a
clasei Graphics, n care argumentul este fie una din culorile predefinite specificate mai sus, fie o
instan a clasei Color creat de programator, ca n exemplele urmtoare:
setColor(Color.blue);
setColor(new Color(127, 205, 184));
Clasa Color prezint i numeroase metode, prezentate n documentaia Java API, dintre care
vom meniona aici pe urmtoarele dou, care permit conversia culorilor din sistemul HSB n sistemul
RGB i invers:
public static int HSBtoRGB(float hue, float saturation, float
brightness)- ntoarce valoarea RGB (cu cele patru componente mpachetate ntr-un int) a culorii
date prin componentele sale n sistemul HSB;
public static float[] RGBtoHSB(int r, int g, int b, float[] hsbvals)-
ntoarce un tablou cu valorile HSB ale componentelor culorii, fiind dare ca argumente componentele
n sistemul RGB. Al patrulea argument este tabloul n care vor fi plasate rezultatele. Dac acest
argument este null, se ntoarce un tablou nou creat.
n sistemul HSB, componentele culorii sunt: hue (nuan), saturation (saturaie) i brightness
(strlucire). Toate sunt reprezentate prin numere de tip float n intervalul [0.0, 1.0].
2.3.2 Clasa Font
Se numete Fontun set de imagini care reprezintcaractere. Toate caracterele unui font au
anumite caracteristici comune, cum sunt: aspectul caracterelor, stilul, mrimea. Iat cteva exemple
de fonturi, indicndu-se pentru fiecare numele, stilul i mrimea:
Times Roman, normal, 12
Times Roman, normal, 14
Times Roman, aldin, 14
Times Roman, italic, 14
Times Roman, italic aldin, 14
Times Roman, subliniat, 14
Arial, normal, 14Arial, italic, 12
Courier, normal, 14
Courier, italic, 14
Numele fontului se refer, n general, la aspectul acestuia. Fonturile care au acelai aspect
general, indiferent de stil i de mrime formeaz o familie de fonturi. n prezent exist o mare varietate
de familii de fonturi utilizate n editoarele de texte i n editoarele grafice. n principiu, n Java se poate
utiliza orice familie de fonturi disponibil n mediul cu care lucrm. Avnd ns n vedere c se dorete
ca programele Java s poat fi executate pe orice platform, se garanteaz c vor exista, ntotdeauna
urmtoarele trei tipuri:
-
7/23/2019 introducere in Grafiva Java
7/15
30
Serif - asemntor cu Times Roman din exemplul de mai sus, n care caracterele conin
serifuri, adic mici liniue cu care se termin elementele acestora;
SansSerif - asemntor cu Arial din exemplul de mai sus, n care caracterele nu conin
serifuri;
Monospaced- asemntor cu Courierde mai sus, n care se folosesc caractere de genul celorde la maina de scris.
Tipurile Serif i SansSerif se ncadreaz n categoria fonturilor cu lime variabil a
caracterelor. n astfel de fonturi, literele M i I, de exemplu, au limi diferite. Tipul Monospacedare
toate caracterele de aceeai lime, ntruct la mainile de scris mecanice deplasarea carului este
aceeai pentru toate literele.
n Java AWT, fonturile sunt instane ale clasei java.awt.Font. Principalul constructor din
aceast clas este
public Font(String name, int style, int size)- n care cele trei argumenteindic respectiv numele, stilul i mrimea fontului. Numele fontului poate fi cel al oricrui font
disponibil pe platforma pe care se execut programul. Dup cum am artat deja, pentru a fi siguri c
fontul respectiv exist pe orice platform, este bine s folosim cele trei tipuri garantate: Serif,
SansSerifsau Monospaced.
Stilul fontului poate fi ales dintre urmtoarele cmpuri statice ale clasei Font:
- Font.PLAIN - caractere normale, drepte;
- Font.BOLD - caractere aldine (ngroate);
- Font.ITALIC - caractere italice (cursive).
Ultimele stiluri se pot combina sub forma Font.BOLD+Font.ITALIC, care se refer la caracterealdine italice (ngroate i cursive).
Mrimea fontului se exprim n puncte tipografice.
Putem afla numele familiilor de fonturi disponibile pe calculatorul pe care lucrm folosind
programul urmtor:
Applet 2-1. CeFonturi.java: numele fonturilor disponibile pe sistemul
gazd._____________________________________________________
/* Se cauta fonturile disponibile in mediul grafic */
import java.awt.*;class CeFonturi {
public static void main(String args[]) {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String familii[] = ge.getAvailableFontFamilyNames();
for(int i=0; i
-
7/23/2019 introducere in Grafiva Java
8/15
31
getLocalGraphicsEnvironment() din clasa GraphicsEnvironment() pentru
a obine o referin ctre mediul grafic local (de pe calculatorul pe care ruleaz programul Java).
Se folosete apoi metoda:
getAvailableFontFamilyNames() pentru a obine un tablou de iruri de caractere,
care sunt numele familiilor de fonturi locale. n fine, aceste nume de familii de fonturi se afieaz peecran. Vom remarca faptul c, printre acestea, se regsesc i cele trei nume de familii de fonturi
menionate mai sus.
2.4
Desenarea n Java AWT
n principiu, desenarea se poate face pe suprafaa oricrei componente grafice. Din aceasta
cauz,n clasa Componentau fost prevzute metodelepaint, updatei repaint prezentate n
seciunea Componente grafice i containere.
n pachetul java.awt exist, totui, o clas de componente care se folosesc exclusiv ca
suprafee de desenare. Aceasta este clasa Canvas. Instanele clasei Canvas sunt nite simple suprafee
de form dreptunghiular, frbordur, folosite pentru desenare. n englez se numete canvas pnza
folosit de pictor. Desenarea se poate face, ns i pe suprafaa unei instane a claselor Panel, Applet,
JPanel, JApplet sau a oricrei alte componente.
Pentru a trasa desenul, n afar de suprafaa de desenare, este necesar i un instrument
(dispozitiv) de desenare. Tehnicile de desenare folosite difer substanial de la o platform la alta,
depinznd att de echipamentele folosite pentru realizarea desenului, ct i de programele folosite n
acest scop. ntruct se dorete ca programele scrise n Java s fie independente de platform, a fostconceput un dispozitiv de desenare abstract, numit context grafic. ntr-o prim variant, contextul
grafic a fost specificat prin clasa abstract Graphicsdin pachetuljava.awt. Aceasta clas ofer un set
minimal de metode, care pot fi utilizate pentru trasarea unor desene relativ simple.
Ca urmare a utilizrii din ce n ce mai ample a limbajului Java, au crescut i preteniile fa de
complexitatea desenelor care s poat fi realizate n acest limbaj. Din aceast cauz, s-a simit nevoia
de a se crea un nou context grafic, (clasa Graphics2D), care este o extindere a clasei Graphics.
Programatorul care dorete s traseze un desen pe suprafaa unei componente, trebuie s creeze o
clas, care extinde clasa componentei respective in care este redefinit metoda paint i, uneori,
metoda update. Ambele metode primesc ca argument contextul grafic Graphics g. Aa cum sunt
ele definite n clasele de componente din AWT i Swing, aceste metode nu fac nimic, deci nu se traseazun desen pe suprafaa componentei respective. Dac programatorul dorete ca un asemenea desen
s fie trasat, el trebuie s redefineascn mod corespunztor aceste metode.
Metodele painti updatenu sunt invocate explicit n cadrul aplicaiei.
Metoda painteste invocat automat n urmtoarele situaii: cnd componenta respectiv
este afiat pe ecran, sau cnd ea a fost parial distrus i trebuie restaurat.
Metoda update servete pentru actualizarea desenului componentei. Ea este apelat de
programator indirect, prin invocarea metodei repaint. La fiecare invocare, metoda update
efectueaz urmtoarele operaii:
- terge coninutul componentei prin umplerea ntregii suprafee cu culoarea de fond,
-
7/23/2019 introducere in Grafiva Java
9/15
32
- seteaz culoarea contextului grafic folosind culoarea de prim-plan a componentei
respective,
- dupcare invoc metodapaint, care face desenarea propriu-zis.
n consecin, n general este suficient ca programatorul s redefineasc numai metoda
paint.
2.5
Desenarea folosind contextul grafic dat de clasa Graphics
Pentru realizarea unor desene simple pe componente AWT sau Swing este suficient s se
foloseasc contextul grafic oferit de clasa java.awt.Graphics. Obiectele acestei clase nu sunt
instaniate explicit prin program, ci sunt furnizate automat de maina virtual Java, atunci cnd este
invocat metodapaint sauupdate. S-a adoptat un astfel de procedeu, ntruct clasa Graphics este
abstract, deci nu poate fi instaniat prin programul Java, obiectele din aceast clas fiind realizate
prin programe dependente de platforma pe care se execut aplicaia respectiv.
Contextul grafic ncorporeaz informaia de stare necesar desenrii, care const din:
- referina la componenta grafic pe care se traseaz desenul;
- coordonatele originii sistemului de coordonate curent, exprimate n sistemul de
coordonate al componentei pe care se face trasarea;
- decuparea curent (dimensiunile dreptunghiului n care se face efectiv trasarea
desenului);
- culoarea curent;
- fontul curent;
-
operaia logic pe pixeli curent (XOR sau Paint);- alternana curent de culori pentru operaia XOR.
La utilizarea operaiei Paint, trasarea desenului se face cu culoarea curent, indiferent de
culoarea anterioar a pixelilor respectivi. La trasarea prin tehnica XOR, se ine seama de culoarea
existent anterior a fiecrui pixel (punct grafic): pentru fiecare pixel de pe linia care se traseaz, se
nlocuiete culoarea veche cu culoarea complementar. De exemplu, dac se traseaz cu culoare
neagr o curb care intersecteaz o figur neagr deja existent, atunci n procedeul Paint noua curb
nu va fi vizibil pe poriunea care intersecteaz figura. n schimb, dac se folosete tehnica de trasare
XOR, ea va fi vizibil i pe suprafaa figurii negre, fiind trasat acolo cu alb.
2.5.1 Sistemul de coordonate
n clasa Graphics, coordonatele se exprim prin numere ntregi, unitatea fiind egal cu un
pixel, adic are dimensiunile unui punct grafic de pe ecran. n consecin, dimensiunile imaginii
exprimate n milimetri depind de rezoluia ecranului. Fiecare component are un sistem local de
coordonate, a crui origine se gsete n colul din stnga-sus al componentei respective. Axa Ox este
orizontal i este orientat ctre dreapta, iar axa Oy este vertical,orientat n jos. Contextul grafic are
sistemul propriu de coordonate, care difer de cel al componentei pe care se face desenarea. n
momentul n care este creat i ataat componentei, contextul grafic are un sistem de coordonate carese suprapune peste cel al componentei respective. Pe parcurs ns, ca urmare a utilizrii unor metode
-
7/23/2019 introducere in Grafiva Java
10/15
33
de transformare (translaie, rotaie) sistemul de coordonate al contextului grafic devine diferit de cel
al componentei.
2.5.2 Metodele clasei Graphics
Metodele clasei Graphics permit fie trasarea unor elemente de desen, fie modificarea strii
contextului grafic. Exist peste 40 de metode, dintre care le menionm aici pe cele mai frecvent
utilizate:
public abstract void translate(int x, int y)- produce o translaie a sistemului
local de coordonate al contextului grafic, fa de sistemul de coordonate curent al aceluiai context.
De exemplu, translate(20,10) are ca efect mutarea originii sistemului de coordonate al contextului
grafic n punctul care are, n prezent, coordonatele (20,10);
public abstract void setColor(Color c)- seteaz culoarea contextului grafic. Din acest
moment, trasarea desenului se va face cu noua culoare;
public abstract void setPaintMode()- produce trecerea la modul de trasare Paint;
public abstract void setXORMode(Color c1)- produce trecerea la modul de trasare
XOR. Culorile pixelilor vor alterna ntre culoarea curent a contextului grafic i cea indicat prin
argumentul c1;
public abstract void setFont(Font font)- seteaz fontul curent al contextului grafic;
public abstract void setClip(int x, int y, int width, int height)-
seteaz noul dreptunghi de decupare (n interiorul cruia desenul trasat este vizibil).Argumentele sunt
coordonatele colului din stnga-sus, limea i nlimea;
public abstract void drawLine(int x1, int y1, int x2, int y2)- traseaz
un segment de dreapt cu capetele n punctele de coordonate (x1,y1) i (x2,y2);
public abstract void fillRect(int x, int y, int width, int height)-
deseneaz un dreptunghi plin, cu colul din stnga-sus n punctul (x,y) i avnd limea i nlimea
date;
public void drawRect(int x, int y, int width, int height)- traseaz conturul
unui dreptunghi, cu colul din stnga-sus n punctul (x,y) i avnd limea i nlimea date;
public abstract void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)- traseaz conturul unui dreptunghi cu colurile rotunjite.
Ultimele dou argumente indic limea i nlimea arcului de rotunjire;
public abstract void fillRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight)- deseneaz un dreptunghi plin cu colurile rotunjite;
public abstract void drawOval(int x, int y, int width, int height)-
traseaz conturul unui oval, care este nscris ntr -un dreptunghi (invizibil) cu colul din stnga-sus n
punctul de coordonate (x,y) i avnd limea i nlimea date;
public abstract void fillOval(int x, int y, int width, int height)-
deseneaz un oval plin;
-
7/23/2019 introducere in Grafiva Java
11/15
34
public abstract void drawArc(int x, int y, int width, int height, int
startAngle, int arcAngle)- traseaz un arc de elips. Se consider c elipsa se ncadreaz
n dreptunghiul de coordonate i dimensiuni date ca argumente. Ultimele dou argumente indic
unghiul la care ncepe arcul (fa de centrul elipsei) i respectiv unghiul pe care se extinde arcul;
public abstract void fillArc(int x, int y, int width, int height, int
startAngle, int arcAngle)-se deseneaz un sector de elips plin, mrginit de arcul specificat
prin argumente;
public abstract void drawPolyline(int[] xPoints, int[] yPoints, int
nPoints)- se traseaz o linie frnt (poligonal deschis), care trece prin nPoints puncte; tablourile
xPoints i yPoints conin coordonatele (xi, yi) ale acestor puncte;
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int
nPoints)- traseaz conturul unui poligon cu nPoints vrfuri, fiind date tablourile de coordonateale
vrfurilor;
public abstract void fillPolygon(int[] xPoints, int[] yPoints, intnPoints)- se deseneaz un poligon plin cu nPoints vrfuri de coordonate date;
public abstract void drawString(String str, int x, int y)- se afieaz irul
str, folosind fontul curent. Trasarea ncepe din punctul de coordonate (x,y);
public abstract boolean drawImage(Image img, int x, int y,
ImageObserver observer) - deseneaz imaginea img, plasnd-o cu colul din stnga-sus n
punctul de coordonate (x,y) i folosind pentru conversie observatorul de imagine observer;
public abstract void dispose()- dispune distrugerea acestui context grafic, elibernd
resursele pe care le utilizeaz (n primul rnd memoria ocupat).
2.5.3 Exemple de utilizare a clasei Graphics
Exemplul 1: figuri simple i text pe suprafaa unui applet
Dup cum tim, pentru a realiza un desen avem nevoie de o suprafa suport i de un
instrument de desenare. n acest exemplu, ca suprafa suport folosim o instan a clasei
java.applet.Applet, iar ca instrument de desenare, contextul grafic oferit de clasajava.awt.Graphics.
Fiierul surs Exemplu1.java este reprodus ncontinuare.
Applet 2-2. Exemplu1.java: un exemplu de suprafa de desen.
_____________________________________________________
import java.awt.*;
import java.applet.*;
public class Exemplu1 extends Applet {
public void paint(Graphics g) {
setBackground(Color.white);
g.drawRect(10, 20, 80, 40);
g.fillRect(100, 20, 80, 40);
g.drawRoundRect(190, 20, 80, 40, 15, 10);g.drawLine(105, 0, 175, 80);
-
7/23/2019 introducere in Grafiva Java
12/15
35
g.setXORMode(Color.white);
g.drawLine(105, 80, 175, 0);
g.setFont(new Font("Serif", Font.PLAIN, 20));
g.drawString("Serif, PLAIN, 20, mod XOR", 15, 50);
g.setPaintMode();
g.setFont(new Font("Serif", Font.ITALIC+Font.BOLD, 20));g.drawString("Serif, ITALIC BOLD, 20", 15, 100);
g.setFont(new Font("SansSerif", Font.PLAIN, 20));
g.drawString("SansSerif, PLAIN, 20", 15, 130);
g.setFont(new Font("Monospaced", Font.PLAIN, 20));
g.drawString("Monospaced, PLAIN, 20", 15, 150);
}
}
_____________________________________________________
Sunt importate pachetele java.awt i java.applet. Primul conine clasele necesare pentru
desenare, iar al doilea conine clasa Applet, care este superclasa tuturor appleturilor.
Clasa Exemplu1 extinde clasa Applet, deci este un applet. Dar, aa cum s-a artat mai sus, clasa
java.applet.Applet are superclasa java.awt.Container, iar aceasta are superclasa java.awt.Component.
n consecin, clasa Exemplu1, definit aici, motenete metoda paint a clasei Component. n
programul nostru, aceast metod este redefinit pentru a trasa pe suprafaa appletului desenul dorit.
Vizualizarea appletului se face cu un browser de Web sau cu un appletviewer. n ambele cazuri,
appletul trebuie s fie ncadrat ntr-o pagin HTML. Cel mai simplu fiier HTML pentru vizualizarea
appletului nostru este urmtorul:
_____________________________________________________
Exemplul 1
n figura Figura 2-1 este dat imaginea obinut pe ecran la vizualizarea acestui applet cu un
appletviewer.
Figura 2-1 Vizualizarea appletului Exemplu1.
Metoda paint a appletului este invocat de ctre appletviewer sau de ctre browser atunci
cnd appletul apare pe ecran, furnizndu-i ca argument o referin la contextul grafic g, care va fi folosit
-
7/23/2019 introducere in Grafiva Java
13/15
36
pentru desenare. Urmrind simultan metoda paint a appletului Exemplu1 i desenul din figura
Figura 2-1, putem vedea cu uurin efectul fiecrei instruciuni. Pentru nceput, este invocat metoda
setBackground din clasa Component, pentru a stabili culoarea de fond. Sunt invocate succesiv
diferite metode ale clasei Graphics pentru a trasa desene sau pentru a modifica starea contextului
grafic. Se traseaz mai nti trei dreptunghiuri: unul gol, unul plin si unul gol cu coluri rotunjite. Se
traseaz apoi dou linii nclinate, care intersecteaz dreptunghiul plin. Prima din ele este trasat n modul implicit care este Paint. n consecin, aceast linie este vizibil numai n afara dreptunghiului
pe care l intersecteaz. Se trece apoila modul de trasare XOR i se deseneaz a doua linie, care este
acum vizibil pe toat lungimea ei, datorit alternrii culorilor. Fr a schimba acest mod de desenare,
se invoc metoda setFont pentru a stabili fontul contextului grafic i se scrie peste dreptunghiuri
textul Serif, PLAIN, 20. ntruct modul de desenare a rmas XOR, textul este n ntregime vizibil, chiar
i pe poriunea unde este scris pe negru. Se trece apoi la modul Paint i se mai scriu trei texte, cu
diferite fonturi.
Exemplul 2: influena componentei alpha a culorii
n appletul urmtor se demonstreaz influena modificrii opacitii culorii, dat prin
componenta alpha din sistemul RGB. Este scris mai nti un text direct pe suprafa a appletului, dup
care se aplic deasupra trei dreptunghiuri pline cu culori avnd diferite valori ale componentei alpha.
Peste acestea, se scrie apoi un nou text, mai jos dect cel anterior.
Applet 2-3. Exemplu2.java: exemplificarea influenei modificrii opacitii culorii.
_____________________________________________________
import java.awt.*;
import java.applet.*;
public class Exemplu2 extends Applet {public void paint(Graphics g) {
setBackground(Color.white);
g.setFont(new Font("SansSerif", Font.BOLD, 18));
g.drawString("Un text scris pe fundal", 20, 40);
g.drawRect(10, 10, 50, 80);
g.drawRect(70, 10, 50, 80);
g.drawRect(130, 10, 50, 80);
g.setColor(new Color(200, 200, 200, 100));
g.fillRect(10, 10, 50, 80);
g.setColor(new Color(200, 200, 200, 150));
g.fillRect(70, 10, 50, 80);g.setColor(new Color(200, 200, 200, 200));
g.fillRect(130, 10, 50, 80);
g.setColor(Color.black);
g.drawString("Un text scris deasupra", 20, 70);
}
}____________________________________________________
Imaginea obinut pe ecran n urma vizualizrii acestui applet cu un appletviewer este dat n
figura Figura 2-2. Se poate observa cu uurin c, cu ct este mai mare valoarea componentei alpha a
culorii, cu att este mai puin vizibil textul de pe fundal, peste care este aplicat dreptunghiul respectiv.
-
7/23/2019 introducere in Grafiva Java
14/15
37
Figura 2-2 Vizualizarea appletului Exemplu2
Exemplul 3: imagini, poligoane, folosirea translaiilor.
Appletul Exemplu3, a crui surs este reprodus mai jos, servete pentru a demonstra modul
n care se pot afia pe suprafaa appletului imagini importate (date sub form de fi iere n format gif
sau jpeg) i cum se pot trasa poligoane goale sau pline, ale cror coordonate ale vrfurilor sunt stabilite
prin calcul. Dac acelai poligon este trasat de mai multe ori n poziii diferite, pentru a evita
recalcularea tablourilor de coordonate se face o translaie sistemului de coordonate al contextului
grafic.
Applet 2-4. Exemplu3.java: afiarea imaginilor importate.
_____________________________________________________
import java.awt.*;
import java.applet.*;
public class Exemplu3 extends Applet {
int[] xStea=new int[5], yStea=new int[5],
xSin=new int[61], ySin=new int[61];Image imagine;
public void init() {
imagine = getImage(getCodeBase(),"./javalogo52x88.gif");
// Generarea varfurilor stelei
double u=2*Math.PI/5;
for(int i=0; i
-
7/23/2019 introducere in Grafiva Java
15/15
38
g.translate(-100, 40);
g.drawPolygon(xSin, ySin, 61);
g.translate(70, 0);
g.fillPolygon(xSin, ySin, 61);
}
}_____________________________________________________
Pe suprafaa appletului se reprezint dou stele de form i dimensiuni identice (una goal i
alta plin), dou grafice ale funciei sin(x) (unul gol i altul plin) i o figur, care reprezint sigla
platformei Java de la firma Sun Microsystems. Pentru fiecare poligon se folosesc dou tablouri, din
care unul pentru coordonatele x, iar al doilea pentru coordonatele y ale vrfurilor.
n metoda init() se genereaz coordonatele vrfurilor att pentru stea, ct i pentru
graficul funciei sinusoidale. Tot n aceast metod, se creeaz obiectul care conine fiierul de
imagine. ntruct, n cazul de fa, fiierul de imagine "javalogo52x88.gif" se gsete n acelai director
cu cel al appletului, pentru a determina URL-ul directorului n care se gsete fiierul-imagine se
folosete metoda getCodeBase(). n consecin, la invocarea metodeigetImage()se dau doi
parametri: primul specific directorul n care se gsete appletul, iar al doilea reprezint calea de la
acest director ctre fiierul de imagine.
La generarea coordonatelor vrfului stelei, s-a considerat c originea sistemului de coordonate
este n centrul acesteia. n consecin, nainte de fiecare din cele dou trasri ale stelei, s-a efectuat o
translaie a axelor de coordonate ale contextului grafic, astfel nct s se aduc centrul stelei n poziia
dorit.
Pentru reprezentarea funciei sinusoidale, intervalul [0.0, 2*Math.PI] a fost mprit n 60 de
subintervale, calculndu-se, n mod corespunztor 61 perechi de coordonate. Acestea au fost
convertite n numere ntregi (dup nmulirea cu factorii de scar corespunztori) i au fost memorate
n tablourile xSin i ySin. nainte de desenarea figurilor, s-au fcut iari translaiile corespunztoare
ale axelor de coordonate.
Rezultatul vizualizrii appletului n appletviewer este prezentat n figuraFigura 2-3.
Figura 2-3 Vizualizarea appletului Exemplu3.