introducere in Grafiva Java

download introducere in Grafiva Java

of 15

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.