0% au considerat acest document util (0 voturi)
36 vizualizări39 pagini

Cursuri Java

Documentul prezintă pachetele Java folosite pentru crearea interfețelor grafice, AWT și Swing. De asemenea, descrie utilizarea mediului de dezvoltare NetBeans pentru proiectarea interfeței, inclusiv crearea ferestrei aplicației și adăugarea de componente grafice.

Încărcat de

prigat21
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPT, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
36 vizualizări39 pagini

Cursuri Java

Documentul prezintă pachetele Java folosite pentru crearea interfețelor grafice, AWT și Swing. De asemenea, descrie utilizarea mediului de dezvoltare NetBeans pentru proiectarea interfeței, inclusiv crearea ferestrei aplicației și adăugarea de componente grafice.

Încărcat de

prigat21
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPT, PDF, TXT sau citiți online pe Scribd

Cuvinte importante:

-pachete Java folosite pentru crearea unei interfete grafice utilizator: AWT, Swing -folosirea mediului de dezvoltare IDE NetBeans pentru proiectarea interfetei utilizator: instrumente NetBeans, crearea ferestrei aplicatiei; moduri de pozitionare a componentelor grafice in fereastra aplicatiei; componente grafice AWT si Swing; - tratarea evenimentelor: tipuri de evenimente; clase Java specifice tipurilor de evenimente; tipuri de interceptori de evenimente (listener); inregistrarea unui obiect a clasei interceptoare ca administrator al unui eveniment; folosirea claselor abstracte <tip_eveniment>Adapter si a claselor anonime pentru tratarea evenimentelor; utilizarea IDE - NetBeans pentru tratarea evenimentelor.

16/11/2013

Pachete Java folosite pentru crearea unei interfete grafice utilizator


Interfata grafica a unei aplicatii Java (GUI) este folosita pentru a permite, intr-o forma prietenosa, interactiunea dintre utilizator si obiectele grafice de pe ecran. Un obiect grafic asteapta sa fie executata o actiune asupra sa (clic de mouse, apasarea unei taste etc), pentru a raspunde cu executarea unui anumit cod. De fapt, se asteapta declansarea unui eveniment (clic de mouse pe obiect, apasarea unei taste intr-o cutie de text etc) pentru ca aplicatia sa raspunda intr-un mod prevazut de programator.
Limbajul Java pune la dispozitia programatorilor o mare varietate de facilitati de elaborare si prelucrare a interfetelor grafice utilizator. In prezent, Java ofera doua tehnologii de creare a unei interfete grafice utilizator:

- AWT (Abstract Windowing Toolkit) - este API-ul initial pus la dispozitie incepand cu primele versiuni de Java; toate componentele AWT fac parte din pachetul [Link];
- Swing este parte a proiectului JFC (Java Foundation Classes) (creat in urma colaborarii dintre Sun Netscape si IBM); Swing foloseste aceeasi infrastructura de clase ca si AWT extinzand functionalitatea acestuia; pachetul swing a fost integrat incepand cu versiunea 2 a Java; toate componentele Swing fac parte din pachetul [Link].
16/11/2013 2

Nota: Este de preferat ca interfetele-utilizator Java sa fie create folosind tehnologia Swing, deoarece include mai multe facilitati; insa nu se poate renunta complet la tehnologia AWT deoarece aici exista clase esentiale, folosite si in tehnologia Swing.

Crearea unei aplicatii Java cu interfata grafica se desfasoara in doua etape:


A. Realizarea design-ului interfetei grafice, care inseamna: - crearea unei suprafete de afisare (cum ar fi o fereastra) pe care vor fi asezate obiectele grafice (componentele) care servesc la comunicarea cu utilizatorul (butoane, casete pentru editarea textelor, liste, etc); - crearea si asezarea componentelor pe suprafata de afisare la pozitiile corespunzatoare. B. Realizarea functionalitatii interfetei grafice, care inseamna: - definirea unor metode de tratare a diferitelor tipuri de evenimente, metode care sunt apelate cand utilizatorul interactioneaza cu obiectele grafice (componentele) ale interfetei; - ascultarea (interceptarea sau listener) diferitelor tipuri de evenimente, generate n momentul interactiunii obiectelor grafice cu utilizatorul, si executarea actiunilor corespunzatoare, asa cum au fost ele definite in metodele de tratare.
16/11/2013 3

