aplica ii java...asadar, modul de aranjare a componentelor pe o suprafata de afisare nu este o...
TRANSCRIPT
Aplicații JAVA
Universitatea “Constantin Brâncuşi” din Târgu-Jiu
Lect.dr. Adrian Runceanu
Curs 5
Interfata grafica AWT(Abstract Window Toolkit )
17.03.2016 Curs - Aplicatii Java 2
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
2. Componente AWT
Fereastra afisata de acest program va arata astfel:
17.03.2016 Curs - Aplicatii Java 21
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
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();}}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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();}
}
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
6. Folosirea ferestrelor in AWT
Metodele mai folosite ale clasei Frame sunt:
17.03.2016 Curs - Aplicatii Java 80
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
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
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
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
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
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
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
6. Folosirea ferestrelor in AWT
Cele doua ferestre vor arata astfel:
17.03.2016 Curs - Aplicatii Java 88
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
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
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
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
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
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
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