Aplica ii JAVA...Asadar, modul de aranjare a componentelor pe o suprafata de afisare nu este o...

Preview:

Citation preview

Aplicații JAVA

Universitatea “Constantin Brâncuşi” din Târgu-Jiu

Lect.dr. Adrian Runceanu

copyright@www.adrian.runceanu.ro

Curs 5

Interfata grafica AWT(Abstract Window Toolkit )

17.03.2016 Curs - Aplicatii Java 2

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

317.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Interfata grafica sau, mai bine zis, interfata grafica cu

utilizatorul (GUI), este un termen cu înteles larg care 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.

17.03.2016 Curs - Aplicatii Java 4

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Biblioteca de clase care oferaservicii grafice se numestejava.awt, AWT fiindprescurtarea de la Abstract Window Toolkit si estepachetul care care a suferitcele mai multe modificari întrecerea de la o versiune JDK la alta.

(*) http://way2java.com/awt-components/java-awt-components/

17.03.2016 Curs - Aplicatii Java 5

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

In principiu, crearea unei aplicatii grafice presupune urmatoareleactivitati:1. 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)

2. Crearea si asezarea obiectelor grafice pe suprafata de afisare înpozitiile corespunzatoare

3. Definirea unor actiuni care trebuie sa se execute în momentulcând utilizatorul interactioneaza cu obiectele grafice ale aplicatiei

4. "Ascultarea" evenimentelor generate de obiecte în momentulinteractiunii cu utilizatorul si executarea actiunilorcorespunzatoare asa cum au fost ele definite

17.03.2016 Curs - Aplicatii Java 6

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Majoritatea obiectelor grafice sunt subclase ale claseiComponent, clasa care defineste generic o componenta grafica care poate interactiona cu utilizatorul

Singura exceptie o constituie meniurile care provindin clasa MenuComponent

Printr-o componenta sau componenta graficaîntelegem orice obiect care are o reprezentaregrafica ce poate fi afisata pe ecran si care poateinteractiona cu utilizatorul

17.03.2016 Curs - Aplicatii Java 7

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Exemple de componente sunt: ferestre butoane bare de defilare, etc.

(*) https://pixelduke.wordpress.com/category/windows-8/page/2/(*) http://www.herongyang.com/Swing/JMenuBar-Menu-Item-Action-Listener-Test.html(*) http://www3.ntu.edu.sg/home/ehchua/programming/java/j4a_gui.html

17.03.2016 Curs - Aplicatii Java 8

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

In general, toatecomponentele sunt defintede clase proprii ce se gasesc în pachetuljava.awt, clasaComponent fiindsuperclasa abstracta a tuturor acestor clase.

(*) http://way2java.com/awt-components/java-awt-components/

17.03.2016 Curs - Aplicatii Java 9

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Crearea obiectelor grafice nu realizeaza automat si afisarealor pe ecran.

Mai întâi ele trebuie asezate pe o suprafata de afisare, care poate fi o fereastra sau suprafata unui applet, si vor devenivizibile în momentul în care suprafata pe care sunt afisate va fi vizibila.

O astfel de suprafata pe care se aseaza obiectele graficereprezinta o instanta a unei clase obtinuta prin extensia claseiContainer; din acest motiv suprafetele de afisare se numesc sicontainere.

Clasa Container este o subclasa aparte a clasei Component, fiind la rândul ei superclasa tuturor suprafetelor de afisareJava (ferestre, applet-uri, etc).

17.03.2016 Curs - Aplicatii Java 10

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Interfata grafica serveste interactiunii cu utilizatorul. De cele mai multe ori programul trebuie sa faca o

anumita prelucrare în momentul în care utilizatorul a efectuat o actiune si, prin urmare, obiectele graficetrebuie sa genereze evenimente în functie de actiunea pe care au suferit-o (actiune transmisa de la tastatura, mouse, etc.).

Incepând cu versiunea 1.1 a limbajului Javaevenimentele se implementeaza ca obiecte instantaale clasei AWTEvent sau ale subclaselor ei.

17.03.2016 Curs - Aplicatii Java 11

copyright@www.adrian.runceanu.ro

1. Privire de ansamblu asupra interfetei grafice

Un eveniment este produs de o actiune a utilizatoruluiasupra unui obiect grafic, deci evenimentele nu trebuie generate de programator.

In schimb, într-un program trebuie specificat codulcare se executa la aparitia unui eveniment.

Interceptarea evenimentelor se realizeaza prinintermediul unor clase de tip listener (ascultator, consumator de evenimente), clase care sunt definite înpachetul java.awt.event.

17.03.2016 Curs - Aplicatii Java 12

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

1317.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

2. Componente AWT

Prin componenta vom întelege în continuare oriceobiect care are o reprezentare grafica ce poate fi afisata pe ecran si care poate interactiona cu utilizatorul.

Exemple de componente sunt ferestrele, butoanele, bare de defilare, etc.

In general, toate componentele sunt definite de claseproprii ce se gasesc în pachetul java.awt, clasaComponent fiind superclasa abstracta a tuturoracestor clase.

