Sunteți pe pagina 1din 13

Programare Java

Curs 9
CREAREA DE INTERFETE GRAFICE PENTRU APPLETURI
Realizarea unei astfel de interfete in limbajul Java se bazeaza in principal pe
biblioteca AWT ( Abstract Windowing Toolkit ) , care contine un set de clase pentru
crearea si folosirea unor astfel de interfete grafice pentru utilizator .
AWT
Dupa cum am mai spus AWT reprezinta un set de clase care ne ajuta - printre altele sa cream o interfata grafica utilizator care sa reactioneze la datele de intrare primite de
la mouse sau tastatura .
Deoarece Java este un limbaj independent de platforma AWT ofera modalitatea de a
proiecta o interfata care sa fie la fel reprezentata si cu aceleasi caracteristici pe orice
sistem pe care ar rula . Folosind pachetul AWT avem de luat in calcul mai multe
elemente care compun o interfata grafica :
-

componente - orice element poate fi practic plasat pe o interfata utilizator :


butoane , liste derulante , meniuri popup , casete de validare sau campuri de
text .
containere - acestea reprezinta de fapt componente care pot contine la randul
lor alte componente . Un exemplu de container este chiar fereastra Applet , iar
alte exemple ar putea fi panouri , casete de dialog sau ferestre independente .
administratori de dispunere - acestia sunt de fapt niste obiecte care definesc
modul de dispunere a componentelor intr-un container . Un astfel de
administrator nu este un element propriu-zis vizual , nu vedem pe ecran un
astfel de obiect , efectele sale sunt insa vizibile .

Toate clasele AWT sunt bineinteles incluse in pachetul java.awt . Pentru a le putea
folosi trebuie importat acest pachet explicit la inceputul codului nostru sursa .
Importarea intregului pachet are ca rezultat disponibilizarea pentru programator a
tuturor componentelor , containerelor si administratorilor de dispunere folositi pentru
realizarea unei interfete grafice . O alta modalitate de a putea folosi clasele necesare
este si importarea individuala a claselor necesare .
COMPONENTELE INTERFETEI GRAFICE
Acestea sunt pozitionate in cadrul interfetei pe care o construim prin adaugarea lor
intr-un container . Acesta este chiar el o componenta si deci poate fi la randul sau
adaugat in alt container . Cel mai usor mod de a demonstra cum se proiecteaza o
interfata este folosirea containerului cu care am lucrat in ultimele cursuri - clasa
Applet .

ADAUGAREA DE COMPONENTE LA UN CONTAINER


Exista doar doi pasi care trebuie urmati pentru a adauga o componenta la un
container :
-

crearea componentei respective


apelarea metodei add() a containerului pentru componenta respectiva

Datorita faptului ca un Applet este un container putem folosi metoda add() in cadrul
unui applet pentru a adauga o componenta direct in fereastra Applet .
Fiecare componenta AWT la randul ei este o clasa , deci componenta este creata
propriu-zis prin crearea unui obiect al clasei respective .
De exemplu , clasa Button reprezinta butoanele din cadrul unei interfete grafice . Un
buton se creaza specificand eticheta sa in metoda constructorului , ca mai jos :
Button butonNou=new Button("Apasa aici");
Parametru de tip string primit de constructor se refera la textul care se va afisa pe
suprafata butonului .
Dupa ce s-a creat componenta cea mai simpla metoda de a o adauga este folosirea
metodei add() cu numele componentei ca argument :
add(butonNou);
Adaugarea componentei nu duce automat si la desenarea ei pe ecran . Ea va fi afisata
doar dupa apelul metodei paint() a containerului ; putem folosi si metoda repaint()
pentru a forta afisarea unor noi componente eventual adaugate .
La momentul adaugarii unei componente intr-un container se observa ca nu i se
acorda acesteia nici o pozitionare - prin coordonate x si y ; acesta pozitionare se face
doar prin administratorii de dispunere . In cazul in care nu specificam un
administrator de dispunere se foloseste automat un administrator Java numit
FlowLayout - acesta ordoneaza componentele de la stanga la dreapta , iar cand nu mai
este loc pe linie se trece la urmatoarea linie , mai jos .
Pentru crearea componentelor in applet vom folosi metoda init() . In continuare aveti
un exemplu de creare a unui buton in cadrul unui applet ; acest buton are un text afisat
pe el si va fi afisat propriu-zis doar dupa apelarea metodei paint() :
import java.awt.*;
public class Buton extends java.applet.Applet {
String mesaj="Numele butonului . Nu apasati";
Button butonNou=new Button(mesaj);
public void init() {
add(butonNou);
}
}

