Sunteți pe pagina 1din 20

149

Reutilizarea claselor
Noiunile de programarea obiectual n Java prezentate ne-au
condus la realizarea ctorva clase care permit generarea unor obiecte care
ar trebui desenate. Din pcate cunotinele legate de desenare nu au fost
prezentate, deci proiectul Figuri nu poate fi finalizat.

Situaia aceasta

apare frecvent n programarea obiectual, programatorii realiznd aplicaii


complexe fr a cunoate n detaliu tehnologia informatic ncorporat n
unele dintre clasele pe care le utilizeaz.
n continuare va fi reluat proiectul privind realizarea unor figuri
geometrice plane dar de data asta se va prelua o colecie de clase de la o
aplicaie deja realizat.

Odat cu instalarea aplicaiei BlueJ s-a creat

subdirectorul examples care conine cteva exemple de aplicaii. Pentru


realizarea proiectului Figuri n noua variant se va verifica dac n
directorul examples exist subdirectorul Figuri i n cazul n care acesta
exist, va fi suprimat.
Apoi se va creea un nou proiect (File / New Project) denumit tot
figuri.

150
n noul proiect vor fi importate clasele din proiectul shapes
dezvoltate de autorii mediului de programare BlueJ:

Rezultat:

151
Dup recompilarea clasei haurate (Triangle) se pot analiza clasele
importate. Practic fiecare clas are un singur constructor, fr parametri,
deci uor de folosit. Se poate deci crea imediat un ptrat:

Pentru a vedea ce alte metode conine clasa Square se va selecta


cu butonul drept obiectul realizat. Din lista de funcii afiat interesant
este makeVisible().

Apelul ei determin afiarea unei noi ferestre

Windows care va conine un ptrat. Deci se poate desena fr a ti exact


cum se petrec lucrurile.

152

Dar interfaa expus de clasa Square conine i alte metode.


Numele lor sunt fiind sugestive nu vor fi prezentate.

Ele permit

repoziionarea, redimensionarea i schimbarea culorii obiectului generat.


Exerciiu: Folosind clasele importate s se realizeze construcia din
figur:

Pentru nceput va fi redimensionat primul obiect.

Latura sa va fi

mrit n primul dnd de aproximativ 3 ori. Pentru a determina mrimea


actual se va selecta n meniul contextual Inspect:

153

Va trebui deci modificat proprietatea size de la 30 la 90. Pentru


aceasta va fi apelat metoda changeSize():

Ptratul va fi apoi deplasat n jos. O soluie este apelul repetat al


metodei moveDown().
Apoi va fi generat un al doilea obiect, triunghiul:

154
Pentru a vedea noul obiect va fi apelat metoda makeVisible():

i noul obiect trebuie redimensionat i deplasat.

Inspectnd

proprietile sale se vede c are latura orizontal de 40 pixeli i nlimea


de 30 pixeli.

Pentru a-l aduce la dimensiunile corecte (L=120, H=80) se


apeleaz metoda changeSize():

155

Dup aceasta se deplaseaz figura astfel nct s se suprapun cu


ptratul.

Pentru aceasta vor fi apelate repetat metodele moveDown(),

slowMoveVertical(), moveRight() i slowMoveHorizontal().


La fel se va proceda i cu cercul. Rezultatul ar putea fi ca i cel din
imagine:

Inspectnd proprietile celor trei obiecte se poate scrie o metod


care ar genera dintr-o dat ntreaga imagine.

Pentru aceasta trebuie

declarat o nou clas, denumit de exemplu Figuri, n al crei constructor


se vor crea cele trei obiecte i apoi se vor apela metodele corespunztoare
pentru a ajunge la aceleai valori ale parametrilor lor de stare. Aa cum
s-a mai afirmat, de cele mai multe ori n programarea actual munca

156
programatorului se reduce la instanierea unor clase i la apelul ctorva
metode care modific valorile unor variabile de stare.