Realizarea design-ului interfetei utilizator. Folosirea mediului de dezvoltare IDE NetBeans pentru proiectarea interfetei utilizator
IDE-NetBeans este un mediu de dezvoltare pentru aplicatii informatice Java. IDE-NetBeans este format dintr-o suita de instrumente care sprijina programatorul in realizarea unei aplicatii informatice Java. Instrumentele principale ale mediului de dezvoltare NetBeans, folosite pentru proiectarea interfetei utilizator sunt urmatoarele: - Proiectorul interfetei grafice (fereastra Design) reprezinta zona principala de lucru, in care se proiecteaza ferestrele de interfata-utilizator si obiectele grafice (componente AWT si Swing, meniuri) care sunt plasate in aceste ferestre. - Fereastra de instrumente grafice (fereastra Palette) contine reprezantari grafice ale componentelor AWT si Swing. - Fereastra de proprietati (fereastra Properties) contine trei categorii de informatii despre o componenta grafica, selectata la un moment dat, categorii evidentiate prin trei etichete pozitionate in antetul ferestrei: a) eticheta Properties descrie caracteristici referitoare la aspectul componentei (culoare, dimensiune, texte afisate pe componenta respectiva, culoare etc); b) eticheta Events descrie metodele pentru tratarea evenimentelor a caror sursa este componenta selectata;
16/11/2013 4

c) eticheta Code se foloseste pentru a insera cod propriu in metoda initComponent() generata automat de NetBeans sau in orice alta parte a programului unde NetBeans genereaza automat cod; de asemenea se foloseste si pentru a modifica secvente de cod generate automat cu NetBeans pentru componenta selectata; - Fereastra de cod (fereastra Source) contine codul Java al aplicatiei informatice; in aceasta fereastra sunt zone de cod care sunt generate automat de NetBeans (si ele nu pot fi modificate decat cu ajutorul ferestrei Properties) si sunt zone de cod in care programatorul poate insera, modifica sau sterge instructiunii proprii; - Fereastra de navigare printre componentele grafice ale interfetei (fereastra Inspector) permite vizualizarea tuturor componentelor grafice ale interfetei utilizator; de asemenea permite si selectia componentei respective in fereastra Design; - Fereastra de navigare in structura proiectului permite vizualizarea tuturor pachetelor, fisierelor, bibliotecilor etc ce formeaza aplicatia, intr-o structura arborescenta. Navigarea prin aceasta structura se realizeaza la fel ca in Windows Explorer, iar deschiderea fisierelor are loc prin dublu-clic pe numele lor. Aceasta fereastra permite gestionarea rapida a componentelor aplicatiei (modificare, adaugare sau stergere).

16/11/2013

Crearea ferestrei aplicatiei informatice


Pentru crearea ferestrei aplicatiei informatice se procedeaza astfel: 1. Se creaza un proiect, prin metoda cunoscuta deja; 2. Se alege optiune New din meniul File si pe ecran apare fereastra New File.

In aceasta fereastra se extinde (cu clic pe semnul +) elementul Java GUI Forms din caseta Categories, si se alege elementul AWT Forms daca se doreste proiectarea unei interfete utilizator folosind tehnologia AWT (crearea unei ferestre de tip Frame).
Daca se doreste proiectarea unei interfete utilizator folosind tehnologia Swing (crarea unei ferestre de tip JFrame) nu este necesar sa se extinda elementul AWT Forms. Apoi, in caseta File Types se alege elementul Frame Form pentru fereastra AWT sau JFrame Form pentru fereastra Swing. 3. Stabilirea numelui ferestre de tip Frame in varianta AWT sau JFrame in varianta Swing si a locului acesteia in cadrul proiectului. De fapt, NetBeans creaza un nou fisier cu extensia .java care contine codul initial pentru o clasa, cu numele precizat in caseta Class Name, care extinde clasa Frame (ATW) sau JFrame (Swing).
16/11/2013 6

Pasul 2 alegerea tipului de fereastra AWT sau Swing pentru interfatautilizator


16/11/2013 7

Pasul 3 stabilirea numelui ferestre de tip Frame sau JFrame si a locului acesteia in cadrul proiectului
16/11/2013 8

Dupa terminarea procedurii de creare a ferestrei aplicatiei ecranul de lucru arata ca in figura de mai jos:

16/11/2013

Dupa crearea ferestrei aplicatiei informatice mediul NetBeans ne permite sa lucram in doua moduri: - modul de lucru Source folosit pentru a edita (inserare de, modificare de, stergere de) cod; - modul de lucru Design folosit pentru a insera, modifica sau sterge componente grafice elementare, in fereastra aplicatiei, precum si pentru a modifica proprietati sau a trata evenimente specifice fiecarei componente a ferestrei. Vom detalia cateva aspecte legate de modul de lucru Design Stabilirea modului de pozitionare a componentelor grafice pe suprafata de afisare (fereastra aplicatiei) folosind modul de lucru Design Mediul NetBeans permite mai multe moduri de pozitionare si adaugare a componentelor grafice in fereastra aplicatiei. Dupa crearea ferestrei aplicatiei mediul NetBeans stabileste schita de asezare si adaugare la tipul BorderLayout, care este putin utilizat. Descrierea acestei schite se va face in cursul urmator.

