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 .