ETICHETE
O eticheta este de fapt cea mai simplista componenta a unei intergete grafice , ea fiind
implementata prin clasa Label . Etichetele se folosesc pentru a identifica rolul
celorlalte componente si nu pot fi modificate direct de utilizator - de fapt reprezinta
niste siruri afisate in dreptul celorlalte componente pentru a ne arata cu ce se ocupa
componenta respectiva .
Folosirea etichetelor pentru text se foloseste in locul metodei drawString() din mai
multe cauze :
-

o eticheta este desenata automat si nu are nevoie de tratare explicita de catre


metoda paint()
etichetele pot fi dispuse in fereastra conform cu administratorii de dispunere
folositi si nu nevoie de o pozitionare prin coordonate date in pixeli

Pentru a crea o eticheta putem incerca mai multemetode :


-

Label() - aceasta instructiune creaza o eticheta goala , cu textul aliniat automat


la stanga
Label(sir) - creaza o eticheta cu textul specificat prin variabila de tip String ,
alinierea textului fiind la stanga
Label(sir,argument2) - creaza o eticheta cu sirul dat ca text si cu alinierea
indicata de argumentul al doilea . Pentru a seta alinierea se pot folosi
variabilele de clasa : Label.RIGHT , Label.LEFT si Label.CENTER , care duc
la alinierea textului la dreapta , la stanga si respectiv centrat .

Pentru a modifica textul etichetei dupa crearea acesteia putem folosi metoda
setText(sir) ; noul sir dat ca parametru este afisat dupa reimprospatarea componentei .
O alta metoda folositoare este si getText() care ne returneaza valoarea textului
etichetei .
In continuare avem un exemplu de applet in care s-au creat trei etichete ; in codul
sursa apare si un obiect de tip GridLayout - acesta este folosit pentru a putea vedea
efectul alinierii etichetelor . In cazul in care nu l-am fi folosit Java ar fi apelat implicit
administratorul FlowLayout care nu ne-ar mai fi permis sa aliniem etichetele .
Administratorii de dispunere vor fi prezentati mai tarziu detaliat .
import java.awt.*;
public class Etichete extends java.applet.Applet {
Label stanga=new Label("Aliniat la stanga");
Label dreapta=new Label("Aliniat la dreapta",Label.RIGHT);
Label centrat=new Label("Aliniat pe centru",Label.CENTER);
Font f=new Font("Helvetica",Font.BOLD,18);
GridLayout dispunere=new GridLayout(3,1);
public void init() {
setFont(f);
setLayout(dispunere);
add(stanga);

setForeground(Color.green);
add(centrat);
setForeground(Color.blue);
add(dreapta);
}
}
BUTOANE
Un buton reprezinta de fapt o zona pe care putem efectua un clic ; el poate fi creat cu
ajutorul clasei Button . In general aceste butoane sunt folosite pentru a declansa o
actiune atunci cand se efectueaza un clic pe suprafata lor .
Ca sa cream un buton trebuie sa urmam una dintre caile urmatoare : fie apelam
constructorul Button() care ne creaza un buton fara nici un text fie apelam
constructorul cu un argument de tip String care este de fapt chiar textul butonului .
Odata creat acest buton ii mai putem modifica textul cu ajutorul metodei setLabel()
sau putem folosi metoda getLabel() pentru a afla textul acestui buton .
OBS. : setLabel() si getLabel() nu au legatura cu clasa Label , ele se refera doar la
clasa Button .
In continuare avem un exemplu de applet care va prezenta cinci butoane pentru
functiile unui casetofon ( de exemplu ) :
import java.awt.*;
public class Casetofon extends java.applet.Applet {
Button inapoi=new Button("Inapoi");
Button inainte=new Button("Inainte");
Button play=new Button("Play");
Button stop=new Button("Stop");
Button pauza=new Button("Pauza");
public void init() {
add(inapoi);
add(inainte);
add(pauza);
add(stop);
add(play);
}
}
CASETE DE VALIDARE