17.03.2016 Curs - Aplicatii Java 14

copyright@www.adrian.runceanu.ro

2. Componente AWT

Ierarhia acestor clase:

17.03.2016 Curs - Aplicatii Java 15

copyright@www.adrian.runceanu.ro

2. Componente AWT

Din cauza unor diferente esentiale în implementarea meniurilor pe diferiteplatforme de operare acestea nu au putut fi integrate ca obiecte de tip Component.

Superclasa care descrie meniuri este MenuComponent iar ierarhia subclaselorsale este data în diagrama de mai jos:

Asadar, majoritatea obiectelor grafice sunt subclase ale clasei Component, clasacare defineste generic o component grafica care poate interactiona cu utilizatorul.

Singura exceptie o constituie meniurile care descind din clasa MenuComponent.

17.03.2016 Curs - Aplicatii Java 16

copyright@www.adrian.runceanu.ro

2. Componente AWT

1. Suprafete de afisare (Clasa Container) Crearea obiectelor grafice nu realizeaza automat si

afisarea lor pe ecran. Mai întâi ele trebuie asezate pe o suprafata, care poate fi

o fereastra sau suprafata unui applet, si vor devenivizibile în momentul în care suprafata pe care sunt afisateva fi vizibila.

O astfel de suprafata pe care se aseaza obiectele graficese numeste suprafata de afisare sau container sireprezinta o instanta a unei clase obtinuta prin extensiasuperclasei Container.

17.03.2016 Curs - Aplicatii Java 17

copyright@www.adrian.runceanu.ro

2. Componente AWT

O parte din ierarhia a careiradacina este Container este:

Asadar, un container este folosit pentru a adauga componente pesuprafata lui.

Componentele adaugate sunt memorate într-o lista iar pozitiile lordin aceasta lista vor defini ordinea de traversare "front-to-back" a acestora în cadrul containerului.

Daca nu este specificat nici un index la adaugarea unei componenteatunci ea va fi adaugata pe ultima pozitie a listei.

17.03.2016 Curs - Aplicatii Java 18

copyright@www.adrian.runceanu.ro

2. Componente AWT

Exemplu: crearea unei ferestre ce contine doua butoane

import java.awt.*;public class TestAWT1 {public static void main(String args[]) {// se creeaza fereastra - un obiect de tip Frame

Frame f = new Frame("O fereastra");// se seteaza modul de dispunere a obiectelor pe suprafata ferestrei

f.setLayout(new FlowLayout());

17.03.2016 Curs - Aplicatii Java 19

copyright@www.adrian.runceanu.ro

2. Componente AWT

// se creeaza cele doua butoane

Button b1 = new Button("OK");Button b2 = new Button("Cancel");// se adauga primul buton pe suprafata ferestrei

f.add(b1); f.pack();// se adauga al doilea buton pe suprafata ferestrei

f.add(b2); f.pack();// se afiseaza fereastra (devine vizibila)

f.show();}}

17.03.2016 Curs - Aplicatii Java 20

copyright@www.adrian.runceanu.ro

2. Componente AWT

Fereastra afisata de acest program va arata astfel:

17.03.2016 Curs - Aplicatii Java 21

copyright@www.adrian.runceanu.ro

2. Componente AWT

2. Adaugarea unei componente Clasa Container pune la dispozitie metoda add pentru

adaugarea unei componente pe o suprafata de afisare. O componenta nu poate apartine decât unui singur container,

ceea ce înseamna ca pentru a muta un obiect dintr-un container în altul trebuie sa-l eliminam mai întâi de pecontainerul initial.

Eliminarea unei componente de pe un container se face cu metoda remove.

Frame f = new Frame("O fereastra");Button b = new Button("OK");f.add(b); // se adauga butonul pe suprafata ferestreif.show();

17.03.2016 Curs - Aplicatii Java 22

copyright@www.adrian.runceanu.ro

2. Componente AWT3. Gestionarea pozitionariiExemplu de program Java care afiseaza 5 butoane pe o fereastra:

17.03.2016 Curs - Aplicatii Java 23

import java.awt.*;public class TestLayout {public static void main(String args[]) {Frame f = new Frame("Grid Layout");f.setLayout(new GridLayout(3, 2)); //*Button b1 = new Button("Button 1");Button b2 = new Button("2");Button b3 = new Button("Button 3");

Button b4 = new Button("Long-Named Button 4");Button b5 = new Button("Button 5");f.add(b1); f.add(b2); f.add(b3); f.add(b4); f.add(b5);f.pack();f.show();}}

copyright@www.adrian.runceanu.ro

2. Componente AWT

Se poate modifica linia marcata cu '*' ca mai jos, lasând neschimbat restul programului:

Frame f = new Frame("Flow Layout");f.setLayout(new FlowLayout()); Fereastra afisata dupa aceasta modificare va avea o

cu totul altfel de dispunere a componentelor sale:

17.03.2016 Curs - Aplicatii Java 24

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

2517.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Un gestionar de pozitionare (layout manager) esteun obiect care controleaza dimensiunea si aranjarea(pozitia) componentelor unui container.

