270 likes | 474 Views
INTERFEŢE GRAFICE (II). AWT (Abstract Window Toolkit). C rearea unei aplicaţii grafice presupune: Design Crearea unei suprafeţe de afişare (cum ar fi o fereastră) pe care vor fi aşezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc);
E N D
AWT (Abstract Window Toolkit) Crearea unei aplicaţii grafice presupune: Design • Crearea unei suprafeţe de afişare (cum ar fi o fereastră) pe care vor fi aşezate obiectele grafice care servesc la comunicarea cu utilizatorul (butoane, controale de editare, texte, etc); • Crearea şi aşezarea obiectelor grafice pe suprafaţa de afişare în poziţiile corespunzătoare; Funcţionalitate • Definirea unor acţiuni care trebuie să se execute în momentul când utilizatorul interacţionează cu obiectele grafice ale aplicaţiei; • "Ascultarea" evenimentelor generate de obiecte în momentul interactiunii cu utilizatorul şi executarea acţiunilor corespunzătoare aşa cum au fost ele definite.
Tratarea evenimentelor Un evenimenteste produs de o actiune a utilizatoruluiasupra uneicomponente grafice si reprezinta mecanismulprin care utilizatorul comunica efectiv cu programul.
Tratarea evenimentelor în Java este bazată pe modelul delegării evenimentelor. (Delegation Event Model) Elementele principale sunt: • Clase eveniment ce încapsulează informaţia despre diferite tipuri de interacţiuni cu utilizatorul • Obiecte ce generează evenimente, informează event listeners când acestea apar şi oferă informaţii despre ele • Obiecte event listener ce sunt informate de o sursă de evenimente când apar acestea, pentru a trece la o anumită acţiune. • Tratarea evenimentelor într-o aplicaţie GUI, folosind modelul delegării evenimentelor, poate fi împărţită în două sarcini când se construieşte aplicaţia: • Setarea propagării evenimentelor de la sursa lor la event listeners • Furnizarea acţiunii ce trebuie efectuate în event listeners când se recepţionează evenimentul
În lucrul cu interfeţe grafice, o acţiune asupra unei componente grafice declanşează un eveniment. Un eveniment este un obiect al unei clase tipEvent din următoarea ierarhie de clase: Object (din pachetul java.lang) EventObject (din pachetul java. util) AWTEvent (din pachetul java. awt) tipEvent (din pachetul java.awt.event)
Interfeţe şi clase abstracte asociate evenimentelor Fiecărui tip tip de eveniment îi este asociat o interfaţă tipListenerîn pachetul java.awt.event. Cu excepţia tipurilor Action, Adjustment, Item şi Text, aceste interfeţe suntimplementate în acelaşi pachet de clasele abstracte tipAdapter corespunzătoare; metodele din aceste clase nu sunt abstracte, dar prevădacţiunea nulă. EventListener (interfaţă din pachetul java.util) tipListener (interfaţă din pachetul java.awt.Event) tipAdapter (clasă abstractă din pachetul java.awt.Event)
Metodele din aceste interfeţe şi clase sunt declarate prin: • public void nume-metodă (tipEvent e) şi corespund câte unui "subeveniment" al evenimentului identificat prin tip.
Clase AWTEvent • Subclasele clasei AWTEvent se pot împărţi în două grupe: • evenimente semantice – reprezintă interacţiuni ale utilizatorului cu GUI. De exemplu apăsarea unui buton, selectarea unei intrări în meniu, selecţia unui checkbox, scrolling, schimbarea textului într-un câmp text. Evenimente: ActionEvent, AdjustmentEvent, ItemEvent, TextEvent. • evenimente de nivel scăzut – reprezintă intrări de nivel scăzut sau operaţii pe ferestre. Câteva evenimente de acest fel alcătuiesc un eveniment semantic. De exemplu apăsarea unui buton presupune apăsarea şi eliberarea unui buton a mouse-ului. Exemple: ComponentEvent, ContainerEvent, FocusEvent, KeyEvent, MouseEvent, PaintEvent, WindowEvent.
Java.lang.Object Java.util.EventObject Java.awt.AWTEvent ComponentEvent TextEvent ActionEvent AdjustementEvent ItemEvent InputEvent WindowEvent ContainerEvent FocusEvent PaintEvent KeyEvent MouseEvent
Clase de evenimente semantice • ActionEvent – evenimente generate de acţiuni efectuate asupra componentelor GUI. Componentele GUI care generează acest eveniment sunt: • Button – când se face click • List – când pe un element al listei se face dublu click • MenuItem – când se selectează un element din meniu • TextField – când se apasă ENTER ActionEvent are următoarele metode: • String getActionCommand() – returnează numele comenzii asociate cu această acţiune: este o etichetă de buton, numele elementului din listă, din meniu sau text, depinde de tipul elementului ce generează acest eveniment. • int getModifiers() – returnează suma constantelor modificator corespunzător modificatorilor tastatură ţinuţi apăsaţi în timpul acestei acţiuni: • public static final int SHIFT_MASK • public static final int CTRL_MASK • public static final int META_MASK • public static final int ALT_MASK
AdjustmentEvent – evenimentele sunt generate când se fac ajustări pe anumite componente de tip Scrollbar. Pune la dispoziţie o metodă: • int getValue() • ItemEvent – se generează când un element este selectat sau deselectat într-o componentă ItemSelectable: • Checkbox • CheckboxMenuItem • Choice • List • Metode: • Object getItem() – returnează obiectul care a fost selectat sau deselectat. Eticheta unui Checkbox, CheckboxMenuItem, element din Choice sau List se returnează ca un obiect String. • int getStateChange() – specifică dacă este selecţie sau deselecţie • public static final int SELECTED • public static final int DESELECTED • TextEvent – când conţinutul unei componente text se schimbă. Valabil pentru TextArea şi TextField.
Evenimente de nivel scăzut • ComponentEvent– este generat când o componentă (clasa Component şi subclasele ei) este ascunsă, mutată, redimensionată. Aceste evenimente sunt tratate intern de AWT, nu sunt tratate direct de aplicaţie (de obicei). • Component getComponent() – returnează o referinţă la acelaşi obiect ca şi getSource(), dar de tip Component. • ContainerEvent – este generat când o componentă este adăugată sau scoasă dintr-un container. • FocusEvent – generată când o componentă primeşte sau pierde focusul (adică primeşte intrarea de la tastatură). De obicei componenta cu focus este evidenţiată. • Metoda getID() se foloseşte pentru a afla dacă componenta primeşte (FocusEvent.FOCUS_GAINED) sau pierde (FocusEvent.FOCUS_LOST) focusul. • KeyEvent – este subclasă a clasei abstracte InputEvent. Este generată când utilizatorul apasă sau eliberează o tastă. Metoda getID() returnează unul din următoarele id-uri: • public static final int KEY_PRESSED • public static final int KEY_RELEASED • public static final int KEY_TYPED • Metoda getWhen() – returnează timpul când a avut loc evenimentul. • int getKeyCode() – returnează codul asociat tastei (definite în KeyEvent) • char getKeyChar() – se obţine codul Unicod ce rezultă în urma tastării
MouseEvent – este subclasă a clasei abstracte InputEvent. • Se generează când utilizatorul mişcă mouse-ul sau apasă un buton de-al lui. Acţiunea este identificată de următoarele constante (returnată de getID()): • public static final int MOUSE_PRESSED • public static final int MOUSE_RELEASED • public static final int MOUSE_CLICKED • public static final int MOUSE_DRAGGED • public static final int MOUSE_MOVED • public static final int MOUSE_ENTERED – intră pe suprafaţa unei componente • public static final int MOUSE_EXITED • Se poate folosi getWhen(). • Metodele int getX(), int getY(), Point getPoint() – relativ la componenta care a generat evenimentul. • int getClickCount() – numărul de click-uri asociate cu evenimentul.
PaintEvent – este generat când o componentă trebuie să apeleze metodele paint() sau update(). Sunt tratate intern de AWT, nu trebuie tratate direct de către aplicaţie. • WindowEvent – este generat când se efectuează o operaţie asupra unei ferestre (Window sau subclasele ei). Operaţia este identificată de un id (int getID()): • public static final int WINDOW_OPENED – se generează o singură dată când fereastra este creată, deschisă şi vizibilă prima oară. • public static final int WINDOW_CLOSING – se generează când acţiunea utilizatorului spune că fereastra trebuie închisă. Aplicaţia trebuie să apeleze explicit fie setVisible(false), fie dispose(). • public static final int WINDOW_CLOSED – după închiderea ferestrei în urma unui setVisible(false) sau dispose() • public static final int WINDOW_ICONIFIED – după minimizare • public static final int WINDOW_DEICONIFIED • public static final int WINDOW_ACTIVATED – primeşte intrare de la tastatură • public static final int WINDOW_DEACTIVATED • Window getWindow() – returnează obiectul Window care a generat evenimentul.
ActionListener AdjustementListener ComponentListener ContainerListener Java.util.EventListener FocusListener ItemListener KeyListener MouseListener MouseMotionListener TextListener WindowListener
Folosirea adaptorilor în tratarea evenimentelor • Un adaptor este o clasă abstractă care implementează o interfaţă de tip "listener". • Scopul unei astfel de clase este ca la crearea unui "ascultator" de evenimente, în loc să implementăm o anumită interfaţă şi implicit toate metodele sale, o să extindem adaptorul corespunzător interfeţei respective (dacă are) şi să supradefinim doar metodele care ne interesează. Pentru a facilita implementarea interfeţelor listener, în pachetul java.awt.event se defineşte o clasă adaptor pentru fiecare interfaţă listener de nivel scăzut.
Exemplu : Un exemplu sugestiv în exemplificarea adaptorilor este următorul: crearea unei ferestre care se va putea închide: cu butonul standard marcat cu 'x' din colţul dreapta sus, sau cu combinaţia de taste Alt+F4 sau prin apăsarea butonului creat în fereastră "Quit". În mod normal, fără a utiliza adaptori realizarea acestor evenimente implică implementarea interfeţei WindowListener cu implementarea tuturor metodelor sale (şapte metode are interfaţa), lucru incomod în realizarea unei aplicaţii.
import java.awt.*; import java.awt.event.*; public class SimpleWindowOne extends Frame { Button quitButton; public SimpleWindowOne() { super("SimpleWindowOne"); quitButton = new Button("Quit"); setLayout(new FlowLayout(FlowLayout.CENTER)); add(quitButton); quitButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) {if (evt.getSource() == quitButton) terminate(); } }); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent evt) { terminate(); } }); pack(); setVisible(true); } private void terminate() {System.out.println("Quitting the application."); dispose(); System.exit(0); }
Clase Adapter class BauturiAdapter1 implements ActionListener{ Bauturi b; BauturiAdapter1 ( Bauturi b ){ this.b = b; } public void actionPerformed( ActionEvent e ){ b.Bautura_Cafea(); } } • Clasa care implementeza interfata grafica ar trebui sa contina: Bauturi b = ...; Button buton_ceai, buton_cafea, buton_suc; ... buton_ceai.addActionListener( new BauturiAdapter1(b)); buton_cafea.addActionListener( new BauturiAdapter2(b)); buton_suc.addActionListener( new BauturiAdapter3(b));