Aceste componente , numite in engleza checkbox , sunt in practica niste casete patrate
care pot fi bifate sau nu cu ajutorul unui clic de mouse . Scopul lor este in general de a
selecta sau deselecta anumite facilitati ale unui program .
In majoritatea cazurilor in care se folosesc casete de validare acestea sunt
neexclusive , adica oricare dintre casete poate avea valoare bifat sau nu , putand deci
fi bifate la un moment dat chiar si toate casetele sau nici una . O alta modalitate de
folosire a acestor casete este si gruparea lor care duce la realizarea asa numitelor
butoane radio ; proprietatea acestora de baza este faptul ca la un moment dat poate fi
activ ( bifat ) doar un singur caz , o singura caseta .
Ambele tipuri de casete de validare sunt implementate cu ajutorul clasei Checkbox .
Pentru a crea o caseta de validare neexclusiva putem folosi unul dintre urmatorii
constructori :
-

Checkbox() - care creaza o caseta de validare fara eticheta si nevalidata


( nebifata )
Checkbox(sir) - care creaza o caseta de validare cu eticheta fiind sirul dat ca
parametru si nevalidata .

Odata creat un obiect Checkbox se foloseste metoda setState(boolean) pentru a


modifica starea acestuia : valoarea true pentru a bifa caseta si valoarea false pentru a
debifa caseta de validare . Metoda getState() returneaza o valoare Boolean care ne
indica starea de validare a casetei la momentul respectiv .
In listingul de mai jos avem un exemplu de applet care creaza cinci casete de validare
neexclusive care permit selectarea unor marci de automobile :
import java.awt.*;
public class Bifare extends java.applet.Applet {
Checkbox caseta1=new Checkbox("Volvo");
Checkbox caseta2=new Checkbox("BMW");
Checkbox caseta3=new Checkbox("Mercedes");
Checkbox caseta4=new Checkbox("Audi");
Checkbox caseta5=new Checkbox("Dacia");
public void init() {
add(caseta1);
add(caseta2);
add(caseta3);
add(caseta4);
add(caseta5);
caseta5.setState(true);
}
}
In cazul in care dorim sa grupam mai multe casete de validare intr-un grup pentru a
realiza niste butoane radio vom crea un obiect CheckboxGroup :
CheckboxGroup grup=new CheckboxGroup();

Acest obiect va pastra starea tuturor casetelor din grupul respectiv si va fi folosit ca
argument suplimentar pentru constructorul Checkbox . Pentru a crea o caseta de
validare care apartine unui grup vom folosi o instructiune de genul :
Checkbox(sir,grupCaseteValidare,boolean)
Aceasta instructiune va crea o caseta cu eticheta conform a cu sirul si cu starea de
bifare sau nebifare setata de argumentul de tip boolean .
In continuare avem un exemplu care creaza un grup cu trei casete de validare :
import java.awt.*;
public class Bifare extends java.applet.Applet {
CheckboxGroup grup=new CheckboxGroup();
Checkbox caseta1=new Checkbox("Volvo",grup,false);
Checkbox caseta2=new Checkbox("BMW",grup,false);
Checkbox caseta3=new Checkbox("Mercedes",grup,true);
Checkbox caseta4=new Checkbox("Audi",grup,false);
Checkbox caseta5=new Checkbox("Dacia",grup,false);
public void init() {
add(caseta1);
add(caseta2);
add(caseta3);
add(caseta4);
add(caseta5);
}
}
In cazul in care vrem sa modificam starea de validare a unui buton radio dintr-un grup
putem folosi metoda setCurrent(validare) . Putem folosi si metoda getCurrent() pentru
a intoarce valoarea curenta de bifare a unei casete de validare .
LISTE DE OPTIUNI
Acestea sunt create cu ajutorul clasei Choice si permit alegerea unei singure optiuni
dintr-o lista derulanta pe verticala .
Pentru a crea o astfel de lista trebuie mai intai sa cream un obiect Choice care va
pastra lista propriu-zisa :
Choice lista=new Choice();
Elementele listei se adauga la aceasta prin metoda addItem(sir) a obiectului de tip
Choice . Metoda addItem() poate fi folosita si dupa ce lista noastra a fost deja
adaugata la un container .
In codul sursa de mai jos s-a realizat un applet care permite selectarea unei echipe de
fotbal dintr-o lista de patru echipe :
import java.awt.*;