Asadar, modul de aranjare a componentelor pe o suprafata de afisare nu este o caracteristica a claseiContainer.

Fiecare obiect de tip Container, sau o extensie a lui(Applet, Frame, Panel) are asociat un obiect care se ocupa cu dispunerea componentelor pe suprafata sa: gestionarul de pozitionare (layout manager).

17.03.2016 Curs - Aplicatii Java 26

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Toate clasele care instantiaza obiecte pentrugestionarea pozitionarii implementeaza interfataLayoutManager.

La instantierea unui container se creeaza implicit un gestionar de pozitionare asociat acestui container.

De exemplu pentru o fereastra (un obiect de tip Window sau o subclasa a sa) gestionarul implict estede tip BorderLayout, în timp ce pentru un container de tip Panel este o instanta a clasei FlowLayout.

17.03.2016 Curs - Aplicatii Java 27

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Folosirea gestionarilor de pozitionare Asa cum am vazut, orice container are un gestionar implicit de

pozitionare - un obiect care implemeneaza interfataLayoutManager, acesta fiindu-i atasat automat la crearea sa.

In cazul în care acesta nu corespunde necesitatilor, el poate fi schimbat cu usurinta.

Cei mai utilizati gestionari din pachetul java.awt sunt:1. FlowLayout2. BorderLayout3. GridLayout4. CardLayout5. GridBagLayout

17.03.2016 Curs - Aplicatii Java 28

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Atasarea explicita a unui gestionar de pozitionare la un container se face cu metoda setLayout a claseiContainer.

Metoda poate primi ca parametru orice instanta a uneiclase care implementeaza interfata LayoutManager.

Secventa de atasare a unui gestionar pentru un container este:

FlowLayout gestionar = new FlowLayout();container.setLayout(gestionar);sau, mai uzual:container.setLayout(new FlowLayout());

17.03.2016 Curs - Aplicatii Java 29

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Una din facilitatile cele mai utile oferite de gestionariide pozitionare este rearanjarea componentele unuicontainer atunci când acesta este redimesionat.

Pozitiile si dimensiunile componentelor nu sunt fixe, ele fiind ajustate automat de catre gestionar la fiecare redimensionare astfel încât sa ocupe cât mai"estetic" suprafata de afisare.

17.03.2016 Curs - Aplicatii Java 30

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Sunt însa situatii când dorim sa plasam componentele la anumite pozitii fixe iar acestea sa ramâna acolo chiardaca redimensionam containerul.

Folosind un gestionar de pozitionare aceasta pozitionareabsoluta a componentelor nu este posibila si deci trebuiecumva sa renuntam la gestionarea automata a containerul.

Acest lucru se realizeaza prin trimiterea argumentuluinull metodei setLayout:

// pozitionare absoluta a componentelor in containercontainer.setLayout(null);

17.03.2016 Curs - Aplicatii Java 31

copyright@www.adrian.runceanu.ro

3. Gestionari de pozitionare

Folosind pozitionarea absoluta, nu va mai fi suficientsa adaugam cu metoda add componentele încontainer ci va trebui sa specificam pozitia sidimensiunea lor - acest lucru era facut automat de gestionarul de pozitionare.

Exemplu:

container.setLayout( null );Button b = new Button("Buton");b.setSize(10, 10); // se stabileste dimensiunea butonului

b.setLocation (0, 0); // se stabileste locatia in container-ul repstectiv

b.add();17.03.2016 Curs - Aplicatii Java 32

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

3317.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

4. Gruparea componentelor (Clasa Panel)

Plasarea componentelor direct pe suprafata de afisare poate deveni incomoda în cazul în care avemmulte obiecte grafice.

Din acest motiv se recomanda gruparea obiectelorgrafice înrudite ca functii astfel încât sa putem fi siguri ca, indiferent de gestionarul de pozitionare al suprafetei de afisare, ele se vor gasi împreuna.

Gruparea componentelor se face în panel-uri.

17.03.2016 Curs - Aplicatii Java 34

copyright@www.adrian.runceanu.ro

4. Gruparea componentelor (Clasa Panel)

Un panel este cel mai simplu model de container. El nu are o reprezentare vizibila, rolul sau fiind de a oferi

o suprafata de afisare pentru componente grafice, inclusiv pentru alte panel-uri.

Clasa care instantiaza aceste obiecte este Panel, extensiea superclasei Container.

Pentru a aranja corespunzator componentele grupateîntr-un panel, acestuia i se poate specifica un gestionarde pozitionare anume, folosind metoda setLayout.

Gestionarul implicit pentru containerele de tip Panel esteFlowLayout.

17.03.2016 Curs - Aplicatii Java 35

copyright@www.adrian.runceanu.ro

4. Gruparea componentelor (Clasa Panel)

Asadar, o aranjare eficienta a componentelor uneiferestre înseamna:1. gruparea componentelor "înfratite" (care nu trebuie

sa fie despartite de gestionarul de pozitionare al ferestrei) în panel-uri