16/11/2013

10

Pentru modificarea schitei de asezare a componentelor grafice in fereastra aplicatiei se procedeaza astfel: - se intra in fereastra Inspector si se alege componenta Frame sau JFrame - se executa clic cu butonul drept al mouse-ului si din meniul contextual, care apare, se alege optiunea Set Layout apoi, se alege tipul de schita dorit, cum ar fi: Free Design, AbsoluteLayout, BoxLayout, CardLayout, FlowLayout, GridLayout, GridBagLayout, NullLayout. Este de preferat sa se aleaga Free Design care este cel mai usor de folosit si permite programatorului sa aseze componentele in mod liber cum doreste el. Folosirea componentelor grafice din fereastra Palette a mediului NetBeans In folosirea componentelor grafice din fereastra Palette trebuie sa se aiba in vedere tehnologia folosita pentru crearea ferestrei aplicatiei. Daca fereastra aplicatiei a fost creata cu AWT, atunci se vor adauga in aceasta numai componente AWT iar daca fereastra aplicatiei a fost creata cu Swing, atunci se vor adauga numai componente Swing.

Swing foloseste aceeasi infrastructura de clase ca si AWT, ceea ce permite folosirea combinata a componentelor Swing si AWT in aceeasi interfata utilizator. Totusi, in unele cazuri este posibil ca aceste doua tipuri de componente sa nu fie reprezentate corect in cadrul containerului. Pentru evitarea problemelor, cel mai bine este sa folosim exclusiv un singur sistem de componente grafice.
16/11/2013

11

Componentele AWT din fereastra Palette sunt reprezentate in figura de mai jos:

Componentele Swing din fereastra Palette sunt reprezentate in figura de mai jos:

16/11/2013

12

Realizarea functionalitatii interfetei grafice. Tratarea evenimentelor


Cand se lucreaza cu o interfata grafica, o actiune a utilizatorului asupra unei componente grafice declanseaza (genereaza) un eveniment.
Exemple de evenimente sunt: apasarea unui buton, modificarea textului intr-un control de editare, inchiderea sau redimensionarea unei ferestre, etc. In Java, un eveniment este un obiect al unei clase cu un nume de forma: <tip>Event, in care <tip> reprezinta tipul evenimentului. In Java, o componenta care genereaza un eveniment se mai numeste si sursa evenimentului (event source).

In Java, interceptarea unui eveniment generat de o componenta a interfetei grafice se realizeaza prin intermediul unui obiect (interceptor sau care trateaza evenimentul) al unei clase interceptoare (listener) care implementeaza o interfata cu un nume de forma <tip_eveniment>Listener sau extinde o clasa abstracta cu un nume de forma <tip_eveniment>Adapter.
Utilizator (actiune) Componenta (genereaza un eveniment) Interceptor de tip Listener (intercepteaza si trateaza un eveniment)
13

16/11/2013

Tipuri de evenimente
Un eveniment este un obiect al unei clase <tip>Event din urmatoarea ierarhie de clase Java:

Object
EventObject (din pachetul [Link]) AWTEvent (din pachetul [Link]) <tip>Event (din pachetul [Link]) <tip>Event (din pachetul [Link])

Principalele tipuri de evenimente definite cu ajutorul claselor <tip>Event sunt descrise in urmatorul tabel:
16/11/2013 14

Clase Java specifice tipurilor de evenimente


Clase specifice tipurilor de evenimente ActionEvent AdjustmentEvent ConponentEvent Tipurile de evenimente apar in situatii ca: Actiuni asupra unei componente elementare (buton, etc) Actiuni asupra unei componente de tip Scrollbar Deplasari, redimensionari, ascunderi (componenta devine invizibila)

ContainerEvent FocusEvent ItemEvent


KeyEvent MouseEvent MouseMotionEvent

Adaugare, stergere de componente pe container Obtinerea/pierderea controlului asupra tastaturii Selectia sau deselectia de componente (liste, casute de optiuni etc)
Apasarea sau eliberarea unei taste Actiuni de mouse: clic, apasare, eliberare, iesire/intrare in componenta Miscare mouse, tarare (drag) mouse

TextEvent
WindowEvent
16/11/2013

Modificarea textului din componenta