public class ListaSelectie extends java.applet.Applet {


Choice lista=new Choice();
Label eticheta=new Label("Echipa care credeti ca va castiga Liga Campionilor in
2002 :");
public void init() {
add(eticheta);
lista.addItem("Real Madrid");
lista.addItem("Manchester United");
lista.addItem("Bayer Leverkusen");
lista.addItem("Barcelona");
add(lista);
}
}
In cadrul clasei Choice exista mai multe metode folositoare pentru controlul asupra
unei liste de selectie :
-

getItem(int) - aceasta metoda returneaza textul optiunii din pozitia specificata


de argumentul intreg , prima optiune avand pozitia 0
countItems() - intoarce numarul de elemente ale listei
getSelectedIndex() - intoarce pozitia elementului care este selectat la acel
moment
getSelectedItem() - intoarce textul elementului selectat la acel moment
select(int) - selecteaza elementul aflat pe pozitia specificata de argument
select(String) - selecteaza primul element din lista care are sirul dat ca
parametru drept text

OBS. : Trebuie sa facem cateva observatii legate de unele metode prezentate in


paragrafele de mai sus :
- metoda Checkbox(String,grup,boolean) a fost inlocuita in Java 2 cu metoda
Checkbox(String,boolean,grup); putem folosi in continuare si prima varianta
dar la compilare vom obtine un mesaj legat de deprecierea metodei respective
- metoda addItem(String) folosita pentru a adauga un element intr-o lista de
optiuni se va inlocui incepand cu Java 2 cu metoda add(String) a clasei Choice
CAMPURI DE TEXT
Textul introdus in applet prin componentele precedente nu era modificabil de catre
utilizator , doar programatorul avand posibilitatea de a face acest lucru . Campurile de
text dau posibilitatea utilizatorului sa poata introduce propriul text in program . Aceste
componente ale interfetei sunt implementate cu ajutorul clasei TextField .
Pentru a crea un camp de text putem folosi una dintre urmatoarele patru variante :
-

TextField() - va crea un camp gol si fara o latime specificata


TextField(int) - va crea un camp gol care are o latime pentru a afisa un numar
de caractere specificat de argumentul intreg .
TextField(String) - creaza un camp de text completat cu sirul dat ca parametru

TextField(String,int) - creaza un camp completat cu sirul dat ca parametru si


cu latimea data de argumetul intreg . OBS. : incepand cu Java 2 se recomanda
folosirea acestui constructor in locul lui TextField(int) .

Atributele responsabile cu latimea campului de text au de fapt importanta doar in


cazul folosirii unor administratori de dispunere care nu redimensioneaza
componentele - ca de exemplu FlowLayout .
In cazul in care vrem ca textul introdus de la tastatura de utilizator sa nu fie vizibil in
clar - de exemplu in cazul parolelor - putem folosi o metoda numita
setEchoCharacter(char) care va primi ca argument un caracter ce trebuie inclus intre
apostroafe ( de exemplu : '@' ) .
OBS. : Incepand cu Java 2 metoda setEchoCharacter(char) se poate inlocui cu metoda
setEchoChar(char) .
In continuare este prezentat un applet care utilizeaza mai multe campuri de text in clar
si un camp de text care ascunde textul introdus de utilizator :
import java.awt.*;
public class CampuriText extends java.applet.Applet {
Label eticheta1=new Label("Nume : ");
TextField nume=new TextField(30);
Label eticheta2=new Label("Prenume : ");
TextField prenume=new TextField(30);
Label eticheta3=new Label("Parola : ");
TextField parola=new TextField(30);
public void init() {
add(eticheta1);
add(nume);
add(eticheta2);
add(prenume);
add(eticheta3);
parola.setEchoChar('@');
add(parola);
}
}
Clasa TextField are si ea cateva metode foarte des folosite pentru a controla campurile
de text :
-

metoda getText() - returneaza textul continut de camp


metoda setText(String) - completeaza campul de text cu sirul specificat ca
argument
metoda setEditable(boolean) - determina daca respectivul camp de text poate
fi sau nu modificat de utilizator . Argumentul false duce la blocarea campului

pentru introducerea de text iar argumentul true permite introducerea de text


din partea utilizatorului
metoda isEditable() - returneaza starea unui camp de text printr-o valoare
booleana ; daca respectivul camp de text poate fi editat va returna true iar daca
nu este editabil va returna false

ZONE DE TEXT
Aceste componente - numite text area in engleza - sunt de fapt niste campuri de text
care contin mai multe linii ( spre deosebire de campurile de text clasice care apar doar
pe un rand ) . O zona de text poseda si bare de scroll pentru eventualul text care nu
incape in partea vizibila a zonei de text .
Pentru a crea o astfel de zona de text trebuie sa folosim unul dintre cei patru
constructori de mai jos :
-

TextArea() - creaza o zona de text goala cu inaltime si latime nespecificate


TextArea(int,int) - creaza o zona goala care contine numarul de linii dat de
primul argument si are latimea data de numarul de caractere care este
specificat de cel de-al doilea argument intreg
TextArea(String) - creaza o zona de text care contine sirul dat ca argument
TextArea(String,int,int) - creaza o zona de text care contine sirul dat ca
argument , numarul de linii dat de primul argument intreg si lungimea unei
linii de atatea caractere cat reprezinta al doilea argument intreg

In exemplul de mai jos avem o zona de text gata completata cu un text :


import java.awt.*;
public class ZonaText extends java.applet.Applet {
String sir="Text introdus pentru a arata modalitatea de a introduce \ntext
predefinit in cadrul unei zone de text create in limbajul Java .";
TextArea zona;
public void init() {
zona=new TextArea(sir,10,70);
add(zona);
}
}
In cazul zonelor de text mai trebuie sa mentionam ca ele sunt inrudite cu campurile de
text nu numai din punct de vedere logic ci si ca ierarhie de clase Java ; ambele
componente mostenesc de fapt o clasa numita TextComponent , clasa care de fapt
poseda metodele setText() , getText() , setEditable() si isEditable() si astfel aceste
metode sunt disponibile si clasei TextArea .
Zonele de text poseda si ele unele metode proprii foarte utile :

metoda insertText(String,int) - insereaza sirul dat ca parametru la pozitia data


de argumentul intreg ; prima valoare a indexului este 0 . OBS. : Incepand cu
Java 2 metoda se recomanda a se inlocui cu metoda insert(String,int) .
metoda replaceText(String,int,int) - inlocuieste textul aflat intre pozitiile
indicate de argumentele intregi cu sirul dat ca prim argument . OBS. : Si
aceasta metoda are o alta versiune incepand cu Java 2 , si anume metoda
replace(String,int) .

LISTE DERULANTE
Aceste componente - scrolling lists - sunt create cu ajutorulclasei List si sunt
asemanatoare cu listele de optiuni avand de fapt doar doua diferente majore :
1. o lista derulanta poate fi configurata astfel incat sa poata fi selectate mai multe
optiuni
2. aceste liste se prezinta ca o zona de text in care sunt afisate mai multe optiuni
iar daca lista contine mai multe optiuni decat pot fi afisate atunci apare bara de
scroll .
Lista derulanta este definita prin crearea unui obiect List la care apoi se adauga
elementele propriu-zise ale listei . Pentru a realiza acest lucru putem folosi unul dintre
constructorii de mai jos :
-

List() - creaza o lista vida care permite o selectie unica de element


List(int , boolean) - creaza o lista derulanta care are un numar de elemente
vizibile la un moment dat specificat prin argumentul intreg iar argumentul
boolean indica daca pot fi selectate mai multe optiuni - in cazul posibilitatii
selectarii mai multor optiuni argumentul trebuie sa aiba valoarea true

Odata creat un obiect List ii folosim metoda addItem(String) pentru a adauga


elemente la acest obiect - OBS. : Ca si in cazul listei de optiuni , incepand cu Java 2
metoda aceasta se recomanda a fi inlocuita cu metoda add(String) a clasei List .
Ca si orice alta componenta si lista derulanta trebuie adaugata intr-un container cu
ajutorul metodei add() .
Exemplul de mai jos ne prezinta o lista derulanta cu patru elemente vizibile la un
moment dat ( dintr-un total de sase elemente ale listei ) :
import java.awt.*;
public class ListaDerulanta extends java.applet.Applet {
List lista=new List(4,true);
Label eticheta=new Label("Selectati ziarele pe care le cititi : ");
public void init() {
add(eticheta);
lista.add("Evenimentul zilei");
lista.add("Curentul");
lista.add("Libertatea");
lista.add("ProSport");

lista.add("Gazeta Sporturilor");
lista.add("Monitorul oficial");
add(lista);
}
}
Ca si in cazul celorlalte componente si listele derulante au cateva metode des utilizate
in conjunctie cu ele :
-

metodele getItem(int) , countItems() , getSelectedIndex() , getSelectedItem() si


select(int) sunt aceleasi ca si pentru listele de optiuni . Metoda countItems()
are un inlocuitor incepand cu Java 2 in persoana metodei getItemCount() - atat
in cazul listelor de optiuni cat si al listelor derulante .
metoda getSelectedIndezes() - intoarce un tablou de intregi care contine
pozitiile fiecarui element selectat .
metoda getSelectedItems() - intoarce un tablou de siruri care contine textul
fiecarui element selectat .

BARE DE SCROLL
Componentele numite bare de derulare - scrollbars - sunt cele care permit selectarea
unei valori prin deplasarea unei casete intre doua sageti . Dupa cum am vazut in cazul
componentelor anterioare mai multe dintre acestea au incorporate astfel de bare de
derulare ( de exemplu zonele de text sau listele derulante ) . Clasa Scrollbar este cea
responsabila pentru alte tipuri noi de bare de scroll . O astfel de bara de scroll poate fi
orizontala sau verticala .
Barele de derulare sunt folosite in general pentru a specifica valorile minime si
maxime care pot fi stabilite prin utilizarea componentei .
Pentru a crea o bara de scroll trebuie sa folosim unul dintre constructorii urmatori :
-

Scrollbar() - creaza o bara de scroll verticala cu valorile minima si maxima


setate initial la 0
Scrollbar(int) - creaza o bara de scroll cu valorile maxima si minima setate la 0
iar orientarea este data de argumentul intreg . Acest argument poate lua ca
valori urmatoarele variabile de clasa : Scrollbar.HORIZONTAL ,
Scrollbar.VERTICAL .
Scrollbar(int,int,int,int,int) - se creaza astfel o bara de scroll cu caracteristicile
urmatoare :
- primul argument stabileste orientarea cu ajutorul variabilelor de clasa
prezentate mai sus
- valoarea initiala a barei de scroll , care trebuie sa fie intre valorile
minima si maxima ale barei
- latimea sau inaltimea generala a casetei folosite pentru modificarea
valorii barei de scroll ; in cazul in care se foloseste marimea predefinita
a acestei casete vom folosi valoarea 0 pentru acest al treilea argument
- valoarea minima a barei de scroll
- valoarea maxim a barei de scroll

In exemplul de mai jos se creaza o bara de scroll orizontala . Pentru a afisa bara de
scroll pe toata latimea ecranului trebuie sa folosim un administrator de dispunere - si
se va folosi GridLayout pentru a imparti ecranul in 15 linii iar bara noastra de scroll
va acoperi prima linie astfel creata a ecranului ; caseta care gliseaza pe bara noastra de
scroll va fi initial la o cincime din lungimea barei si va avea ca latime tot o cincime
din lungimea barei , lucru setat din constructorul folosit pentru crearea barei noastre :
import java.awt.*;
public class BaraScroll extends java.applet.Applet {
GridLayout admin=new GridLayout(15,1);
Scrollbar bara=new Scrollbar(Scrollbar.HORIZONTAL,20,20,1,100);
public void init() {
setLayout(admin);
add(bara);
}
}
Si clasa Scrollbar ofera cateva metode practice cum ar fi :
-

metoda getValue() - returneaza valoarea curenta a barei de derulare .


metoda setValue(int) - seteaza valoarea curenta a barei

SUPRAFETE DE DESENARE
Aceste componente sunt in general folosite ca loc pentru afisarea de imagini sau
animatii . Bineinteles ca putem desena si pe alte componente - ca de exemplu in
fereastra Applet - insa obiectele Canvas ( aceasta fiind clasa responsabila de
implementarea suprafetelor de desenare ) sunt cele mai simplu de folosit in acest
scop .
Pentru a folosi o suprafata de desenare trebuie mai intai sa cream o subclasa a clasei
Canvas ; aceasta subclasa se poate ocupa de toate operatiunile de desenare care
trebuie sa aiba loc in metoda sa paint() .
Dupa ce s-a creat o subclasa Canvas aceasta poate fi folosita in aplicatia noastra prin
apelarea constructorului sau si prin adaugarea noului obiect Canvas intr-un container .
Pentru a exemplifica teoria de mai sus sa studiem putin applet urmator ; acesta
deseneaza o cruce in centrul ferestrei Applet si poate muta centru acesteia daca
fereastra care publica appletul este redimensionata :
import java.awt.*;
public class Cruce extends java.applet.Applet {
GridLayout admin=new GridLayout(1,1);
canvasNou suprafata=new canvasNou();

public void init() {


setLayout(admin);
add(suprafata);
}
}
class canvasNou extends java.awt.Canvas {
public void paint(Graphics ecran) {
int x=getSize().width/2;
int y=getSize().height/2;
ecran.setColor(Color.blue);
ecran.drawLine(x-10,y,x-2,y);
ecran.drawLine(x+10,y,x+2,y);
ecran.drawLine(x,y-10,x,y-2);
ecran.drawLine(x,y+10,x,y+2);
}
}
Acest applet contine in codul sau sursa doua clase ; prima dintre ele :- Cruce , este
chiar appletul insusi . A doua clasa este o clasa creata de noi ca fiind o subclasa a
clasei Canvas .
Clasa Cruce creaza un obiect GridLayout care va fi stabilit drept administrator de
dispunere cu ajutorul metodei setLayout() , creaza un obiect de tipul celei de a doua
clase create in applet si apoi adauga acest obiect in containerul desemnat de insasi
fereastra Applet . Datorita folosirii administratorului de dispunere suprafata de
desenare numita "suprafata" va cuprinde de fapt toata suprafata ferestrei appletului .
In cadrul clasei canvasNou se determina mai intai mijlocul ferestrei Applet - lucru
facut dinamic astfel incat totdeauna , indiferent de eventuala redimensionare a
ferestrei , variabilele x si y vor contine coordonatele corecte pentru jumatatea laturilor
ferestrei . Tot aici este setata si culoare pentru desenare , culoarea albastra . Trebuie
atrasa atentia ca aceasta metoda - ca si metodele de desenare propriu-zisa a liniilor ce
compun vrucea - este apelata pentru obiectul de tip Graphics al metodei paint() si nu
pentru suprafata de desenare . Obiectul ecran , de tipul Graphics , se ocupa de toate
eventualele operatii de desenare care au loc pe obiectul suprafata de desenare . Finalul
clasei canvasNou se ocupa de desenarea directa a celor patru linii care formeaza
crucea , fiecare linie avand cate 6 pixeli lungime si terminandu-se la 4 pixeli de
punctul care reprezinta exact centrul ferestrei .

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