2. aranjarea componentelor unui panel, prinspecificarea acestuia a unui gestionar de pozitionarecorespunzator

3. aranjarea panel-urilor pe suprafata ferestrei, prinspecificarea gestionarului de pozitionare al ferestrei

17.03.2016 Curs - Aplicatii Java 36

copyright@www.adrian.runceanu.ro

4. Gruparea componentelor (Clasa Panel)Exempluimport java.awt.*;public class TestPanel {public static void main(String args[]) {

Frame f = new Frame("Panel");Panel panel = new Panel();panel.setLayout(new FlowLayout());panel.add(new Label("Text:"));panel.add(new TextField("", 20));panel.add(new Button("Reset"));f.add(panel, BorderLayout.NORTH);f.add(new Button("OK"), BorderLayout.EAST);f.add(new Button("Cancel"), BorderLayout.WEST);f.pack();f.show();}

}17.03.2016 Curs - Aplicatii Java 37

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

3817.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Un eveniment este produs de o actiune a utilizatoruluiasupra unei componente grafice si reprezintamecanismul prin care utilizatorul comunica efectiv cu programul.

Exemple de evenimente sunt: apasarea unui butonmodificarea textului într-un control de editare închiderea, redimensionarea unei ferestre, etc. Componentele care genereaza anumite evenimente se mai numesc si surse de evenimente.17.03.2016 Curs - Aplicatii Java 39

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Interceptarea evenimentelor generate de componentele unui program se realizeaza prinintermediul unor clase de tip listener (ascultator, consumator de evenimente).

In Java, orice obiect poate "consuma" evenimentelegenerate de o anumita componenta grafica.

17.03.2016 Curs - Aplicatii Java 40

Utilizator(actiune)

Componenta (generare

eveniment)

Listener (interceptare eveniment)

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Asadar, pentru a scrie cod care sa se execute în momentulîn care utilizatorul interactioneaza cu o componentagrafica trebuie sa facem urmatoarele 2 lucruri:1. sa scriem o clasa de tip listener care sa "asculte"

evenimentele produse de acea componenta si în cadrulacestei clase sa implementam metode specifice pentrutratarea lor

2. sa comunicam componentei sursa ca respectiva clasa îi"asculta" evenimentele pe care le genereaza, cu altecuvinte sa înregistram acea clasa drept "consumator" al evenimentelor produse de componenta respectiva.

17.03.2016 Curs - Aplicatii Java 41

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

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 (exemple): evenimentul generat de actionarea unui buton este implementat

prin clasa ActionEvent

evenimentul generat de modificarea unui text prin clasa TextEvent,

etc.

Toate aceste clase au ca superclasa comuna clasa AWTEvent.

17.03.2016 Curs - Aplicatii Java 42

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

O clasa consumatoare de evenimente (listener) poatefi orice clasa care specifica în declaratia sa ca dorestesa asculte evenimente de un anumit tip.

Acest lucru se realizeaza prin implementarea uneiinterfete specifice fiecarui tip de eveniment.

17.03.2016 Curs - Aplicatii Java 43

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Astfel, pentru ascultarea evenimentelor de tip ActionEvent clasa respectiva trebuie sa implementezeinterfata ActionListener, pentru TextEvent interfatacare trebuie implementata este TextListener, etc.

Toate aceste interfete au suprainterfata comunaEventListener.

Exemple:class AscultaButoane implements ActionListener

class AscultaTexte implements TextListener17.03.2016 Curs - Aplicatii Java 44

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Intrucât o clasa poate implementa oricâte interfete eava putea sa asculte evenimente de mai multe tipuri:

class Ascultator implements ActionListener, TextListener

Vom vedea în continuare metodele fiecarei interfetepentru a sti ce trebuie sa implementeze o clasaconsumatoare de evenimente.

17.03.2016 Curs - Aplicatii Java 45

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Exemplu de tratare a evenimentelor

Inainte de a detalia aspectele prezentate mai sus, saconsideram un exemplu de tratare a evenimentelor.

Vom crea o fereastra care sa contina doua butoanecu numele "OK", repectiv "Cancel".

La apasarea fiecarui buton vom scrie pe bara titlu a ferestrei mesajul " Ati apasat butonul ...".

17.03.2016 Curs - Aplicatii Java 46

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Exemplu: Ascultarea evenimentelor de la doua butoane

import java.awt.*;import java.awt.event.*;class Fereastra extends Frame {

public Fereastra(String titlu) {super(titlu);

}public void initializare() {setLayout(new FlowLayout()); // se stabileste gestionarul

setSize(200, 100); // se dimensioneaza fereastra

17.03.2016 Curs - Aplicatii Java 47

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Button b1 = new Button("OK");add(b1); // se adauga primul buton

Button b2 = new Button("Cancel");add(b2); // se adauga al doilea buton

Ascultator listener = new Ascultator(this);b1.addActionListener(listener);b2.addActionListener(listener);

// ambele butoane sunt ascultate de obiectul "listener" instanta a clasei Ascultator, definita ulterior

}}