public class Figuri


{
// instance variables - replace the example below with your own
private Square s;
private Triangle t;
private Circle c;
/**
* Constructor for objects of class Figuri
*/
public Figuri()
{
s = new Square();
s.changeSize(90);
s.moveVertical(60);
s.makeVisible();
t = new Triangle();
t.changeSize(80, 120);
t.moveHorizontal(55);
t.moveVertical(15);
t.makeVisible();
c = new Circle();
c.changeSize(50);
c.moveVertical(-40);
c.moveHorizontal(160);
c.changeColor("yellow");
c.makeVisible();
}
}

157
Diagrama UML a aplicaiei n noua form este urmtoarea:

Pentru a reface construcia va trebui s se creeze o instan a


clasei Figuri.

n ceea ce privete varianta privind declararea unor clase derivate


menionat se va da exemplul clasei Patrat derivat din Square:

public class Patrat extends Square


{
/**
* Constructor for objects of class Patrat
*/
public Patrat()
{
// initialise instance variables
super();

158
}
public void translation(int newX, int newY)
{
xPosition = newX;
yPosition = newY;
}
}

Observaie:

Pentru a putea modifica n clasa derivat valorile

parametrilor xPosition i yPosition, declaraia acestora din clasa de baz


(Square) trebuie modificat astfel nct regimul de acces s fie schimbat
din private n protected.

159

Interfee
Aplicaiile realizate pn n acest moment nu au prezentat
elemente de interactivitate.

Aplicaiile actuale sunt de obicei aplicaii

Windows, deci prezint o interfa grafic pe care utilizatorul o poate folosi


pentru a trimite aplicaiei date i comenzi.
Realizarea

unei

astfel

de

aplicaii

va

necesita

aprofundarea

cunotinelor de programare obiectual cel puin din dou perspective:


a.

Realizarea elementelor de interfa necesit utilizarea


claselor dedicate acestui scop, disponibile n Java;

b.

Definirea unor clase interioare clasei principale care


trateaz evenimentele produse de aciunile utilizatorului.

Exemplu fundamental:
realizeaz

conversia

Se propune realizarea unei aplicaii care

temperaturilor

exprimate

grade

Celsius

exhivalentele lor, exprimate n grade Fahrenheit. Relaia de calcul este:


TF = (9/5) * TC + 32.

naintea nceperii realizrii aplicaiei se impun cteva precizri:


a. Clasele disponibile n Java sunt grupate n pachete (engl.
packages).

Un astfel de pachet conine clase nrudite prin

funciile furnizate.

Pentru a folosi clasele existente n Java

trebuie s cunoatem i pachetul n care acestea sunt coninute.


Pachetele formeaz o structur arborescent.

La precizarea

pachetelor care conin clasele folosite se poate folosi caracterul


generic *, o expresie pachet1.* nsemnnd toate pachetele care
au ca rdcin pachet1. Un pachet este inclus n fiierul curent
printr-o instruciune import. Exemplu:

160
import javax.swing.*;
b. Pentru realizarea aplicaiilor Windows limbajul Java pune la
dispoziia programatorilor un set complet de clase.

n aplicaia

care va fi scris vor fi folosite clasele JFrame (pentru fereastra


aplicaiei), JLabel (pentru irurile de caractere care indic natura
informaiilor dein casetele de text), JTextField pentru casetele de
text n care se vor nregistra valorile i JButton pentru a realiza
un buton asupra cruia se acioneaz cu mouse-ul pentru a
declana calculul.

Toate aceste clase sunt incluse n pachetul

javax.swing.
c. O clas creat pentru a realiza o aplicaie Windows trebuie s
creeze

un

obiect

din

clasa

JFrame

apoi

proprietile (dimensiune, aspect, coninut etc).

s-i

modifice

De cele mai

multe ori programatorii prefer s declare clasa aplicaiei ca fiind


