Introducere in Java
Introducere in Java
Cod sursa Java -> (compilare) -> Cod de octeti -> (interpretare)
Toate aplicatiile Java contin o clasa principala(primara) în care trebuie sa se gaseasca metoda
main. Clasele aplicatiei se pot gasi fie într-un singur fisier, fie în mai multe.
Salvarea fisierelor sursa se va face în fisiere cu extensia .java. Fiserul care contine codul sursa
al clasei primare trebuie sa aiba acelasi nume cu clasa primara a aplicatiei (clasa care contine metoda
main)
Obs: Java face distinctie între literele mari si mici.
Pentru rularea aplicatiei se va folosi interpretorul java, apelat pentru unitatea de compilare
corespunzatoare clasei principale, fiind însa omisa extensia .class asociata acesteia.
java NumeProgr
Java Developer Kit (JDK) este însoţit de documentaţie pentru toate bibliotecile de clase Java,
documentaţie care conţine descrierea tuturor variabilelor de instanţă, a metodelor, constructorilor,
interfeţelor şi aşa mai departe. Studierea bibliotecilor de clase Java, a metodelor şi variabilelor de instanţă,
este o metodă foarte bună de a cunoaşte posibilităţile Java, precum şi un bun punct de plecare pentru
creaţiile proprii.
Iată pachetele de clase care fac parte din bibliotecile de clase Java:
• java.lang: Clase care se aplică limbajului însuşi, şi include clasa Object, clasa String şi clasa
System. Tot aici se află şi clasele speciale pentru tipurile primitive de date (Integer, Character, Float
etc.).
• java.util: Clase utilitare, cum ar fi Date, împreună cu colecţii simple de clase, cum ar fi Vector şi
Hashtable.
• java.io: Clase pentru operaţiile de intrare/ieşire pentru scrierea şi citirea fluxurilor (cum ar fi
intrarea şi ieşirea standard) şi pentru tratarea fişierelor.
• java.net: Clase pentru lucrul în reţea, inclusiv Socket şi URL (o clasă pentru reprezentarea
referinţelor spre documente din World Wide Web).
• java.awt: (Abstract Window Toolkit): clase care implementează o interfaţă grafică cu utilizatorul,
inclusiv clase pentru Window, Menu, Button, Font, CheckBox, etc. Tot acest pachet include clase
pentru prelucrarea imaginilor (pachetul java.awt.Image).
• java.applet: Clase pentru implementarea applet-urilor Java, inclusiv clasa Applet.
PROGRAM 1
class LinieComanda
{
public static void main(String[] args)
{
/*System.out.println("Urmeaza cele "+args.length+" elemente date in linia de comanda");
for (int i=0;i<args.length;i++)
System.out.println(args[i]);*/
System.out.print("Bine ai venit in universul Java ");
for (int i=0;i<args.length;i++)
System.out.print(args[i]+" ");
}
}
PROGRAM 2
// Pachete folosite
//import java.io.*;
// Sf Pachete folosite
int i,j;
// Sf Declaratii de variabile
PROGRAM3
class Matrice
{
private final int SIZE=5;
private int[][] a;
public Matrice()
{
a=new int[SIZE][SIZE];
for (int i=0;i<SIZE;i++)
for (int j=0;j<SIZE;j++)
{
int aux=(int)(java.lang.Math.random()*10);
a[i][j]=aux;
}
}
}
PROGRAM 4
import java.util.*;
class Oclasa
{
private Vector vector;
private char[] sir={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','z','y'};
public Oclasa()
{
vector=new Vector();
umple();
afiseaza();
}
//-------------------------------------------------------------
class Clasa
{
// Date-membru = Atribute
private char a;
// Sf Date-Membru
// Constructori
public Clasa(char a)
{
this.a=a;
}
// Sf Constructori
// Metode
public char getVal()
{
return a;
}
// Sf Metode
}
Laborator 2
Appleturi
Un applet reprezintă un program Java ce gestionează o suprafaţă de afişare container) ce poate fi
inclusă într-o pagină Web.
Pachete necesare a fi importate: java.applet
Clasa principală extinde Applet
Un applet nu poate fi executat independent. El este executat de către browser-ul în care a fost
încărcată pagina Web ce conţine appletul sau de către programe specializate cum ar fi appletviewer un
utilitar inclus în distribuţia J2SDK.
Exemple de browsere
• Internet Explorer
• Netscape
• Mozilla
• Opera
import java.awt.* ;
import java.applet.* ;
public class FirstApplet extends Applet {
Image img;
public void init() {
img = getImage(getCodeBase(), "taz.gif");
}
public void paint (Graphics g) {
g.drawImage(img, 0, 0, this);
g.drawOval(100,0,150,50);
g.drawString("Hello!", 110, 25);
g.fillOval(100,0,150,50);
}
}
Vizualizarea appletului se face prin comanda appletviewer nume.html sau folosind un browser.
Ciclul de viaţă
• Incărcarea în memorie - este instanţiată clasa principală
• Iniţializarea - este apelată metoda init
• Pornirea - este apelată metoda start
• Execuţia propriu-zisă
• Oprirea temporară - este apelată metoda
• Oprirea definitivă - este apelată metoda destroy
Tag-ul APPLET atunci când se vor defini parametrii vor arăta ceva de genul:
<APPLET
CODE = clasaApplet
WIDTH = latimeInPixeli
HEIGHT = inaltimeInPixeli
[ARCHIVE = arhiva.jar]
[CODEBASE = URLApplet]
[ALT = textAlternativ]
[NAME = numeInstantaApplet]
[ALIGN = aliniere]
[VSPACE = spatiuVertical]
[HSPACE = spatiuOrizontal] >
[< PARAM NAME = parametru1 VALUE = valoare1 >]
[< PARAM NAME = parametru2 VALUE = valoare2 >]
...
[text HTML alternativ]
</APPLET>
Arhivarea appleturilor reprezintă cea mai eficientă modalitate de a distribui un applet. Arhivarea
fişierelor se face folosind comanda
jar cvf arhiva.jar ClasaPrincipala.class AltaClasa.class imagine.jpg sunet.au
sau
jar cvf arhiva.jar *.class *.jpg *.au
Includerea unui applet arhivat într-o pagină Web se va face puţin diferit şi anume:
import java.awt.*;
import java.applet.*;
Pot fi acreate appleturi care sunt rulează şi ca aplicaţii. Acest lucru se face urmărind paşii:
• Adăugăm metoda main clasei care descrie appletul, în care vom face operaţiunile următoare.
• Creăm o instanţă a appletului şi o adăugăm pe suprafaţa unei ferestre.
• Apelăm metodele init şi start, care ar fi fost apelate automat de către browser.
• Facem fereastra vizibilă.
Declararea obiectului
NumeClasa numeObiect;
Ex: Rectangle patrat;
Instantierea
Se realizeaza prin intermediul operatorului new si are ca efect crearea efectiva a obiectului cu alocarea
spatiului de memorie corespunzator.
patrat = new Rectangle();
Initializarea
Se realizeaza prin intermediul constructorilor clasei respective. Rectangle() este un apel catre constructorul
clasei Rectangle care este responsabil cu initializarea obiectului. Initializarea se poate face si cu anumiti
parametri, cu conditia sa existe un constructor al clasei respective care sa accepte parametrii respectivi;
patrat = new Rectangle(0, 0, 100, 200);
Fiecare clasa are un set de constructori care se ocupa cu initializare obiectelor nou create. De exemplu clasa
Dreptunghi poate avea urmatorii constructori:
public Rectangle(int w, int h)
public Rectangle(int x1, int y1, int x2, int y2)
Distrugerea obiectelor: nu mai este responsabilitatea programatorului. În momentul rularii unui program,
simultan cu interpretorul Java ruleaza si un proces care se ocupa cu distrugerea obiectelor care nu mai sunt
folosite. Acest proces este pus la dispozitie de platforma Java de lucru şi se numeste garbage collector
Declararea claselor
[public][abstract][final] class NumeClasa
[extends NumeSuperclasa]
[implements Interfata1 [, Interfata2 ... ]]
{
//corpul clasei
}
Se observa ca, spre deosebire de C++, Java permite doar mostenirea simpla, asadar o clasa poate avea un
singur un singur parinte (superclasa). Evident o clasa poate avea oricâţi mostenitori (subclase). Extinderea
unei clase se realizeaza deci astfel:
class B extends A {...} //A este superclasa clasei B
Implementarea metodelor
Metodele sunt responsabile cu descrierea comportamentului unui obiect. Generic, o metoda se declara
astfel:
[modificatori] TipReturnat numeMetoda ( [argumente] )
[throws TipExceptie]
{
//corpul metodei
}
! Şi pentru variabile şi pentru metode modificatorii pot fi : public, private, protected, final, static
Listing 1 Listing 2
Listing 3 Listing 4
Listing 5 Listing 6
import java.io.*; class ClientPatrat
class Patrat extends Dreptunghi {
{ public static void main(String[]arg)
public Patrat (Punct p, int latura) {
{ Punct p1 =new Punct(3,4);
stg_sus=new Punct(p.getX(),p.getY()); Patrat d1 =new Patrat(p1,2);
dr_jos=new Punct(p.getX()+latura,p.getY() Patrat d2 =new Patrat();
+latura); Patrat d3 =new Patrat(4,3,5);
}
System.out.println(d1.arie()+"
public Patrat(int a, int b, int latura) "+d1.diagonala()+" "+d1.height()+" "+d1.width());
{ super(a, b, a+latura, b+latura); } System.out.println(d2.arie()+"
"+d2.diagonala()+" "+d2.height()+" "+d2.width());
public Patrat() System.out.println(d3.arie()+"
{ "+d3.diagonala()+" "+d3.height()+" "+d3.width());
super(); }
// este bun doar pentru ca Dreptunghi() genereaza un }
patrat
}
// mosteneste toate metodele si variabilele publicsi
protected din Dreptunghi
}
Laborator 4
INTERFETE
interface Exemplu
{
int MAX = 100; // echivalent cu: public static final int MAX = 100;
int MAX; // Incorect, lipseste initializarea
private int x = 1; // Incorect, modificator nepermis
void metoda(); // Echivalent cu: public void metoda();
protected void metoda2(); // Incorect, modificator nepermis
}
Implementarea unei interfeţe: class NumeClasa implements Interfata1, Interfata2, ...
O clasă care implementează o interfaţă trebuie obligatoriu să specifice cod pentru toate metodele
interfeţei. Implementarea unei interfeţe poate să fie şi o clasă abstractă. Spunem că un obiect are tipul X,
unde X este o interfaţă, dacă acesta este o instanţă a unei clase ce implementează interfaţa X.
interface I2 interface I2
{ {
int b=2; int x=2;
void metoda2(); void metoda(); //corect
} //int metoda(); //incorect
}
class C implements I1, I2
{ class C implements I1, I2
void metoda1() {...} {
void metoda2() {...} public void metoda()
} {
System.out.println(I1.x); //corect
System.out.println(I2.x); //corect
System.out.println(x); //ambiguitate
}
}
Utilitatea interfeţelor
• Definirea unor similaritati între clase independente.
• Impunerea unor specificaţii
• Definirea unor grupuri de constante
• Transmiterea metodelor ca parametri
EXCEPTII
O exceptie este un eveniment „exceptional” ce se produce în timpul executiei unui program si care
provoaca întreruperea cursului normal al executiei
Exceptiile pot aparea din diverse cauze si pot avea nivele diferite de gravitate, iar in momentul când o
asemenea eroare se produce în timpul executiei sistemul genereaza automat un obiect de tip exceptie ce
contine:
• informatii despre exceptia respectiva
• starea programului în momentul producerii acelei exceptii
public class Exceptii {
public static void main(String args [] ) {
int v[] = new int[10];
v[10] = 0; //exceptie, vectorul are elementele v[0]...v[9]
System.out.println("Aici nu se mai ajunge...");
}
}
La rularea programului va fi generata o exceptie si se va afisa mesajul :
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException :10
at Exceptii.main (Exceptii.java:4)
Crearea unui obiect de tip exceptie se numeste aruncarea unei exceptii ("throwing an exception"). In
momentul în care o metoda genereaza o exceptie (arunca o exceptie) sistemul de executie este responsabil
cu gasirea unei secvente de cod dintr-o metoda care sa trateze acea exceptie. Cautarea se face recursiv,
începând cu metoda care a generat exceptia si mergând înapoi pe linia apelurilor catre acea metoda.
Cu alte cuvinte la aparitia unei erori este "aruncata" o exceptie iar cineva trebuie sa o "prinda" pentru a o
trata. Daca sistemul nu gaseste nici un analizor pentru o anumita exceptie atunci programul Java se opreste
cu un mesaj de eroare (în cazul exemplului de mai sus mesajul "Aici nu se mai ajunge..." nu va fi tiparit).
Atentie: In Java tratarea erorilor nu mai este o optiune ci o constrângere. Orice cod care poate provoca
exceptii trebui sa specfice modalitatea de tratare a acestora.
Tratarea exceptiilor se realizeaza prin intermediul blocurilor de instructiuni try, catch si
finally. O secventa de cod care trateaza anumite exceptii trebuie sa
arate astfel:
try {
Instructiuni care pot genera o exceptie
}
catch (TipExceptie1 ) {
Prelucrarea exceptiei de tipul 1
}
catch (TipExceptie2 ) {
Prelucrarea exceptiei de tipul 2
}
...
finally {
Cod care se executa indiferent daca apar sau nu exceptii
}
Java permite unei metode sa arunce exceptiile aparute în cadrul ei la un nivel superior, adica functiilor care
o apeleaza sau sistemului. Cu alte cuvinte o metoda poate sa nu îsi asume responsabilitatea tratarii
exceptiilor aparute în cadrul ei. Acet lucru se realizeaza prin specificarea în
declaratia metodei a clauzei throws:
metoda throws TipExceptie1, TipExceptie2, ... {
...
}
Atentie! O metoda care nu trateaza o anumita exceptie trebuie obligatoriu sa o ”arunce”.
Listing 4
public class Exceptii
{
int v[];
public Exceptii()
{
v = new int[10];
metoda();
}
Fluxuri pe caractere:
Fluxuri de octeti:
Atentie: Pentru majoritatea programelor scrierea si citirea datelor se vor face prin intermediul
fluxurilor de caractere deoarece acestea permit manipularea caracterelor Unicode (16-biti), în timp ce
fluxurile de octeti permit doar lucrul pe 8 biti - caractere ASCII.
Fluxuri primitive
• Fisier FileReader, FileWriter,
FileInputStream, FileOutputStream
• Memorie CharArrayReader, CharArrayWriter,
ByteArrayInputStream, ByteArrayOutputStream,
StringReader, StringWriter
• Pipe PipedReader, PipedWriter,
PipedInputStream, PipedOutputStream
Fluxuri de procesare
• ”Buferizare” BufferedReader, BufferedWriter
BufferedInputStream, BufferedOutputStream
• Conversie octeti-caractere InputStreamReader, OutputStreamWriter
• Concatenare SequenceInputStream
• Serializare ObjectInputStream, ObjectOutputStream
• Conversie tipuri de date DataInputStream, DataOutputStream
• Numarare LineNumberReader, LineNumberInputStream
• Citire in avans PushbackReader, PushbackInputStream
• Afisare PrintWriter, PrintStream
Citirea atomilor din flux se face cu metoda nextToken(), care returneza tipul atomului lexical citit
si scrie în variabilele nval sau sval valoarea corespunzatoare atomului.
Exemplul tipic de folosire a unui analizor lexical este citirea unei secvente de numere si siruri
aflate într-un fisier sau primite de la tastatura:
//Citirea unei secvente de numere si siruri
import java.io.*;
public class TestTokenizer {
public static void main(String args[]) throws IOException{
FileInputStream fis = new FileInputStream("test.dat");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
Atentie: Iorice flux s-ar folosi el trebuie inchi la sfarsit, aceasta inchidere facandu-se folosind metoda:
close.
Aplicatii
import java.io.*;
class CopyTextRedirectari {
public static void main(String[] a) {
if (a.length != 3) {
System.err.println("Apel \"CopyTextRedirectari intrare iesire erori\"");
System.exit(1);
}//if
try {
BufferedInputStream in = new BufferedInputStream(new FileInputStream(a[0]));
PrintStream out = new PrintStream(new BufferedOutputStream(new FileOutputStream(a[1])));
PrintStream err = new PrintStream(new BufferedOutputStream(new FileOutputStream(a[2])));
System.setIn(in);
System.setOut(out);
System.setErr(err);
BufferedReader brin = new BufferedReader(new InputStreamReader(System.in));
String s;
for (;;) {
s = brin.readLine();
if (s==null)
break;
System.out.println(s);
}//for
System.out.println("Terminare normala redirectare out");
System.err.println("Terminare normala redirectare err");
brin.close();
in.close();
out.close();
err.close();
}//try
catch(IOException e) {
System.err.println("Eroare IO probabil dupa redirectari");
e.printStackTrace();
}//catch
}//CopyTextRedirectari.main
} //CopyTextRedirectari
import java.io.*;
public class IODemo {
public static void main(String[] args) {
try {
// 1. Citirea din intrare, linie cu linie,
BufferedReader in1 = new BufferedReader(new FileReader("Intrare.txt"));
String s, t = new String();
while((s = in1.readLine())!= null)
t += s + System.getProperty("line.separator");
in1.close();
!!! Mai multe informatii despre metodele claselor care apar de-a lungul acestui laborator gasiti in help.
Laborator 6
Interfata grafica (GUI), se refera la toate tipurile de comunicare vizuala între un program si
utilizatorii sai. Aceasta este o particularizare a interfetei cu utilizatorul (UI), prin care vom întelege
conceptul generic de interactiune între un program si utilizatorii sai. Asadar, UI se refera nu numai la ceea
ce utilizatorul vede pe ecran ci la toate mecanismele de comunicare între acesta si program.
Biblioteca de clase care ofera servicii grafice se numeste java.awt, AWT fiind prescurtarea de la
Abstract Window Toolkit.
Crearea unei aplicatii grafice presupune urmatoarele lucruri:
• crearea unei suprafete de afisare (cum ar fi o fereastra) pe care vor fi asezate obiectele grafice care
servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc);
• crearea si asezarea obiectelor grafice pe suprafata de afisare în pozitiile corespunzatoare;
• definirea unor actiuni care trebuie sa se execute în momentul când utilizatorul interactioneaza cu
obiectele grafice ale aplicatiei;
• "Ascultarea" evenimentelor generate de obiecte în momentul interactiunii cu utilizatorul si
executarea actiunilor corespunzatoare asa cum au fost ele definite.
Majoritatea obiectelor grafice sunt subclase ale clasei Component, clasa care defineste generic o
componenta grafica care poate interactiona cu utilizatorul. Singura exceptie o constituie meniurile care
descind din clasa MenuComponent.
Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc. In general, toate
componentele sunt definte de clase proprii ce se gasesc în pachetul java.awt, clasa Component fiind
superclasa abstracta a tuturor acestor clase.
Crearea obiectelor grafice nu realizeaza automat si afisarea lor pe ecran. Mai întâi ele trebuie
asezate pe o suprafata de afisare, care poate fi o fereastra sau suprafata unui applet, si vor deveni vizibile în
momentul în care suprafata pe care sunt afisate va fi vizibila. O astfel de suprafata pe care se aseaza
obiectele grafice reprezinta o instanta a unei clase obtinuta prin extensia clasei Container; din acest motiv
suprafetele de afisare vor mai fi numite si containere. Clasa Container este o subclasa aparte a clasei
Component, fiind la rândul ei superclasa tuturor suprafetelor de afisare Java (ferestre, applet-uri, etc). Iată
are unt principalele suprafete de afisare (cele derivate din Container):
// creez o eticheta
Label eticheta = new Label("Eticheta");
eticheta.setBackground(Color.blue);
f.add(eticheta);
// creez un buton
Button buton = new Button("OK");
f.add(buton);
// creez un textfield
TextField parola = new TextField("", 10);
// parola.setEchoChar('*');
f.add(parola);
// creez un textarea
TextArea textarea = new TextArea("Ceva",20,10,TextArea.SCROLLBARS_NONE);
f.add(textarea);
// creez un checkbox
Checkbox cbx = new Checkbox("Bifeaza");
f.add(cbx);
// creez un choice
Choice alege = new Choice();
alege.add("alege1");
alege.add("alege2");
alege.add("alege3");
alege.select("alege3");
f.add(alege);
// creez o lista
List alegere = new List();
alegere.add("alege1");
alegere.add("alege2");
alegere.add("alege3");
alegere.add("alege4");
alegere.add("alege5");
f.add(alegere);
Gestionari de pozitie = intefeţe implementate de către container-ul folosit care contin metode de
aranjare a obiectelor pe interfaţa grafică.
Atasarea explicita a unui gestionar de pozitionare la un container se face cu metoda setLayout a
clasei Container. Secventa de atasare a unui gestionar pentru un container este:
container.setLayout(gestionar);
În cazul cβnd avem nevoie de obiectul gestionar îl putem obtine cu metoda getLayout din clasa
Container.
Una din facilitatile cele mai utile oferite de gestionarii de pozitionare este rearanjarea
componentele unui container atunci cβnd acesta este redimesionat. Sunt însa situatii când dorim sa plasam
componentele la anumite pozitii fixe iar acestea sa ramâna acolo chiar daca redimensionam containerul.
Acest lucru se poate realizza doar prin trimiterea argumentului null metodei setLayout:
container.setLayout(null);
Folosind pozitionarea absoluta, nu va mai fi suficient sa adaugam cu metoda add componentele în container
ci va trebui sa specificam pozitia si dimensiunea lor - acest lucru era facut automat de gestionarul de
pozitionare.
container.setLayout( null );
Button b = new Button("Buton");
b.setSize(10, 10); // era facut automat de gestionar
b.setLocation (0, 0); // // era facut automat de gestionar
b.add();
1. FlowLayout
2. BorderLayout
public class TestBorderLayout {
public static void main(String args[]) {
Frame f = new Frame("Border Layout");
f.setLayout(new BorderLayout());//poate sa
lipseasca
f.add(new Button("Nord"),
BorderLayout.NORTH);
f.add(new Button("Sud"),
BorderLayout.SOUTH);
f.add(new Button("Est"), BorderLayout.EAST);
f.add(new Button("Vest"),
BorderLayout.WEST);
f.add(new Button("Centru"),
BorderLayout.CENTER);
f.pack();
f.setVisible(true);
}
}
3. GridLayout
import java.awt.*;
public class TestGridLayout {
public static void main(String args[]) {
Frame f = new Frame("Grid
Layout");
f.setLayout(new GridLayout(3, 2));
f.add(new Button("1"));
f.add(new Button("2"));
f.add(new Button("3"));
f.add(new Button("4"));
f.add(new Button("5"));
f.add(new Button("6"));
f.pack();
f.setVisible();
}
}
3. CardLayout
Gestionarul CardLayout va avea componentele aşezate pe suprafata una peste altaastfel încât la un
moment dat numai o singura componenta este vizibila ("cea de deasupra").
Clasa dispune de metode prin care sa poata fi afisata o anumita componenta din pachet, sau sa se
poata parcurge secvential pachetul, ordinea în care componentele se gasesc în pachet fiind interna
gestionarului.
Acest gestionar este util pentru implementarea unor cutii de dialog de tip tab, pentru o gestionare mai
eficienta a spatiului.
4. GridBagLayout
Asemănător gestionarului GridLayout, diferenţa constând în faptul că numarul de linii si de
coloane a tabelelui sunt determinate automat, în functie de componentele amplasate pe suprafata de afisare.
Pentru a specifica modul de afisare a unei componente, acesteia îi este asociat un obiect de tip
GridBagConstraints (constrângeri cu privire la felul cum va fi plasata componenta respectiva), în care se
specifica diferite proprietati ale componentei referitoare la regiunea sa de afisare si la modul în care va fi
plasata în aceasta regiune. Legatura dintre o componenta si un obiect GridBagConstraints se realizeaza prin
metode setConstraints:
GridBagLayout gridBag = new GridBagLayout();
container.setLayout(gridBag);
GridBagConstraints c = new GridBagConstraints();
...
//se specifica proprietatile referitoare la afisarea unei componente
gridBag.setConstraints(componenta, c);
container.add(componenta);
import java.awt.*;
public class TestPanel {
public static void main(String args[]) {
Frame f = new Frame("Panel");
f.add(panel, BorderLayout.NORTH);
f.add(new Button("OK"), BorderLayout.EAST);
f.add(new Button("Cancel"), BorderLayout.WEST);
f.pack();
f.show();
}
}
import java.awt.*;
import java.awt.event.*;
import java.io.*;
add(fisier, BorderLayout.NORTH);
add(text, BorderLayout.CENTER);
add(save, BorderLayout.SOUTH);
save.addActionListener(this);
pack();
setSize(300, 200);
}
//metoda interfetei ActionListener
public void actionPerformed(ActionEvent e) {
String continut = text.getText();
try {
eticheta.setText("Fisier.txt");
PrintStream out = new PrintStream(new FileOutputStream(eticheta.getText()));
out.println(continut);
out.close();
text.requestFocus();
eticheta.setText("Salvare reusita");
}
catch(IOException ex) {
ex.printStackTrace();
}
}
}
Asadar, pentru a scrie cod care sa se execute în momentul în care utilizatorul interactioneaza cu o
componenta grafica trebuie sa facem urmatoarele lucruri:
• sa scriem o clasa de tip listener care sa "asculte" evenimentele produse de acea componenta si în
cadrul acestei clase sa implementam metode specifice pentru tratarea lor;
• sa comunicam componentei sursa ca respectiva clasa îi "asculta" evenimentele pe care le
genereaza, cu alte cuvinte sa înregistram acea clasa drept "consumator" al evenimentelor produse
de componenta respectiva.
Evenimentele sunt, ca orice altceva în Java, obiecte. Clasele care descriu aceste obiecte se împart
în mai multe tipuri în functie de componenta care le genereaza, mai precis în functie de actiunea
utilizatorului asupra acesteia. Pentru fiecare tip de eveniment exista o clasa care instantiaza obiecte de acel
tip; de exemplu: evenimentul generat de actionarea unui buton este implementat prin clasa ActionEvent, cel
generat de modificarea unui text prin clasa TextEvent, etc.
Toate aceste clase au ca superclasa comuna clasa AWTEvent. Lista completa a claselor care
descriu evenimente va fi data într-un tabel în care vom specifica si modalitatile de utilizare ale acestora.
O clasa consumatoare de evenimente (listener) poate fi orice clasa care specifica în declaratia sa ca
doreste sa asculte evenimente de un anumit tip. Acest lucru se realizeaza prin implementarea unei interfete
specifice fiecarui tip de eveniment. Astfel, pentru ascultarea evenimentelor de tip ActionEvent clasa
respectiva trebuie sa implementeze interfata ActionListener, pentru TextEvent interfata care trebuie
implementata este TextListener, etc.
Asadar, orice clasa poate asculta evenimnte de orice tip cu conditia sa implementeze interfetele
specifice acelor evenimente.
import java.awt.*;
import java.awt.event.*;
Folosirea adaptorilor
Un adaptor este o clasa abstracta care implementeaza o interfata de tip "listener". Scopul unei
astfel de clase este ca la crearea unui "ascultator" de evenimente, în loc sa implementam o anumita interfata
si implicit toate metodele sale, sa extindem adaptorul corespunzator interfetei respective (daca are!) si sa
supradefinim doar metodele care ne intereseaza (cele în care vrem sa scriem o anumita secventa de cod).
De exemplu, adaptorul interfetei WindowListener este WindowAdapter iar folosirea acestuia este data în
exemplul de mai jos:
import java.awt.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.event.*;
desenare();
pack();
setVisible(true);
}
import java.awt.*;
import java.awt.event.*;
desenare();
}
add(btnExit, BorderLayout.SOUTH);
setSize(300, 200);
setVisible(true);
test.addActionListener(this);
check.addItemListener(this);
btnExit.addActionListener(this); }
//fereastra de dialog
class Avertizare extends Dialog {
String string;
public Avertizare(FerPrinc parinte, String titlu, boolean modala, int k) {
super(parinte, titlu, modala);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
});
if (k==1) {string = new String("S-a apasat butonul 1");}
if (k==2) {string = new String("S-a apasat butonul 2");}
add(mesaj,BorderLayout.NORTH);
add(panou,BorderLayout.SOUTH);
int w=320;
int h=130;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
setSize(w,h);
setLocation(screenSize.width/2 - w/2, screenSize.height/2 - h/2);// se fixeaza
setVisible(true);
}
}
//clasa principala
public class TestDialog {
public static void main(String args[]) {
FerPrinc f = new FerPrinc("Fereastra principala");
f.initializare();
f.setVisible(true);
}
}
Clasa FileDialog
Pachetul java.awt pune la dispozitie si un tip de fereastra de dialog folosita pentru încarcarea /
salvarea fisierelor : clasa FileDialog, subclasa directa a clasei Dialog. Instantele acestei clase au un
comportament comun dialogurilor de acest tip de pe majoritatea platformelor de lucru, dar forma în care
vor fi afisate este specifica platformei pe care ruleaza aplicatia.
Constructorii clasei sunt:
FileDialog(Frame parinte)
FileDialog(Frame parinte, String titlu)
FileDialog(Frame parinte, String titlu, boolean mod)
unde "parinte" reprezina o instanta ferestrei parinte, "titlu" reprezinta titlul ferestrei iar prin argumentul
"mod" specificam daca încarcam sau salvam un fisier; valorile pe care le poate lua acest argument sunt
FileDialog.LOAD (pentru încarcare), respectiv FileDialog.SAVE (pentru salvare).
//dialog pentru incarcarea unui fisier
new FileDialog(mainWin, "Alegere fisier", FileDialog.LOAD);
//dialog pentru salvarea unui fisier
new FileDialog(mainWin, "Salvare fisier", FileDialog.SAVE);
La crearea unui obiect FileDialog acesta nu este implicit vizibil. Daca afisarea sa se face cu show
caseta de dialog va fi modala. Daca afisarea se face cu setVisible(true) va fi nemodala. Dupa selectarea
unui fisier ea va fi facuta automat invizibila.
Pe lânga metodele mostenite de la superclasa Dialog clasa FileDialog mai contine metodele:
Afla/specifica directorul din care se va face selectia fisierului sau
String getDirectory()
în care se va face salvare. Sunt permise si notatii specifice pentru
void setDirectory(String dir)
directorul curent (.), directorul radacina (/), etc.
String getFile() Returneaza numele fisierului selectat. Stabileste numele implicit al
void setFile(String f) fisierului care va aparea în caseta de dialog
Afla/specifica filtrul care se va aplica fisierelor din directorul din
FilenameFilter getFilenameFilter() care se va face selectia fisierului sau în care se va face salvare
void setFilenameFilter(FilenameFilter f) (vezi interfata FilenameFilter" ) Nu functioneaza pe platformele
Windows !
Afla/specifica daca încarcam sau salvam un fisier;
int getMode()
• FileDialog.LOAD (pentru încarcare)
void setMode(int mod)
• FileDialog.SAVE (pentru salvare)
Sa consideram un exemplu în care vom alege, prin intermediul unui obiect FileDialog, un fisier cu
extensia "java". Directorul initial este directorul curent, iar numele implicit este TestFileDialog.java.
Numele fisierului ales va fi afisat la consola.
import java.awt.*;
import java.awt.event.*;
import java.io.*;
//numele implicit
fd.setFile("TestFileDialog.java");
//specificam filtrul
fd.setFilenameFilter(new FilenameFilter() {
public boolean accept(File dir, String numeFis) {
return (numeFis.endsWith(".java"));
}
});
fd.setVisible(true); //facem vizibila fereastra de dialog
Metoda exec primeste ca parametru un sir sau mai multe siruri de caractere care reprezinta
caomanda (comenzile) externa(e) de executat. Daca este prezent al doilea parametru, acest sir contine
setarile variabilelor de mediu, sub forma nume=valoare.
Meroda exec lanseaza un thread separat pentru executia comenzii (comenzilor) respective si
returneaza un obiect de tip Process, asociat procesului astfel creat in sistem. Daca aplicatia lansata din
programul Java are nevoie de date de intrare, acestea sunt transmise aplicatiei externe cu ajutorul obiectului
OutputStream, atasat obiectului Process.
OutputStream getOutputStream();
Similar eventualele date de iesire ale aplicatiei, se pot obtine folosind obiectul InputStream al
aceluiasi obiect Process.
InputStream getInputStream();
import java.io.*;
/*
exec: Executa comanda, intorcandu-se imediat chiar daca comanda
se mai executa
execWait: Executa comanda, dar nu se intoarce decat daca comanda este
executata (pt mai multe comenzi dependente una de cealalta)
*/
//---------------------------------------------------------------------------
help
pause
dir
pause
edit
pause
//---------------------------------------------------------------------------
Interfaţa FilenameFilter
Listing 5: Listarea fişierelor cu o anumită extensie
/* Listarea fisierelor din directorul curent
care au anumita extensie primita ca argument .
Daca nu se primeste nici un argument , vor fi listate toate .
*/
import java .io .*;
class Listare
{
public static void main ( String [] args )
{
try {
File director = new File (".");
String [] list ;
if ( args . length > 0) list = director . list ( new Filtru ( args [0]) );
else list = director . list ();
for (int i = 0; i < list . length ; i ++) System . out. println ( list [i]);
} catch ( Exception e) {e. printStackTrace ();}
}
}
class Filtru implements FilenameFilter
{
String extensie ;
Filtru ( String extensie )
{
this.extensie = extensie ;
}
public boolean accept ( File dir , String nume )
{
return ( nume.endsWith ("." + extensie ) );
}
}
Laborator 10
public Thread()
public Thread(Runnable target)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
Dacă se specifică în constructor un obiect ţintă, atunci corpul thread-ului (corpul metodei run) este
ataşat acestui obiect. Dacă nu se specifică atunci corpul este ataşat thread-ului nou creat.
public static Thread currentThread() - intoarce thread-ul curent.
public static yield() - cedeaza controlul de la obiectul thread la planificatorul JVM, pentru a permite unui alt
thread sa ruleze
public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException - pune thread-ul respective in
asteptare un anumit interval de timp
public void start() - lansează în executie noul thread
public void run() - conţine instructiunile thread-ului curent descrisă prin suprascrierea acestei metode. Întreaga
activitate curentă a thread-ului trebuie descrisa prin suprascrierea acestei metode
public void interrupt() - trimite o întrerupere obiectului thread care o apeleaza
public static boolean interrupted()
public boolean isInterrupted() - testează dacă thread-ul curent a fost interrupt sau nu; diferenta dintre cele doua
metode este ca prima modifica starea de intrerupere pe cand a doua nu
public void destroy() - distruge un thread fără operaţii de curăţire. Metoda nu este implementată.
public final boolean isAlive() - răspunde dacă obiectul thread a
public final void setPriority(int newPriority) - setează prioritatea thread-ului.
public final int getPriority() - intoarce prioritatea thread-ului curent
public final void setName(String String name)
public final getName() - setează respectiv returnează numele thread-ului
public final ThreadGroup getThreadGroup() - intoarce grupul curent de thread-uri.
public static int activeCount() - intoarce numărul de thread-uri active
public static int enumerate(Thread [] tarray) - intoarce într-un tablou thread-urile member ale grupului curent şi
ale celor din subgrupuri.
public final void join(long millis) throws InterruptedException
public final void join(long millis, int nanos) throws InterruptedException
public final void join()throws InterruptedExcep - aşteaptă ca obiectul thread care le apelează să se termine.
Ultimele două metode limitează timpul maxim de asteptare
public static void dumpStack() - afişează la ieşirea standard stiva curenta de thread-uri
public final void setDaemon(boolean on)
public final boolean isDaemon() - un thread are statut de daemon daca metoda lui contine un ciclu infinit si
daca programatorul doreşte ca acest thread să nu se termine când se termină thread-ul parinte
setDaemon() - apelată imediat înainte de start, conferă această calitate thread-ului.
isDaemon() - răspunde dacă thread-ul respectiv este daemon sau nu.
public String toString() - intoarce reprezentarea textuala a obiectului Thread
public final void wait()throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait(long timeout) throws InterruptedException – obiect in asteptare pana la aparitia unui
eveniment
public final void notify()
public final void notifyAll() - sunt duale metodei wait(), ele anunta alte obiecte de apariţia unui eveniment.
Exemplu 1
Exemplu 2
JVM executa un thread sip e cele create de acesta, pana cand apare una din urmatoarele situatii:
• este apelata metoda exit() a clasei Runtimr, iar manager-ul de securitate a permis indeplinirea cu
succes a acestui apel
• toate thread-urile care un sunt daemon s-au terminat, fie prin intoarcere din apelul metodei run(), fie
printr-un apel al metodei stop() din partea altui thread, fie prin trimiterea de intreruperi din partea altui thread
(interrupt()).
• S-a incocat metoda stop() a obiectului threas (deprecated)
Daca se doreste asteptarea terminarii unui thread se poate folosi metoda join() a obiectului thread dupa care se
asteapta. Thread-ul a carui terminare se asteapta un este afectat de acest apel. Apelul this.join(), inseamna ca threas-ul
curent un se va termina niciodata, datorita acestui apel in asteptare. Functia join() apelata pt un thread care un si-a
inceput executia un s-a terminat, returneaza fara sa astepte.
Exemplu 3
/* aceasta este varianta nesincronizata a clasei Buffer
class Buffer {
private int number = -1;
//Clasa principala
public class TestSincronizare1 {
public static void main(String[] args) {
Buffer b = new Buffer();
Producator p1 = new Producator(b);
Consumator c1 = new Consumator(b);
p1.start();
c1.start();
}
}
Un segment de cod ce gestioneaza o resursa comuna mai multor de fire de executie separate si concurente se
numeste sectiune critica. In Java o sectiune critica poate fi un bloc de instructiuni sau o metoda.
Controlul accesului într-o sectiune critica se face prin cuvântul cheie synchronized. Platforma Java
asociaza un monitor fiecarui obiect al unui program ce contine sectiuni critice care necesita sincronizare. Acest monitor
va indica daca resursa critica este accesata de vreun fir de executie sau este libera, cu alte cuvinte "monitorizeaza" o
resursa critica. In cazul în care este accesata, va "pune un lacat" pe aceasta, astfel încât sa împiedice accesul altor fire de
executie la ea. In momentul când resursa este eliberata "lacatul" va fi eliminat pentru a permite accesul altor fire de
executie.
In exemplul tip producator/consumator de mai sus, sectiunile critice sunt metodele put si get iar resursa
citica comuna este obiectul buffer. Consumatorul nu trebuie sa acceseze buffer-ul când producatorul tocmai pune o
valoare în el, iar producatorul nu trebuie sa modifice valoarea din buffer în momentul când aceasta este citita de catre
consumator.
Proiecte Java
1. Realizarea unei aplicaţii de tip Wordpad folosind biblioteca awt. Aplicatia va trebui sa extinda clasa Frame si sa aiba
toate facilitatile facilităţile necesare in editarea unui document.
Cerinte minimale:
• interfaţă grafica
• creare, deschidere, salvare pe disc a fişierelor (extensie .txt şi .doc) => se vor folosi ferestre dialog.
• posibilitate de a schimba marimea caracterelor, culoare şi fontul
• existenţa meniurilor şi a barei de instrumente
• posibilitatea de a folosi Copy, Cut, Paste eventual şi numai folosind tastatura
• posibilitatea imprimarii documentului curent
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: TextArea, Event, awt, swing
2. Realizarea unei aplicaţii de tip IrfanView sau ACDsee. Aplicaţia poate fi construita si standalone si ca applet, după
preferintă.
Cerinte minimale:
• interfaţă grafica
• posibilitate de a specifica folder-ul de pe disk de unde se vor încărca imaginile
• posibilitate de a mari sau micşora imaginea (zoom)
• butoane pentru nevigare în cadrul imaginilor din folderul curent (previous&next)
• posibilitatea imprimării documentului curent
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: Image, Panel, Event, awt, swing
3. Realizarea unei aplicaţii de tip Paint folosind biblioteca awt. Aplicatia va trebui sa extinda clasa Frame si să aiba
toate facilitatile facilităţile necesare creării unor imagini.
Cerinte minimale:
• interfaţă grafica
• posibilitate salvare imagini cu extensia .bmp, .jpg, .gif (se vor folosi ferestre dialog)
• existenţa meniurilor şi a barei de instrumente
• bara de instrumente să includă următoarele elemente funcţionabile (pencil, brush, eraser, fill with color, line,
rectangle, ellipse, text)
• posibilitatea imprimării documentului curent
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: Canvas, Graphics, Event, awt, swing
4. Realizarea unei aplicaţii de tip Agendă telefonică. Aplicaţia poate fi construita si standalone si ca applet, după
preferintă. Înregistrarea pentru o persoană să conţină nume, prenume, ocupaţia, telefon fix-mobil-serviciu, data naşterii,
adresa reşedinţă, adresa servici, şi poză (dacă este disponibilă)
Cerinte minimale:
• interfaţă grafica
• păstrarea înregistrărilor pe disc într-un fişier text sau pentru punctaj în plus într-o bază de date relaţională
• implementarea principalelor operaţiuni: adăugare, ştergere, modificare, căutare
• butoane pentru nevigare în cadrul inregistrărilor (previous&next)
• posibilitatea imprimării înregistrărilor despre o anumită persoană
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: Image, Event, awt
6. Realizarea unui magazin virtual. . Aplicaţia poate fi construita si standalone si ca applet, după preferintă.
Cerinte minimale:
• interfaţă grafica
• crearea unei clase care să reprezinte căruciorul de cumpărături (cart-ul)
• clasă care să ia datele unui client (eventual dintr-un formular)
• datele reţinute pe disc sau pentru punctaj în plus într-o bază de date relaţională
• posibilitatea imprimării înregistrărilor despre o anumită persoană şi cumpărăturile sale
• plata se va face printr-un mandat poştal
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: sql, awt
7. Scrieti un program care sa simuleze un 'shell' pentru lucrul cu fisiere (Total Commander).
Cerinţe minimale:
• interfaţă grafica
• listarea fisierelor dintr-un director sau directorul curent
• listarea continutului unui fisier
• schimbarea directorului curent
• crearea unui nou director
• stergerea/redenumirea unui fisier/director
• aflarea informatiilor despre un fisier/director
• execuţia unui program
• deschiderea unui fişier folosind programul setat implicit
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: File, Event, sql, awt
8. Scrieti o aplicatie care gestioneaza un mini-dictionar român - englez.
Cerinţe minimale:
• interfaţă grafica
• adaugarea, stergerea, căutarea de definitii
• folositi clasa HashMap pentru reprezentarea dictionarului.
• salvarea dictionarului pe disc (format la alegere => bază de date, htm, txt )
• posibilitatea de a incarca dicţionarul in memorie dar şi a căuta direct pe disc în fişierul unde a fost
memorat
• tratare de excepţii
• alte facilităţi
A se citi în help documentaţia pt clasele şi pachetele: Collection, HashMap, Event, sql, awt