17.03.2016 Curs - Aplicatii Java 48

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelorclass Ascultator implements ActionListener {private Fereastra f;public Ascultator (Fereastra f) {

this.f = f;}

// metoda interfetei ActionListenerpublic void actionPerformed(ActionEvent e) {String command = e.getActionCommand();// numele comenzii este numele butonului apasatSystem.out.println(e.toString());if (command.equals("OK")) f.setTitle("Ati apasat OK");else

if (command.equals("Cancel")) f.setTitle("Ati apasat Cancel");}

}17.03.2016 Curs - Aplicatii Java 49

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

public class TestEvent { // fereastra principala

public static void main(String args[]) {Fereastra f = new Fereastra("ActionEvent");f.initializare();f.show();}

}

17.03.2016 Curs - Aplicatii Java 50

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Nu este obligatoriu sa definim clase speciale pentruascultarea evenimentelor.

In exemplul de mai sus am definit o clasa speciala"Ascultator" pentru a intercepta evenimenteleproduse de cele doua butoane si din acest motiv a trebuit sa trimitem ca parametru acestei claseinstanta la fereastra noastra.

17.03.2016 Curs - Aplicatii Java 51

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Mai corect ar fi fost sa folosim chiar clasa "Fereastra" pentru a-siasculta evenimentele produse de componentele sale:class Fereastra extends Frame implements ActionListener{

public Fereastra(String titlu) {super(titlu);

}public void initializare() {

. . .b1.addActionListener(this);b2.addActionListener(this);

//ambele butoane sunt ascultate chiar din clasa Fereastra//deci ascultatorul este instanta curenta: this}17.03.2016 Curs - Aplicatii Java 52

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

public void actionPerformed(ActionEvent e) {String command = e.getActionCommand();

// numele comenzii este numele butonului apasatSystem.out.println(e.toString());if (command.equals("OK")) this.setTitle("Ati apasat OK");else

if (command.equals("Cancel")) this.setTitle("Ati apasatCancel");

}}. . .Asadar, orice clasa poate asculta evenimente de orice tip cu conditia sa implementeze interfetele specifice acelor evenimente.

17.03.2016 Curs - Aplicatii Java 53

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Tipuri de evenimente si componentele care le genereaza.

In tabelul de mai jos sunt prezentate în stânga tipurilede evenimente si interfetele iar în dreapta listacomponentelor ce pot genera evenimente de acel tip precum si o scurta explicatie despre motivul care le provoaca:

17.03.2016 Curs - Aplicatii Java 54

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

17.03.2016 Curs - Aplicatii Java 55

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Evenimente suportatede o componenta

Urmatorul tabelprezinta o clasificare a evenimentelor înfunctie de componentele care le

suporta:

17.03.2016 Curs - Aplicatii Java 56

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Metodele interfetelor de tip

"listener"

Orice clasa care trateaza

evenimente trebuie sa

implementeze obligatoriu metodele

interfetelor corespunzatoare

evenimentelor pe care le trateaza.

Tabelul prezinta, pentru fiecare

interfata, metodele puse la

dispozitie si care trebuie

implementate de clasa ascultator.

17.03.2016 Curs - Aplicatii Java 57

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Folosirea adaptorilor si a claselor interne în tratareaevenimentelor Am vazut ca o clasa care trateaza evenimente de un

anumit tip trebuie sa implementeze interfatacorespunzatoare acelui tip.

Aceasta înseamna ca trebuie sa implementeze obligatoriutoate metodele definite de acea interfata, chiar daca nu specifica nici un cod pentru unele dintre ele.

Sunt însa situatii când acest lucru este suparator, mai ales atunci când nu ne intereseaza decât o singura metoda a interfetei.

17.03.2016 Curs - Aplicatii Java 58

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Un exemplu sugestiv este urmatorul: o fereastra care nu are specificat cod pentru tratarea evenimentelor sale nu poatefi închisa cu butonul standard marcat cu 'x' din coltuldreapta sus si nici cu combinatia de taste Alt+F4. Pentru a realiza acest lucru trebuie interceptat evenimentulde închidere a ferestrei în metoda windowClosing si apelataapoi metoda dispose de închidere a ferestrei, eventual urmata de iesirea din program, în cazul când este vorba de fereastra principala a aplicatiei. Aceasta înseamna ca trebuie sa implementam interfataWindowListener care are nu mai putin de sapte metode.

17.03.2016 Curs - Aplicatii Java 59

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

// Crearea unei ferestre cu ascultarea evenimentelor sale// folosind implementarea directa a interfetei WindowListener

import java.awt.*;import java.awt.event.*;class Fereastra extends Frame implements WindowListener {

public Fereastra(String titlu) {super(titlu);this.addWindowListener(this);

}

17.03.2016 Curs - Aplicatii Java 60

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

// metodele interfetei WindowListenerpublic void windowOpened(WindowEvent e) {}public void windowClosing(WindowEvent e) {

dispose(); // inchidere fereastraSystem.exit(0); // terminare program

}public void windowClosed(WindowEvent e) {}public void windowIconified(WindowEvent e) {}public void windowDeiconified(WindowEvent e) {}public void windowActivated(WindowEvent e) {}public void windowDeactivated(WindowEvent e) {}}