derivat din JFrame. n acest caz pentru a ne referi la obiectul
aplicaie creat se folosete cuvntul rezervat this. Astfel pentru a
apela o metod oarecare a clasei motenit de la JFrame se va
scrie this.metoda() ca n exemplul:
this.setTitle("Convertor temperaturi");

d. Acionarea unui buton trebuie s declaneze executarea unei


funcii.

n Java pentru fiecare tip de control sau interaciune

(mouse, tastatur) exist un set de metode predefinite grupate n


structuri de cod similare claselor.

O astfel de structur se

numete interfa (eng. interface).

n program controalelor

Windows care servesc interaciunii cu aplicaia li se asociaz un


obiect

aparinnd

unei

clase

care

implementeaz

interfaa

corespunztoare. n cazul unui JButton, cazul aplicaiei care va fi


scrise, obiectul asociat butonului trebuie s aparin unei clase
care

implementeaz

interfaa

ActionListener.

din

pachetul

java.awt.event.*. Clasa acestui obiect va fi declarat scriind:

161
class numeClasa implements ActionListener { ... }
e. Clasa care implementeaz interfaa ActionListener este de regul

declarat n interiorul clasei principale.

n acest caz, funciile

clasei pot accesa variabilele clasei principale (exterioare).

Realizarea proiectului se va face ca i n cazurile deja prezentate.


Se va crea un proiect nou, numit Convert, se va aduga proiectului o clas
nou denumit tot Convert, coninutul acesteia fiind cel prezentat n
continuare.

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
// Clasa principal
public class Convert extends JFrame
{
// Variabilele clasei
private JTextField cels;
private JTextField fahr;

162
private JButton conv;
// Constructorul clasei Convert
public Convert()
{
JPanel content = new JPanel();
cels = new JTextField(10);
fahr = new JTextField(10);
conv = new JButton("Converteste");
conv.addActionListener(new SupravegheazaBtn());
content.setLayout(new FlowLayout());
content.add(new JLabel("Temperatura, [C]:"));
content.add(cels);
content.add(conv);
content.add(new JLabel("Temperatura, [F]:"));
content.add(fahr);
// Se impun caracteristicile ferestrei Windows
this.setTitle("Convertor temperaturi");
this.setContentPane(content);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// Clasa interioar
class SupravegheazaBtn implements ActionListener {
public void actionPerformed(ActionEvent e) {
String tempCels = cels.getText();
double tempCNr = Double.parseDouble(tempCels);
// Convertesc in [F].
double tempFNr = (9./5.)*tempCNr+32.;
//Convertesc in String si afisez
fahr.setText(Double.toString(tempFNr));
}
}
}

Observaie:

aplicaiile

Windows prelucrrile

de date se

realizeaz de regul n funciile asociate diferitelor evenimente.


Pentru preluarea valorii dintr-un control JTextBox s-a folosit
metoda getText() iar pentru impunerea unei valori s-a folosit setText().

163
Valoarea coninut ntr-un control JTextBox este de tip String.
Pentru a o putea folosi la calcule ea trebuie convertit ntr-un tip numeric,
de regul int sau double.
Exemple:
int nrInt;
double unDouble;
String aString;
...
nrInt = Integer.parseInt(unString);
unString = Integer.toString(aInt);
unDouble = Double.parseDouble(unString);
unString = Double.toString(unDouble);

Not:

Java admite i clase interioare anonime.

Folosind n locul

clasei interioare o astfel de clas, clasa Convert poate fi redefinit astfel:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Convert extends JFrame
{
// instance variables - replace the example below with your own
private JTextField cels;
private JTextField fahr;
private JButton conv;
/**
* Constructor for objects of class Convert
*/
public Convert()
{
JPanel content = new JPanel();
cels = new JTextField(10);
fahr = new JTextField(10);
conv = new JButton("Converteste");
conv.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String tempCels = cels.getText();
double tempCNr = Double.parseDouble(tempCels);
// Convertesc in [F].
double tempFNr = (9./5.)*tempCNr+32.;

164
//Convertesc in String si afisez
fahr.setText(Double.toString(tempFNr));
}
}
);
content.setLayout(new FlowLayout());
content.add(new JLabel("Temperatura, [C]:"));
content.add(cels);
content.add(conv);
content.add(new JLabel("Temperatura, [F]:"));
content.add(fahr);
// Se impun caracteristicile ferestrei Windows
this.setTitle("Convertor temperaturi");
this.setContentPane(content);
this.pack();
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Expresia
fiind