Inchidere sau minimizare/maximizare ferestre
15

Tipuri de interceptori de evenimente (listener) O clasa interceptoare de evenimente (listener) poate fi orice clasa care specifica in declaratia sa ca doreste sa intercepteze (sa trateze) evenimente de un anumit tip. Pentru a deveni o clasa interceptoare a unui eveniment de un anumit tip, clasa respectiva trebuie sa implementeze (cuvantul-cheie implements) o interfata specifica pentru tratarea tipului de eveniment (interfata care este un tip de interceptor) si care are un nume de forma <tip_eveniment>Listener. De exemplu, pentru interceptarea evenimentelor de tip MouseEvent, clasa respectiva trebuie sa implementeze interfata MouseListener etc. Interfetele <tip_eveniment>Listener se gasesc in pachetul [Link] si sunt derivate din clasa EventListener care face parte din pachetul [Link]. Fiecare interfata <tip_eveniment>Listener declara una sau mai multe metode care vor trebui sa fie implementate in clasa interceptoare si care vor fi apelate automat la aparitia unui eveniment.

16/11/2013

16

De exemplu: class TrateazaButoane implements MouseListener { public void mouseClincked(MouseEvent me) { // Metoda interfetei MouseListener ... }} class TrateazaCaseteText implements TextListener { public void textValueChanged(TextEvent te) { // Metoda interfetei TextListener ... } }

Metodele din interfetele <tip_eveniment>Listener sunt declarate sub forma:


public void nume_metoda (<tip>Event e) unde: - nume_metoda corespunde unui subeveniment al evenimentului identificat prin <tip>.
16/11/2013 17

De exemplu, un eveniment de tipul MouseEvent, care corespunde generic actionarii cu butoanele mouse-ului asupra unei componente, are ca subevenimente : clicul (apasarea si eliberarea), apasarea si eliberarea unui buton al mouse-ului, precum si intrarea si iesirea din componenta. Pentru fiecare subeveniment este prevazuta o metoda in interfata MouseListener, de forma: void mouseClincked(MouseEvent e) void mousePressed(MouseEvent e) void mouseReleased(MouseEvent e) void mouseEntered(MouseEvent e) void mouseExited(MouseEvent e) Intrucat o clasa poate implementa oricate interfete, ea va putea sa intercepteze (sa trateze) evenimente de mai multe tipuri: class Interceptor implements MouseListener, TextListener { public void mouseClincked(MouseEvent me) { //Metoda interfetei MouseListener ... } public void textValueChanged(TextEvent te) { //Metoda interfetei TextListener ... }}
16/11/2013

18

Urmatorul tabel prezinta principalele tipuri de interceptori (interfetele specifice tratarii tipului de eveniment) si sursele evenimentelor (clasele din pachetul [Link] care definesc componente AWT Java adica obiecte vizuale):
Tip de interceptor asociat unui tip de eveniment ActionListener AdjustmentListener Sursa evenimentelor (clase care definesc componente AWT) List (caseta cu lista), Button (buton de comanda), TextField (camp de text), MenuItem (optiuni de meniu) Scrollbar (bara de defilare)

ComponentListener
ContainerListener FocusListener ItemListener

Component (orice componenta a interfetei grafice)


Container (o componenta care contine alte componente) Component Checkbox (caseta de validare), List, Choice (caseta combinata), CheckboxMenuItem(caseta de validare a unei optiuni de meniu) Component Component

KeyListener MouseListener si MouseMotionListener

TextListener
WindowListener
16/11/2013

TextField, TextArea (arie de text)


Window
19

Orice instanta a unei clase care intercepteaza (trateaza) un eveniment de un anumit tip trebuie sa implementeze obligatoriu metodele interfetei corespunzatoare <tip_eveniment>Listener. Tabelul de mai jos prezinta, pentru fiecare interfata <tip_eveniment>Listener, metodele puse la dispozitie si care trebuie implementate de clasa interceptoare de evenimente.
Interfata implementata de clasa interceptoare (care trateaza tipul de eveniment) Metodele interfetei

ActionListener
AdjustmentListener ComponentListener

actionPerformed(ActionEvent e)
adjustmentValueChanged(AdjustmentEve nt e) componentHidden(ComponentEvent e) componentMoved(ComponentEvent e) componentResized(ComponentEvent e) componentShown(ComponentEvent e) componentAdded(ContainerEvent e) componentRemoved(ContainerEvent e)

ContainerListener

FocusListener
ItemListener
16/11/2013

focusGained(FocusEvent e) focusLost(FocusEvent e)
itemStateChanged(ItemEvent e)
20

Interfata implementata de clasa interceptoare (care trateaza tipul de eveniment) KeyListener MouseListener

Metodele interfetei keyPressed(KeyEvent e) keyReleased(KeyEvent e) keyTyped(KeyEvent e) mouseClicked(MouseEvent e) mouseEntered(MouseEvent e) mouseExited(MouseEvent e) mousePressed(MouseEvent e) mouseReleased(MouseEvent e) mouseDragged(MouseEvent e) mouseMoved(MouseEvent e) textValueChanged(TextEvent e) windowActivated(WindowEvent e) windowClosed(WindowEvent e) windowClosing(WindowEvent e) windowDeactivated(WindowEvent e) windowDeiconified(WindowEvent e) windowIconified(WindowEvent e) windowOpened(WindowEvent e)
21

MouseMotionListener TextListener WindowListener

16/11/2013

Inregistrarea unui obiect a clasei interceptoare ca administrator al unui eveniment


Pentru ca evenimentele unei componente Java sa fie interceptate (tratate) de catre o instanta a unei clase interceptoare de evenimente, acesta instanta trebuie inregistrata ca administrator al interceptarii (tratarii) evenimentelor asociate componentei respective. Inregistrarea unei instante a clasei interceptoare de evenimente ca administrator al interceptarii (tratarii) evenimentelor unei componente Java se face prin invocarea metodelor din clasa Component de tipul add<tip_eveniment>Listener(). Forma generala pentru aceste metode este:

public void add<tip_eveniment>Listener(<tip_eveniment>Listener <a>)


unde: - <tip_eveniment>Listener specifica tipul de interceptor (interfata specifica tratarii tipului de eveniment);

- <a> - specifica o instanta a unei clase interceptoare care implementeaza interfata <tip_eveniment>Listener; aceasta instanta este considerata administratorul tratarii evenimentelor unei componente.
16/11/2013 22

De exemplu: [Link](new TrateazaButoane()); Stabileste ca obiectul creat newTrateazaButoane() este inregistrat ca administrator al tratarii evenimentelor de clic de mouse ale butonului de comanda cmdBtn. Cu alte cuvinte, metodele de tipul add<tip_eveniment>Listener() asociaza sursa evenimenului (componenta Java) cu administratorul evenimentului (instanta care trateaza evenimentul) Un administrator de evenimente poate fi asociat mai multor tipuri de evenimente, deoarece clasa interceptoare din care provine administratorul poate implementa mai multe interfete <tip_eveniment>Listener. Putem da exemplul obiectului de tip Frame care poate implementa oricate interfete <tip_eveniment>Listener are nevoie pentru a trata diverse tipuri de evenimente care se pot produce asupra componentelor elementare (butoane, casete de text etc) asezate in fereastra de tip Frame. De asemenea, unei componente Java ii putem asocia mai multi gestionari de evenimente. Mai mentionam ca pentru fiecare metoda add<tip_eveniment>Listener() exista si o metoda de tip remove<tip_eveniment>Listener(), prin care un administrator de evenimente inceteaza de a mai fi asociat unei componente.
16/11/2013 23

In concluzie, tratarea evenimentelor in Java se desfasoara astfel: 1. Componentele Java genereaza evenimente cand ceva interesant se intampla; 2. Sursele evenimentelor (componentele Java) permit oricarei clase sa intercepteze evenimentele sale prin metode de tip add<tip_eveniment>Listener(); 3. O clasa care intercepteaza evenimente trebuie sa implementeze interfete specifice fiecarui tip de eveniment - acestea descriu metode ce vor fi apelate automat la aparitia evenimentelor.

Asadar, pentru a scrie cod care sa se execute in momentul in care utilizatorul interactioneaza cu o componenta grafica trebuie sa parcurgem urmatorii pasi:
1. sa definim o clasa care sa implementeze interfete specifice <tip_eveniment>Listener si care sa intercepteze evenimentele produse de acea componenta; in cadrul acestei clase trebuie sa implementam (sa scriem) metodele specifice pentru tratarea evenimentelor; 2. sa cream o instanta a clasei definite la pasul 1 si sa comunicam componentei-sursa ca respectiva instanta ii intercepteaza (trateaza) evenimentele pe care le genereaza, cu alte cuvinte, sa inregistram acea instanta drept administrator al evenimentelor produse de componenta respectiva (folosind metode de tip add<tip_eveniment>Listener()).
16/11/2013 24

Folosirea claselor abstracte <tip_eveniment>Adapter si a claselor anonime pentru tratarea evenimentelor

Stim deja ca, o clasa care trateaza evenimente de un anumit tip trebuie sa implementeze interfata corespunzatoare acelui tip. Aceasta inseamna ca trebuie sa implementeze obligatoriu toate metodele definite de acea interfata, chiar daca nu specifica nici un cod pentru unele dintre ele. Sunt insa situatii cand acest lucru poate deveni neplacut, mai ales atunci cand nu ne intereseaza decat o singura metoda a interfetei pentru ca dorim sa tratam un singur subeveniment.
Un exemplu, in acest sens, este urmatorul: o fereastra (de tip Frame) care nu are specificat cod pentru tratarea subevenimentului sau de inchidere nu poate fi inchisa cu butonul marcat cu x din coltul dreapta sus si nici cu combinatia de taste Alt+F4. Pentru a realiza acest lucru trebuie interceptat evenimentul de inchidere a ferestrei in metoda windowClosing() si apelata metoda de inchidere [Link]() pentru terminarea programului, in cazul cand ne referim la fereastra principala a aplicatiei. Aceasta inseamna ca trebuie sa implementam interfata WindowListener care are nu mai putin de sapte metode. Pentru a evita scrierea inutila a acestor metode, exista o serie de clase care implementeaza interfetele <tip_eveniment>Listener fara a specifica nici un cod pentru metodele lor. Aceste clase au un nume de forma: <tip_eveniment>Adapter.
16/11/2013 25

Clasele <tip_eveniment>Adapter sunt clase abstracte care implementeaza fiecare o anumita interfata <tip_eveniment>Listener fara a specifica cod la nici o metoda a interfetei.
Scopul unei astfel de clase este ca la crearea unui interceptor de evenimente, in loc sa implementam o anumita interfata, si implicit toate metodele sale, sa extindem clasa <tip_eveniment>Adapter corespunzatoare interfetei respective (daca aceasta clasa exista) si sa suprascriem doar metodele care ne intereseaza (cele in care vrem sa scriem o anumita secventa de cod). De exemplu, adaptorul interfetei WindowListener este clasa abstracta WindowAdapter. Definim o clasa interceptoare care extinde clasa WindowAdapter si suprascriem in ea metoda windowClosing(). Avantajul acestei modalitati de tratare a evenimentelor este reducerea codului programului, acesta devenind mult mai lizibil. Dezavantajul major al acestei modalitati este ca, daca se doreste interceptarea mai multor tipuri de evenimente, atunci trebuie definite clase interceptoare care sa extinda clase <tip_eveniment>Adapter pentru fiecare tip de eveniment. Acest fapt se datoreaza restrictiei de mostenire a claselor, care spune ca o clasa nu poate extinde decat o singura clasa. Vom vedea insa ca acest dezavantaj poate fi eliminat prin folosirea unei clase anonime.
16/11/2013 26

In tabelul de mai jos sunt date toate clasele <tip_eveniment>Adapter (adaptori) asociate interfetelor <tip_eveniment>Listener. Se oberva ca o interfata <tip_eveniment>Listener are un adaptor de tipul <tip_eveniment>Adapter. Interfetele care nu au un adaptor sunt cele care definesc o singura metoda si prin urmare crearea unei clase adaptor nu isi are rostul.
Interfata <tip_eveniment>Listener ActionListener AdjustmentListener ComponentListener ContainerListener FocusListener Adaptorul <tip_eveniment>Adapter Nu are Nu are ComponentAdapter ContainerAdapter FocusAdapter

ItemListener
KeyListener MouseListener si MouseMotionListener TextListener

Nu are
KeyAdapter MouseAdapter si MouseMotionAdapter Nu are

WindowListener
16/11/2013

WindowAdapter
27

Folosirea claselor interne anonime pentru tratarea evenimentelor

O clasa interna este o clasa definita in interiorul altei clase.


O clasa anonima este o clasa interna fara nume folosita pentru instantierea unui singur obiect de un anumit tip. Clasele anonime sunt preferate de programatori atunci cand se doreste sa se defineasca clase simple derivate din clasa Thread, din clase de tip Adapter, din interfete de tip Listener care au o singura metoda sau din alte clase avand o singura metoda. Codul clasei anonime apare exact in locul in care este folosit, usurand astfel intelegerea programului. De exemplu, urmatoarea secventa de cod creaza o instanta a unei clase fara nume care extinde clasa WindowAdaper si pentru care este suprascrisa metoda windowClosing(): addWindowListener(new [Link]() { public void windowClosing([Link] evt) { [Link](0); } });
16/11/2013 28

Un exemplu tipic de folosire a claselor anonime este instantierea adaptorilor direct in corpul unei clase (de tip Frame) care contine componente ale caror evenimente trebuie tratate. Utilizarea IDE NetBeans pentru tratarea evenimentelor Java Mediul de dezvoltare NetBeans faciliteaza lucu cu evenimente permitand generarea automata de cod pentru definirea claselor interceptoare de evenimente si pentru definirea metodelor de tratare a acestora. De asemenea, se genereaza cod si pentru a asocia o componenta-sursa la administratorul de evenimente dorit. Pentru a trata evenimentele unei componente (obiect vizual) in mod automat se procedeaza astfel: 1. se intra in modul de lucru Design (proiectare interfata grafica); 2. se alege din fereastra de proprietati (Properties) tab-ul Event al componentei dorite care este sursa evenimentului; astfel, sunt vizualizate toate metodele-eveniment atasate componentei respective; 3. se selecteaza apoi metoda-eveniment dorita; pe ecran apare fereastra Handlers a metodei-eveniment in care se alege butonul Add pentru a da un nume unei metode definita de programator care sa trateze evenimentul respectiv; dupa terminarea acestei operatiuni IDE NetBeans face comutarea in modul de lucru Source (editare cod sursa);
16/11/2013 29

4. In modul de lucru Source IDE NetBeans creaza automat antetul metodei a carui nume a fost stabilit la pasul 2; imediat dupa antetul metodei, programatorul poate introduce cod care sa trateze un eveniment. Daca se doreste stergerea unei metode-eveniment asociata cu o componenta din interfata, se procedeaza la fel, numai ca la pasul 2 se foloseste butonul Remove din fereastra Handlers. Automat, se va sterge si codul metodei-eveniment respective.

Figura de mai jos ilustreaza cum se poate declara o metoda pentru tratarea unui tip de eveniment al unei componente din interfata utilizator (a unui buton de comanda).

16/11/2013

30

Urmatorul program ([Link]) creaza o interfata grafica folosind componenta Frame in care sunt plasate componente elementare de tip Label, Button si TextField. Programul citeste de la tastatura un sir de 10 numere si calculeaza media numerelor citite. Media este apoi afisata in caseta de text din interfata grafica. Mediul de programare folosit pentru crearea acestei interfete utilizator a fost IDE NetBeans. Variabila de tip Label are numele label1 (dat implicit de NetBeans) variabila de tip Button are numele cmdMedie iar variabila de tip TextField are numele txtMedie. Interfata utilizator a aplicatiei in faza de proiectare este ilustrata in figura de mai jos

16/11/2013

31

Listingul acestui program este prezentat in continuare.

public class TestEvenimente extends [Link] {


/** Creates new form TestEvenimente */ public TestEvenimente() { initComponents(); } /** This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initComponents() { cmdMedie = new [Link](); label1 = new [Link](); txtMedie = new [Link]();

16/11/2013

32

setLocationRelativeTo(null); setTitle("Calcul medie"); addWindowListener(new [Link]() { public void windowClosing([Link] evt) { exitForm(evt); } }); [Link]("calcul medie aritmetica"); [Link](new [Link]() { public void mouseClicked([Link] evt) { clicDeMouseMedie(evt); } }); [Link]("media este"); [Link] layout = new [Link](this); [Link](layout); [Link]( [Link]([Link]) .add([Link]() .add(76, 76, 76) .add(label1, [Link].PREFERRED_SIZE, [Link].DEFAULT_SIZE, [Link].PREFERRED_SIZE) .add(41, 41, 41)
16/11/2013 33

.add(txtMedie, [Link].PREFERRED_SIZE, 96, [Link].PREFERRED_SIZE) .addContainerGap(133, Short.MAX_VALUE)) .add([Link], [Link]() .addContainerGap(147, Short.MAX_VALUE) .add(cmdMedie, [Link].PREFERRED_SIZE, [Link].DEFAULT_SIZE, [Link].PREFERRED_SIZE) .add(122, 122, 122)) ); [Link]( [Link]([Link]) .add([Link]() .add(35, 35, 35) .add([Link]([Link]) .add(label1, [Link].PREFERRED_SIZE, [Link].DEFAULT_SIZE, [Link].PREFERRED_SIZE) .add(txtMedie, [Link].PREFERRED_SIZE, [Link].DEFAULT_SIZE, [Link].PREFERRED_SIZE)) .addPreferredGap([Link], 185, Short.MAX_VALUE)
16/11/2013 34

.add(cmdMedie, [Link].PREFERRED_SIZE, [Link].DEFAULT_SIZE, [Link].PREFERRED_SIZE) .add(36, 36, 36)) ); pack(); }// </editor-fold> private void clicDeMouseMedie([Link] evt) { int[] a = new int[10]; int suma; float medie; suma = 0; medie = 0; for(int i = 0; i < 10; i++) { String raspuns = [Link](this, "Introduceti un numar", "Introducere de date", [Link].INFORMATION_MESSAGE); a[i] = [Link](raspuns); suma += a[i]; } medie = suma/10; [Link](new Float(medie).toString()); }
16/11/2013 35

/** Exit the Application */ private void exitForm([Link] evt) { [Link](0); } public static void main(String args[]) { [Link](new Runnable() { public void run() { new TestEvenimente().setVisible(true); } }); } // Variables declaration - do not modify private [Link] cmdMedie; private [Link] label1; private [Link] txtMedie; // End of variables declaration }

16/11/2013

36

Vom face cateva comentarii asupra programului prezentat mai sus: 1. IDE NetBeans genereaza automat metoda cu numele initComponents() folosita de constructorul clasei TestEvenimente pentru initializarea componentelor interfetei utilizator; codul din aceasta metoda nu se poate modifica in modul de lucru Source ci numai in modul de lucru Design prin folosirea fereastrei de proprietati (Properties). 2. Sunt incluse in metoda initComponent() urmatoarele metode de tratare a evenimentelor: - metoda-eveniment mouseClicked() a clasei interceptoare MouseAdapter, folosita pentru butonul de comanda cmdMedie; metoda este redefinita in interiorul unei clase anonime; - metoda-eveniment windowClosing() a clasei WindowAdapter, folosita pentru inchiderea ferestrei aplicatiei; metoda este redefinita in interiorul unei clase anonime. 3. Metoda clicDeMouseMedie() este apelata din metoda mouseClicked() si descrie codul care trebuie executat atunci cand se face clic de mouse pe butonul cmdMedie. Antetul acestei metode nu se poate modifica decat in modul de lucru Design folosind procedura descrisa la tratarea evenimentelor cu ajutorul IDE NetBeans. Corpul metodei poate fi modificat de programator in modul de lucru Source.
16/11/2013 37

4. Metoda exitForm()este apelata din metoda windowClosing() si descrie codul care trebuie executat atunci cand se apasa pe butonul x din coltul din dreapta sus al ferestrei aplicatiei. Acest cod a fost generat automat la crearea fisierului [Link], dar el poate fi modificat de programator in modul de lucru Source. 5. Metoda main() a aplicatiei a fost generata automat la crearea fisierului [Link]. Codul din aceasta metoda poate fi modificat sau completat cu alte instructiuni. Metoda [Link]() apelata in metoda main() pune in executie firulul care face vizibila fereastra aplicatiei, dupa ce s-au procesat toate celelalte evenimente trimise in coada de evenimente. Se observa ca si aceasta metoda are ca parametru o instanta a unei clase anonime de tip Runnable. Metoda care face vizibila fereastra aplicatiei este setVisible(). 6. In cod mai sunt folosite metode ca: - setText() pentru componenta txtMedie, care stabileste textul afisat in caseta de text; - setLabel() pentru componenta cmdMedie, care stabileste textul afisat pe butonul cmdMedie; - SetTitle() pentru componenta de tip Frame, reprezentand fereastra aplicatiei, care specifica titlul ferestrei. Despre aceste metode, vom discuta mai pe larg in lectia urmatoare.
16/11/2013 38

7. In metoda clicDeMouseMedie() este folosita clasa JOptionPane (din pachetul [Link]) pentru a crea o caseta de dialog standard (sub forma unei mici ferestre) prin care se face citirea de la tastatura a datelor de intrare. Pentru afisarea pe ecran a ferestrei de introducere a datelor s-a folosit metoda showInputDialog() a clasei JOptionPane. Despre crearea unor casete de dialog care sa realizeze introducerea datelor de la tastatura sau afisarea unor mesaje scurte pe baza clasei JOptionPane, vom discuta mai pe larg in lectia urmatoare. 8. In metoda initComponents() s-a generat automat cod pentru pozitionarea componentelor vizuale pe suprafata de afisare a ferestrei. Deoarece in faza de proiectare a ferestrei aplicatiei, s-a ales, ca mod de asezare a componentelor, schita (layout) Free Design (optiunea Set Layout -> Free Design din mediul NetBeans) s-a generat automat cod Java pentru: -crearea administratorului de pozitionare (folosind operatorul new si clasa corespunzatoare [Link]); -stabilirea administratorului de pozitionare pentru fereastra aplicatiei (folosind metoda setLayout()); - adaugarea componentelor in fereastra aplicatiei (folosind metoda add()). Despre toate acestea mai pe larg in lectia viitoare.
16/11/2013 39

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