public class TestWindowListener {public static void main(String args[]) {

Fereastra f = new Fereastra("O fereastra");f.show();

} }17.03.2016 Curs - Aplicatii Java 61

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Observati ca trebuie sa implementam toatemetodele interfetei, chiar daca nu scriem nici un cod pentru ele.

Singura metoda care ne intereseaza estewindowClosing în care specificam ce trebuie facutatunci când utilizatorul doreste sa închida fereastra.

Pentru a evita scrierea inutila a acestor metodeexista o serie de clase care implementeaza interfetelede tip "listener" fara a specifica nici un cod pentrumetodele lor.

Aceste clase se numesc adaptori.17.03.2016 Curs - Aplicatii Java 62

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Folosirea adaptorilorUn 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 implementa o anumita interfata si implicit toate metodele sale, saextindem adaptorul corespunzator interfetei respective (daca are!) si sa supradefinim doar metodele care ne intereseaza (cele în care vrem sa scriem o anumitasecventa de cod).

17.03.2016 Curs - Aplicatii Java 63

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelorAdaptorul interfetei WindowListener este WindowAdapter iar folosirea acestuiaeste data în exemplul de mai jos:// Crearea unei ferestre cu ascultarea evenimentelor sale folosind extindereaclasei WindowAdapterimport java.awt.*;import java.awt.event.*;class Fereastra extends Frame {

public Fereastra(String titlu) {super(titlu);this.addWindowListener(new Ascultator());

}}class Ascultator extends WindowAdapter {// supradefinim metodele care ne intereseaza

public void windowClosing(WindowEvent e) {System.exit(0);

}} 17.03.2016 Curs - Aplicatii Java 64

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Avantajul clar al acestei modalitati de tratare a evenimentelor este reducerea coduluiprogramului, acesta devenind mult mai usorlizibil.

17.03.2016 Curs - Aplicatii Java 65

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Insa exista si doua dezavantaje majore:1. Dupa cum ati observat, fata de exemplul anterior clasa"Fereastra" nu poate extinde WindowAdapter deoareceea extinde deja clasa Frame si din acest motiv am construio noua clasa numita "Ascultator".Vom vedea însa ca acest dezavantaj poate fi eliminat prinfolosirea unei clase interne.2. Un alt dezavantaj este ca orice greseala de sintaxa îndeclararea unei metode a interfetei nu va produce o eroare de compilare dar nici nu va supradefini metodainterfetei ci, pur si simplu, va crea o metoda a claseirespective.

17.03.2016 Curs - Aplicatii Java 66

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

class Ascultator extends WindowAdapter {// in loc de windowClosing scriem WindowClosing// nu supradefinim vreo metoda a clasei WindowAdapter// nu da nici o eroare// nu face nimic !public void WindowClosing(WindowEvent e) {

System.exit(0);}

}

17.03.2016 Curs - Aplicatii Java 67

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

In tabelul de mai jos sunt datitoti adaptorii interfetelor de tip "listener" - se observa ca o interfata XXXListener are un adaptor de tipul XXXAdapter. Interfetele care nu au un adaptor sunt cele care definesc o singura metoda siprin urmare crearea unei claseadaptor nu îsi are rostul.

17.03.2016 Curs - Aplicatii Java 68

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Folosirea claselor interne (anonime)

Stim ca o clasa interna este o clasa declarata încadrul altei clase iar clasele anonime sunt acele claseinterne folosite doar pentru instantierea unui singurobiect de acel tip.

Un exemplu tipic de folosire a lor este instantiereaadaptorilor direct în corpul unei clase care continecomponente ale caror evenimente trebuieinterceptate.

17.03.2016 Curs - Aplicatii Java 69

copyright@www.adrian.runceanu.ro

5. Tratarea evenimentelor

Clasa "Fereastra" din exemplul anterior poate fi scrisa astfel:class Fereastra extends Frame {

public Fereastra(String titlu) {super(titlu);

this.addWindowListener (new WindowAdapter() {//corpul clasei anonimepublic void windowClosing(WindowEvent e) {

System.exit(0); }});

}}Se observa cum codul programului a fost redus substantial prinfolosirea unui adaptor si a unei clase anonime.

17.03.2016 Curs - Aplicatii Java 70

copyright@www.adrian.runceanu.ro

5. Interfata grafica AWT

1. Privire de ansamblu asupra interfetei grafice2. Componente AWT3. Gestionari de pozitionare4. Gruparea componentelor (Clasa Panel)5. Tratarea evenimentelor6. Folosirea ferestrelor in AWT

7117.03.2016 Curs - Aplicatii Java

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Dupa cum am vazut suprafetele de afisare ale componentelorgrafice (containerele) sunt extensii ale clasei Container.

O categorie aparte a acestor containere o reprezintaferestrele.

Spre deosebire de un applet care îsi poate plasacomponentele direct pe suprafata de afisare a browser-ului încare ruleaza, o aplicatie independenta are nevoie de propriileferestre pe care sa faca afisarea componentelor sale grafice.

