Transcript Curs_10

INTERFEŢE GRAFICE (II)
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 eveniment este produs de o actiune a
utilizatorului asupra unei componente grafice si
reprezinta mecanismul prin 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:
1. Setarea propagării evenimentelor de la sursa lor la event listeners
2. 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
EventObject
AWTEvent
tipEvent
(din pachetul java.lang)
(din pachetul java. util)
(din pachetul java. awt)
(din pachetul java.awt.event)
Principalele tipuri de evenimente sunt:
tip
Action
Apare de exemplu la:
acţiuni asupra unei componente elementare (buton etc.)
Adjustment
acţiuni asupra unei componente de tip Scrollbar
Component
deplasări, redimensionări,ascunderi (componenta devine invizibilă)
Container
Focus
adăugare, ştergere
obţinerea/pierderea controlului asupra tastaturii
Item
selecţia sau deselecţia de componente (liste, căsuţe de opţiuni,etc.)
Key
apăsarea sau eliberarea unei taste
Mouse
MouseMotion
Text
Window
clic, apăsare, eliberare, ieşire/intrare în componentă
mişcare, târâre (drag)
modificarea textului din componentă
închidere, minimizare/maximizare
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 sunt implementate în acelaşi pachet de clasele abstracte
tipAdapter corespunzătoare; metodele din aceste clase nu sunt
abstracte, dar prevăd acţiunea nulă.
EventListener
tipListener
tipAdapter
(interfaţă din pachetul java.util)
(interfaţă din pachetul java.awt.Event)
(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
TextEvent
ActionEvent
AdjustementEvent
ItemEvent
ComponentEvent
ContainerEvent
FocusEvent
PaintEvent
WindowEvent
InputEvent
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ă dintrun 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
Interfeţele event listener semantice şi metodele lor:
Interfaţa event
listener
Metode event listener
ActionListener
actionPerformed(ActionEvent evt)
AdjustmentListener
adjustmentValueChanged(AdjustmentEvent evt)
ItemListener
itemStateChanged(ItemEvent evt)
TextListener
textValueChanged(TextEvent evt)
Interfeţele event listener de nivel scăzut şi metodele lor:
Interfaţa event listener
Metode event listener
ComponentListener
componentHidden(ComponentEvent evt)
componentMoved(ComponentEvent evt)
componentResized(ComponentEvent evt)
componentShown(ComponentEvent evt)
ContainerListener
componentAdded(ComponentEvent evt)
componentRemoved(ComponentEvent evt)
FocusListener
focusGained(FocusEvent evt)
focusLost(FocusEvent evt)
KeyListener
keyPressed(KeyEvent evt)
keyReleased(KeyEvent evt)
keyTyped(KeyEvent evt)
MouseListener
mouseClicked(MouseEvent evt)
mouseEntered(MouseEvent evt)
mouseExited(MouseEvent evt)
mousePressed(MouseEvent evt)
mouseReleased(MouseEvent evt)
MouseMotionListener
mouseDragged(MouseEvent evt)
mouseMoved(MouseEvent evt)
WindowListener
windowActivated(WindowEvent evt)
windowClosed(WindowEvent evt)
windowClosing(WindowEvent evt)
windowDeactivated(WindowEvent evt)
windowDeiconified(WindowEvent evt)
windowIconified(WindowEvent evt)
windowOpened(WindowEvent evt)
Evenimente specifice componentelor AWT
Evenimente pentru componente si containere
AWT
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.
Interfaţa event listener de nivel Adaptor de event listener de nivel scăzut
scăzut
ComponentListener
ComponentAdapter
ContainerListener
ContainerAdapter
FocusListener
FocusAdapter
KeyListener
KeyAdapter
MouseListener
MouseAdapter
MouseMotionListener
MouseMotionAdapter
WindowListener
WindowAdapter
• 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));