Apleturi Java
3. Exemplul 1: un aplet simplu
In primul exemplu voi explica modalitatea de a
scrie un text, de a desena diferite forme geometrice etc.
Clasele din pachetele despre care
tocmai am vorbit sunt folosite intr-un program prin includerea la inceput a
unei linii de forma: import numeClasa;
Clasa java.applet.Applet
este clasa de baza din care deriva orice aplet, deci ea trebuie inclusa intotdeauna
cand construim un aplet. Pentru a putea folosi elemente grafice, vom mai include
clase din pachetul java.awt.
Iata un prim exemplu de aplet:
import java.applet.Applet;
import java.awt.Graphics;
public class PrimulAplet extends
Applet{
public void paint(Graphics
g){
g.drawString("Primul aplet",50,25);
}
}
Metoda paint
este mostenita de clasa Applet
(de la clasa Component)
si se foloseste pentru a desena obiecte. Ea are antetul public
void paint(Graphics g). Aici am suprascris-o
(iata deci un exemplu de polimorfism!) pentru a executa ceea ce dorim noi.
Functia care realizeaza afisarea unui text este
drawString
(functie membra a clasei Graphics),
ce primeste ca parametri textul de afisat si coordonatele x si y unde textul
respectiv va fi scris pe ecran.
Pentru a vedea rezultatele rularii acestui aplet, trebuie ca fisierul HTML sa
contina urmatoarea linie:
<applet code="PrimulAplet.class" width=150
height=25></applet>
Putem introduce in sursa
HTML parametrii care vor fi transmisi apletului, astfel:
<applet ...>
<param name=titlu value="Acesta este primul
meu aplet">
</applet>
Atunci modificam codul apletului
folosind functia getParameter(String
nume), membra a clasei Applet:
public class PrimulAplet
extends Applet{
private String sir;
public void init(){
sir=getParameter("titlu");
if(sir==null) sir="Primul aplet";
}
public void paint(Graphics
g){
g.drawString(sir,50,25);
}
}
Intr-un aplet java nu exista
o functie main
(cum este in C++ sau in aplicatiile java), care determina apelul celorlalte
functii. Atunci care este ordinea in care vor fi executate functiile?
Executia unui aplet este marcata de cateva evenimente
importante generate de catre browser. La intalnirea etichetei <applet>,
browserul incarca fisierul necesar rularii apletului (fisierele .class).
Apletul nu poate rula pana cand codul nu a ajuns pe calculatorul client.
Dupa incarcarea codului, apletul este apelat automat
pentru initializare prin functia init().
Este momentul in care apletul isi pregateste parametrii si obtine de la sistem
resursele necesare rularii. In exemplul nostru functia init
citeste parametrul titlu
transmis apletului de fisierul HTML.
Dupa ce initializarea a fost terminata, browserul
trimite catre aplet o comanda de pornire (functia start()).
Un aplet ruleaza atat timp cat navigatorul este activ. La schimbarea paginii
curente, apleturile din vechea pagina primesc o comanda de oprire temporara
(functia stop()).
La inchiderea browserului este lansata functia destroy()
care distruge toate variabilele alocate, eliberand memoria. Toate aceste functii
sunt definite in clasa Applet
si sunt apelate automat de sistem. Daca sunteti atenti, atunci cand Internet
Explorer incarca un aplet java, scrie pe bara de jos mai intai "Applet initialized",
apoi "Applet started", care va sta scris atata vreme cat apletul este activ.
Daca apasati butonul "Refresh", va scrie "Applet stopped", si apoi va trece
iar la initializare (cu init())
si va porni din nou apletul (cu start()).
Orice aplet Java reprezinta deci un nou tip de
obiect, derivat din obiectul standard Applet.
Sa desenam acum pe ecran diferite
obiecte grafice. Pentru aceasta, sa folosim urmatoarele functii, care au fost
definite in clasa java.awt.Graphics
astfel:
- public
abstract void drawLine(int x1, int y1, int x2, int y2);
deseneaza o linie de la punctul (x1,y1) la punctul (x2,y2), cu culoarea curenta
(vom vedea cum o putem schimba);
- public
void drawRect(int x, int y, int width, int height);
deseneaza un patrat cu coltul din stanga sus (x,y) si de latimea width
si inaltimea height;
- public
abstract void fillRect(int x, int y, int width, int height);
deseneaza un patrat plin;
- public
abstract void drawRoundRect(int x, int y, int width, int height, int arcWidth,
int arcHeight); deseneaza un patrat cu colturile
rotunde;
- public
abstract void fillRoundRect(int x, int y, int width, int height, int arcWidth,
int arcHeight); deseneaza un patrat plin
cu colturile rotunde;
- public
void draw3DRect(int x, int y, int width, int height, boolean raised); daca
parametrul raised
are valoarea true,
deseneaza un patrat cu umbra (asa cum sunt butoanele); iar daca este false,
deseneaza un patrat ca un buton apasat;
- public
void fill3DRect(int x, int y, int width, int height, boolean raised);
un patrat plin cu umbra;
- public
abstract void drawOval(int x, int y, int width, int height);
deseneaza un oval cu parametri specificati (desigur ca daca width
si height
sunt egale, va fi desenat un cerc);
- public
abstract void fillOval(int x, int y, int width, int height);
un oval (cerc) plin;
- public
abstract void drawPolygon(int xPoints[], int yPoints[], int nPoints);
deseneaza un poligon cu nPoints
colturi definite de vectorii xPoints
si yPoints;
- public
abstract void fillPolygon(int xPoints[], int yPoints[], int nPoints);
un poligon plin.
Pentru alte functii definite in clasa Graphics,
cititi fisierul Graphics.java
(din directorul java\awt\).
Putem schimba culoarea curenta
cu ajutorul functiei definita tot in clasa Graphics
astfel:
public abstract void setColor(Color c);
Pentru aceasta trebuie sa cunoastem mai intai clasa
Color,
care face parte tot din pachetul java.awt.
Clasa Color
defineste constante corespunzatoare culorilor uzuale: white,
lightGray, gray, darkGray, black, red, pink, orange, yellow, green, magenta,
cyan si
blue. Astfel, de exemplu, pentru a seta
culoarea curenta pe rosu vom scrie linia g.setColor(Color.red),
unde g
este un obiect de tipul Graphics.
Putem seta culoarea curenta pe o culoare care nu a fost definita ca o constanta
apeland unul dintre constructori (vezi fisierul Color.java),
ca exemplu: Color c = new Color(123,200,255).
Culoarea de background a apletului se seteaza cu
ajutorul functiei setBackground(Color
c), mostenita de clasa Applet.
Acesta linie trebuie scrisa in corpul metodei init()
pentru ca apletul trebuie sa stie inca de la initializare care este culoarea
de background (nu poate fi schimbata dupa aceea);
Acum avem destule cunostinte pentru a putea desena cu orice culoare obiecte grafice pe ecran. Iata un exemplu! Aici puteti vedea apletul ruland.
import java.awt.*;
import java.applet.Applet;
public class Desene extends Applet {
private String mesaj;
public void init() {
mesaj = getParameter("titlu");
if(mesaj==null) mesaj="Uite
ce-am invatat sa desenez in Java! :)) :";
setBackground(Color.cyan);
}
public void paint(Graphics
g) {
g.setColor(Color.black);
g.drawString(mesaj,10,15);
g.setColor(Color.blue);
g.drawLine(10,50,30,100);
g.drawRect(50,50,50,50);
g.setColor(Color.red);
g.fillRoundRect(120,50,50,50,20,20);
g.setColor(Color.magenta);
g.fill3DRect(190,50,50,50,true);
g.setColor(Color.pink);
int xpoli[]={250,300,320,380,320,250,250};
int ypoli[]={50,50,80,80,120,100,50};
g.fillPolygon(xpoli,ypoli,7);
Color c = new Color(100,20,200);
g.setColor(c);
g.drawOval(400,50,50,50);
}
}