Pentru dezvoltarea aplicatiilor care folosesc grafica se vorfolosi clasele Window si subclasele sale directe Frame siDialog.

17.03.2016 Curs - Aplicatii Java 72

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

1. Clasa Window

Clasa Window este rar utilizata în mod direct. Ea permite crearea unor ferestre top-level care nu au

chenar si nici bara de meniuri. Pentru a crea ferestre mai complexe se utilizeaza

clasele Frame si Dialog.

(*) http://stackoverflow.com/questions/8976874/show-two-dialogs-on-top-of-each-other-using-java-swing(*) http://www3.ntu.edu.sg/home/ehchua/programming/java/j4a_gui.html

17.03.2016 Curs - Aplicatii Java 73

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Metodele mai importante ale clasei Window (mostenite de toatesubclasele sale) sunt date în tabelul de mai jos:

17.03.2016 Curs - Aplicatii Java 74

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT2. Clasa Frame

Este subclasa directa a clasei Window si este folositapentru crearea de ferestre independente sifunctionale, eventual continând bare de meniuri.

Orice aplicatie grafica independenta trebuie sa aibacel putin o fereastra, numita si fereastra principala, care va fi afisata la pornirea programului.

17.03.2016 Curs - Aplicatii Java 75

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Constructorii clasei Frame sunt:

1. Frame () - Construieste o fereastra, fara titlu, initial invizibila.

2. Frame(String title) - Construieste o fereastra, cu titlul specificat, initial invizibila.

17.03.2016 Curs - Aplicatii Java 76

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Asadar, o fereastra nou creata este invizibila. Pentru a fi facuta vizibila se va apela metoda show definitaîn superclasa Window. Exemplu:import java.awt.*;public class TestFrame {

public static void main(String args[]) {Frame f = new Frame("Fereastra exemplu");f.show();

}}

17.03.2016 Curs - Aplicatii Java 77

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Crearea ferestrelor prin instantierea obiectelor de tip Frame este mai putinuzuala. De obicei, ferestrele unui program vor fi definite în clase separate care extindclasa Frame, ca în exemplul de mai jos:

import java.awt.*;class Fereastra extends Frame{// constructorul ferestrei

public Fereastra(String titlu) {super(titlu);

}void initializare() {

. . .}}

17.03.2016 Curs - Aplicatii Java 78

public class TestFrame {public static void main(String args[]) {

Fereastra f = new Fereastra("Fereastra exemplu");f.initializare();f.show();}

}

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Gestionarul de pozitionare implicit al clasei Window este BorderLayout. Din acest motiv, în momentul în care fereastra este creata dar nici o

componenta grafica nu este pusa pe suprafata ei, suprafata de afisare a ferestrei va fi nula.

Acelasi efect îl vom obtine daca o redimenionam si apelam apoimetoda pack care determina dimeniunea suprafetei de afisare înfunctie de componentele grafice afisate pe ea.

Se observa de asemenea ca butonul de închidere a ferestrei nu estefunctional.

Interceptarea evenimentelor se face prin implementarea interfeteiWindowListener si prin adaugarea în lista ascultatorilor ferestrei(uzual) chiar a obiectului care implementeaza fereastra sau prinfolosirea unor adaptori si clase anonime.

17.03.2016 Curs - Aplicatii Java 79

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Metodele mai folosite ale clasei Frame sunt:

17.03.2016 Curs - Aplicatii Java 80

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

3. Clasa DialogToate interfetele grafice ofera un tip special de ferestre destinate preluarii datelor de la utilizator. Acestea se numesc ferestre de dialog sau casete de dialog si sunt

implementate prin intermediul clasei Dialog, subclasa directa a clasei Window.

Diferenta majora între ferestrele de dialog si ferestrele normale (obiecte de tip Frame) consta în faptul ca o fereastra de dialog este dependenta de o alta fereastra (normala sau tot fereastra dialog), numita si fereastra parinte.

17.03.2016 Curs - Aplicatii Java 81

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Cu alte cuvinte, ferestrele de dialog nu au o existenta de sine statatoare.

Când fereastra parinte este distrusa sunt distruse siferestrele sale de dialog, când este minimizataferestrele sale de dialog sunt facute invizibile iar cândeste maximizata acestea sunt aduse la starea în care se gaseau în momentul minimizarii ferestrei parinte.

17.03.2016 Curs - Aplicatii Java 82

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Ferestrele de dialog pot fi de doua tipuri:

1. modale: care blocheaza accesul la fereastra parinteîn momentul deschiderii lor - de exemplu, ferestrede introducere a unor date, de alegere a unui fisierîn vederea deschideriii, de selectare a unei optiuni, mesaje de avertizare, etc;

2. nemodale: care nu blocheaza fluxul de intrare catrefereastra parinte - de exemplu, ferestrele de cautarea unui cuvânt într-un fisier.