new ActionListener() { ... } nu trebuie interpretat ca

secven

care

creeaz

un

obiect

(ActionListener este o interfa nu o clas!).


aparinnd

unei

clase

anonime

care

de

tip

ActionListener

Ea creeaz un obiect

implementeaz

interfaa

ActionListener.

Metode statice
Aplicaia Convert are n mare caracteristicile unei aplicaii Windows
obinuite, cu excepia uneia: nu poate fi lansat n execuie dect din
BlueJ. Pe de alt parte, pentru a vedea pe ecran interfaa Windows creat
am apelat n mod explicit constructorul clasei, deci practic nu am lansat
nimic n execuie. Nu am fcut altceva dect s crem o instan a clasei
Convert.
Pentru a deveni o aplicaie executabil, o clas trebuie s conin o
metod suplimentar purtnd numele main().
execuie, acestei metode i se d controlul.

n momentul lansrii n

Ea este foarte simpl, nu

trebuie s conin dect apelul constructorului clasei Convert pentru a

165
crea o instan a clasei. Practic ea realizeaz acelai lucru care se realiza
n mediul BlueJ.
public static void main(String [] args)
{
Convert cnv = new Convert();
}
Metoda main() este declarat folosind declaraia static. O metod
declarat astfel poate fi lansat n execuie fr a fi necesar crearea n
prealabil a unui obiect din respectiva clas. Apelul unei metode statice se
realizeaz scriind nume_clas.metod(). Exemple:
val = a * Math.sin(om * t);
Funcia sin() este o metod static a clasei Math i a fost apelat
fr a crea n prealabil un obiect din clasa Math ci s-a folosit numele
clasei.

Neavnd un obiect asupra variabilelor cruia s acioneze,

metodele statice ale unei clase pot opera numai asupra valorilor trimise ca
argument, ca n cadrul funciei sin().
Metoda main() adugat trebuie s fie i ea static deoarece nu
poate fi vorba de crearea n prealabil a vreunui obiect. O aplicaie Java
poate fi compus din mai multe clase dar numai una poate conine
metoda main(), devenind astfel clas principal. De obicei numele clasei
principale coincide cu numele proiectului, ca n exemplul dat.
Odat adugat metoda main(), la selactarea cu butonul drept al
mouse-ului a clasei Convert metoda main() apare ca apelabil, ceea ce
este normal, main() fiind o metod static. Apelul ei realizeaz crearea
obiectului cnv din clasa Convert i implicit, afiarea ferestrei Windows
create n constructor.

166

n Java o aplicaie executabil se prezint sub forma unei arhive


.jar care conine clasele proiectului.

n BlueJ pentru a transforma

proiectul realizat ntr-o aplicaie executabil se va selecta Project / Create


Jar File.

n fereastra afiat se va selecta clasa principal:

167

Pentru a lansa n execuie aplicaia realizat se va porni Windows


Explorer i se va selecta cu butonul drept al mouse-ului fiierul .jar
realizat iar din meniul contextual afiat se va selecta Java Platform SE
binary (procesorul virtual Java):

Dac acest mod de lansare n execuie pare prea complicat, o


soluie este realizarea unui fiier .bat care s conin comanda de lansare
n execuie a procesorului virtual java:

168

Folosind acest fiier, aplicaia va putea fi lansat n execuie


selectnd cu un dublu clic din Windows Explorer fiierul Convert.bat.

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