17.03.2016 Curs - Aplicatii Java 83

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Implicit o fereastra de dialog este nemodala si invizibila.Constructorii clasei Dialog sunt:Dialog(Frame parinte)Dialog(Frame parinte, String titlu)Dialog(Frame parinte, String titlu, boolean modala)Dialog(Frame parinte, boolean modala)Dialog(Dialog parinte)Dialog(Dialog parinte, String titlu)Dialog(Dialog parinte, String titlu, boolean modala)Unde: "parinte" reprezina o instanta ferestrei parinte, "titlu" reprezinta titlul ferestrei iar prin argumentul "modala" specificam daca fereastra de

dialog creata va fi modala (true) sau nemodala (false - valoarea implicita).

17.03.2016 Curs - Aplicatii Java 84

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Pe lânga metodele mostenite de la superclasa Window clasa Dialog mai contine metodele:

Crearea unei ferestre de dialog este relativ simpla si se realizeaza prin crearea unei clase care sa extinda clasa Dialog.

Mai complicat este însa modul în care se implementeazacomunicarea între fereastra de dialog si fereastra parinte, pentru ca aceasta din urma sa poata folosi datele introduse(sau optiunea specificata) în caseta de dialog.

17.03.2016 Curs - Aplicatii Java 85

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Exista doua abordari generale:

1. obiectul care reprezinta dialogul poate sa capteze evenimentele de la componentele de pe suprafata sa si sa seteze valorile unor variabile ale ferestrei parinte în momentul în care dialogul este încheiat

2. obiectul care creeaza dialogul (fereastra parinte) sa se înregistreze ca ascultator al evenimentelor de la butoanele care determina încheierea dialogului, iar fereastra de dialog sa ofere metode publice prin care datele introduse sa fie preluate din exterior.

17.03.2016 Curs - Aplicatii Java 86

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Exemplu: sa se creeze o fereastra de dialog modala pentru introducerea unui sir de caractere. Fereastra principala a aplicatiei va fi parintele casetei

de dialog, va primi sirul de caractere introdus si îsi va modifica titlul ca fiind sirul primit.

Deschiderea ferestrei de dialog se va face la apasarea unui buton al ferestrei principale numit "Schimba titlul".

Dialogul va mai avea doua butoane OK si Cancel pentru terminarea sa cu confirmare, respectiv renuntare.

17.03.2016 Curs - Aplicatii Java 87

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

Cele doua ferestre vor arata astfel:

17.03.2016 Curs - Aplicatii Java 88

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

import java.awt.*;import java.awt.event.*;

// Fereastra principala a aplicatieiclass FerPrinc extends Frame implements ActionListener{

public FerPrinc(String titlu) {super(titlu);

this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {

System.exit(0);}

});}17.03.2016 Curs - Aplicatii Java 89

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

public void initializare() {setLayout(new FlowLayout());setSize(300, 100);Button b = new Button("Schimba titlul");add(b);b.addActionListener(this);

}//metoda interfetei ActionListenerpublic void actionPerformed(ActionEvent e) {

FerDialog d = new FerDialog(this, "Titlu", true);// se verifica inchiderea ferestrei modale de dialogif (d.raspuns == null) return;setTitle(d.raspuns);}

}

17.03.2016 Curs - Aplicatii Java 90

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

// fereastra de dialogclass FerDialog extends Dialog implements ActionListener {

public String raspuns = null;private TextField text;public FerDialog(Frame parinte, String titlu, boolean

modala) {super(parinte, titlu, modala);

this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {

raspuns = null;dispose();

}});

17.03.2016 Curs - Aplicatii Java 91

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

setLayout(new FlowLayout());Button ok, cancel;ok = new Button("OK");cancel = new Button("Cancel");text = new TextField("", 50);add(cancel);add(text);add(ok);pack();ok.addActionListener(this);cancel.addActionListener(this);show();

}

17.03.2016 Curs - Aplicatii Java 92

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

// metoda interfetei ActionListenerpublic void actionPerformed(ActionEvent e) {// se verifica ce buton a fost apasat

String buton = e.getActionCommand();if (buton.equals("OK")) raspuns = text.getText();else

if (buton.equals("Cancel")) raspuns = null;dispose();}

}

17.03.2016 Curs - Aplicatii Java 93

copyright@www.adrian.runceanu.ro

6. Folosirea ferestrelor in AWT

// clasa principalapublic class TestDialog {

public static void main(String args[]) {FerPrinc f = new FerPrinc("Fereastra

principala");f.initializare();f.show();

}}

17.03.2016 Curs - Aplicatii Java 94

copyright@www.adrian.runceanu.ro

Referinte

Curs practic de Java, Cristian Frasinaru – capitolulInterfata grafica cu utilizatorul

http://docs.oracle.com/javase/6/docs/technotes/guides/awt/

http://www.tutorialspoint.com//awk/index.htm

http://archive.oreilly.com/oreillyschool/courses/java3/archive/java3.2/java306.html

17.03.2016 Curs - Aplicatii Java 95

copyright@www.adrian.runceanu.ro

Întrebări?

17.03.2016 Curs - Aplicatii Java 96

Recommended