Wykład 12:
Zdarzenia
Aplety są sterowane zdarzeniami.
Większość zdarzeń jest generowana przez:
●mysz
●
klawiaturę
●
elementy interfejsu graficznego
Obsługa zdarzeń jest zawarta w pakiecie
java.awt.event
.
Model Delegowania Zdarzeń
Delegowanie zdarzeń:
●
źródło generuje zdarzenia
●
zdarzenia są wysyłane do słuchaczy
Słuchacz musi zarejestrować się u źródła aby
otrzymywać zawiadomienia o zdarzeniach.
Słuchacz normalnie czeka na otrzymanie zdarzenia, po
czym obsługuje je i natychmiast powraca.
Zdarzenia i Ich Źródła
Zdarzenie jest obiektem który opisuje zmianę stanu
swojego źródła, spowodowaną np.
●
przesunięciem myszki
●naciśnięciem klawisza
●
wyborem elementu w liście wyboru
●przepełnienie wartości licznika
●
zakończenie działania timera
Źródło jest obiektem który wygenerował zdarzenie.
Może generować więcej niż jeden rodzaj zdarzenia.
Słuchacze Zdarzeń
Obiekt który otrzymuje zawiadomienia o zdarzeniach:
●
jest zarejestrowany u źródła by otrzymywać
zawiadomienia o danym rodzaju zdarzeń
●
musi implementować metody które otrzymują i
przetwarzają te zdarzenia
Rejestracja/Wypisanie Słuchacza
Rejestracja słuchacza do otrzymywania powiadomień o
wydarzeniach typu
Type
:
public void addTypeListener(TypeListener el)
Type
to nazwa zdarzenia (np.
Key
,
MouseMotion
)
el
to odwołanie do słuchacza zdarzeń
Słuchacz już nie jest zainteresowany otrzymywaniem
powiadomień o zdarzeniach:
Obsługa Zdarzeń
Słuchacz musi implementować interfejs dla
określonego rodzaju zdarzeń.
Zbiór interfejsów zawarty w java.awt.events.
Na przykład interfejs KeyListener posiada metody:
void keyPressed(KeyEvent ke)void keyReleased(KeyEvent ke) void keyTyped(KeyEvent ke)
Klasy Zdarzeń
Nadklasą wszystkich zdarzeń jest
java.util.EventObject.
Konstruktor zdarzeń (
src
to obiekt generujący):
EventObject(Object src)
Metody:
Object getSource()
String toString()
int getID()
Typy Zdarzeń AWT
AWTEvent
jest nadklasą różnych typów zdarzeń
generowanych przez elementy interfejsu graficznego:
●
KeyEvent – generowany gdy otrzymane jest wejście
z klawiatury
●
MouseEvent – generowany gdy mysz jest
przesuwana, klikana, naciskana, zwalniania, itp.
●
ActionEvent – generowany gdy naciskany jest
przycisk, wybierany element menu, itp.
●
TextEvent – generowany gdy zmienia się wartość
pola tekstowego
Zdarzenia Myszy
MouseEvent
jest podklasą
InputEvent
, która jest
podklasą
AWTEvent
.
Jest kilka typów
MouseEvent
:
●MOUSE_CLICKED
- kliknięcie
●
MOUSE_DRAGGED
- przeciąganie
●
MOUSE_ENTERED
– wejście do elementu
●MOUSE_EXITED
– wyjście z elementu
●MOUSE_MOVED
- przesuwanie
●
MOUSE_PRESSED
– naciskanie
●MOUSE_RELEASED
- zwalnianie
Konstruktor Zdarzenia Myszy
MouseEvent(
Odwołanie do obiektu który wygenerował zdarzenie:
Component src,
Typ zdarzenia myszy:
int type,
Czas systemowy kiedy zdarzenie zaszło:
Konstruktor Zdarzenia Myszy
Które modyfikatory były wciśnięte:
int modifiers,
Współrzędne myszy:
int x, int y,
Liczba kliknięć:
int clicks,
Czy zdarzenie spowodowało pojawienie się menu?
Metody Zdarzenia Myszy
●
uzyskanie współrzędnych myszy:
int getX()int getY()
●
zmiana współrzędnych zdarzenia:
void translatePoint(int x, int y) ●
ilość kliknięć:
Zdarzenia Klawiatury
KeyEvent
jest generowany dla wejścia z klawiatury.
Trzy typy zdarzeń klawiatury:
●
KEY_PRESSED
– klawisz jest naciśnięty
●KEY_RELEASED
– klawisz jest zwolniony
●KEY_TYPED
– znak jest wygenerowany
Konstruktor zdarzenia klawiatury:
KeyEvent(Component src, int type, long
when, int modifiers, int code, char ch)
Zdarzenia Klawiatury
Wirtualny kod klawisza:
VK_ENTER VK_ESCAPE VK_CANCEL
VK_UP VK_DOWN VK_LEFT
VK_RIGHT VK_SHIFT VK_ALT
Metody klasy zdarzeń klawiatury:
char getKeyChar()
int getKeyCode()
CHAR_UNDEFINED
gdy znak niedostępny.
VK_UNDEFINED
gdy kod niedostępny.
Źródła Zdarzeń
Składowe graficznego interfejsu użytkownika które
mogą generować zdarzenia:
●
Button
– generuje
ActionEvent
gdy przycisk
jest naciskany
●
List
– generuje
ActionEvent
gdy element listy
jest podwójnie klikany, a
ItemEvent
gdy element
jest wybierany lub zwalniany
●
Window
– generuje
WindowEvent
gdy okno jest
aktywowane, zamykane, otwierany, minimalizowane,
przywracane, usuwane
Interfejs KeyListener
Interfejs do implementacji przez słuchacza
klawiatury, aby ten mógł obsługiwać
KeyEvent
.
Metody:
● void keyPressed(KeyEvent ke) ● void keyReleased(KeyEvent ke) ● void keyTyped(KeyEvent ke)
Użytkownik naciska i zwalnia klawisz 'A'. Trzy
zdarzenia: naciśnięty, znak, zwolniony.
Użytkownik naciska i zwalnia klawisz 'home'. Dwa
zdarzenia: naciśnięty, zwolniony.
Interfejs MouseListener
Interfejs do implementacji przez słuchacza myszy,
aby ten mógł obsługiwać
MouseEvent
.
Metody:
● void mouseClicked(MouseEvent me) ● void mouseEntered(MouseEvent me) ● void mouseExited(MouseEvent me) ● void mousePressed(MouseEvent me) ● void mouseReleased(MouseEvent me)
Interfejs MouseMotionListener
Interfejs do implementacji przez słuchacza ruchu
myszy, aby ten mógł obsługiwać
MouseEvent
.
Metody:
● void mouseDragged(MouseEvent me) ● void mouseMoved(MouseEvent me)
Obie są wywoływane wielokrotnie gdy mysz jest
ciągana/przesuwana.
Użycie Modelu Delegacji Zdarzeń
Aplikacja musi:
●
implementować interfejs słuchacza tak by otrzymać
powiadomienia o danym typie zdarzeń
●
zarejestrować słuchacza jako odbiorcę powiadomień
Źródło może generować kilka typów zdarzeń.
Słuchacz może rejestrować odbiór wielu rodzajów
zdarzeń, jednak musi implementować wszystkie
interfejsy dla ich obsługi.
Przykład: Obsługa Zdarzeń Myszy
import java.awt.*; import java.awt.event.*; import java.applet.*; /* <applet code="MouseEvents" width=300 height=100> </applet> */Aplet, implementuje oba interfejsy zdarzeń myszy:
public class MouseEvents extends Applet
implements MouseListener, MouseMotionListener {
Przykład: Obsługa Zdarzeń Myszy
Wiadomość do wyświetlenia i współrzędne myszy:
String msg = ""; int mouseX = 0, int mouseY = 0;
Aplet rejestruje się jako słuchaczy zdarzeń myszy:
public void init() {
addMouseListener(this);
addMouseMotionListener(this); }
Przykład: Obsługa Zdarzeń Myszy
Implementacja wszystkich metod w interfejsach
MouseListener
i
MouseMotionListener.
Gdy myszka naciśnięta, tekst w rogu okna apletu:
// Handle mouse clicked.
public void mouseClicked(MouseEvent me) { // save coordinates mouseX = 0; mouseY = 10; msg = "Mouse clicked."; repaint(); }
Przykład: Obsługa Zdarzeń Myszy
Gdy wchodzi do (wychodzi z) obszar apletu, wyświetla
się tekst w rogu okna apletu:
public void mouseEntered(MouseEvent me) { mouseX = 0;
mouseY = 10;
msg = "Mouse entered."; repaint();
}
public void mouseExited(MouseEvent me) { mouseX = 0;
mouseY = 10;
msg = "Mouse exited."; repaint();
Przykład: Obsługa Zdarzeń Myszy
Gdy myszka przyciśnięta/zwolniona, wyświetla się
odpowiedni tekst na bieżącej pozycji:
public void mousePressed(MouseEvent me) { mouseX = me.getX();
mouseY = me.getY(); msg = "Down";
repaint(); }
public void mouseReleased(MouseEvent me) { mouseX = me.getX();
mouseY = me.getY(); msg = "Up";
repaint(); }
Przykład: Obsługa Zdarzeń Myszy
Gdy myszka jest ciągniona wyświetla się '*' na
bieżącej pozycji i tekst w oknie statusu:
public void mouseDragged(MouseEvent me) { mouseX = me.getX(); mouseY = me.getY(); msg = "*"; showStatus("Dragging mouse at " + mouseX + ", " + mouseY); repaint(); }
public void mouseMoved(MouseEvent me) { showStatus("Moving mouse at " +
me.getX() + ", " + me.getY()); }
Przykład: Obsługa Zdarzeń Myszy
Wyświetla się wiadomość na danych współrzędnych:
// Display msg in applet window // at current X,Y location.
public void paint(Graphics g) {
g.drawString(msg, mouseX, mouseY); }
Obsługa Zdarzeń Klawiatury
Obsługa zdarzeń klawiatury: aplet implementuje
interfejs
KeyListener
.
Za każdym razem gdy użytkownik naciska klawisz,
generowanych jest 2-3 zdarzeń.
Gdy chodzi nam tylko o wpisywane znaki, możemy
Przykład: Obsługa Zdarzeń Klawiatury
Aplet, implemetuje interfejs nasłuchu klawiatury:
import java.awt.*;
import java.awt.event.*; import java.applet.*;
/*
<applet code="KeyEvents" width=300 height=100> </applet>
*/
public class KeyEvents extends Applet implements KeyListener {
String msg = "";
Przykład: Obsługa Zdarzeń Klawiatury
Rejestracja apletu jako słuchacza zdarzeń klawiatury:
public void init() {
addKeyListener(this);
requestFocus(); // request input focus }
Obsługa zdarzenia naciśnięcia klawisza:
public void keyPressed(KeyEvent ke) { showStatus("Key Down");
int key = ke.getKeyCode(); switch(key) {
Przykład: Obsługa Zdarzeń Klawiatury
case KeyEvent.VK_F1: msg += "<F1>";break; case KeyEvent.VK_F2: msg += "<F2>";break; case KeyEvent.VK_F3: msg += "<F3>";break; case KeyEvent.VK_PAGE_DOWN: msg += "<PgDn>";break; case KeyEvent.VK_PAGE_UP: msg += "<PgUp>";break; case KeyEvent.VK_LEFT: msg += "<Left Arrow>";break; case KeyEvent.VK_RIGHT: msg += "<Right Arrow>";break; } repaint(); }Przykład: Obsługa Zdarzeń Klawiatury
Obsługa zdarzenia zwolnienia klawisza:
public void keyReleased(KeyEvent ke) { showStatus("Key Up");
}
Obsługa zdarzenia otrzymania znaku:
public void keyTyped(KeyEvent ke) { msg += ke.getKeyChar();
repaint(); }
Przykład: Obsługa Zdarzeń Klawiatury
Wyświetla komunikat na danych współrzędnych:
// Display keystrokes.
public void paint(Graphics g) { g.drawString(msg, X, Y);
} }
Adapter Obsługi Zdarzeń
Adapter: ułatwia tworzenie klas obsługi zdarzeń.
Dostarcza puste implementacje wszystkich metod w
danym interfejsie zdarzeń.
Wystarczy dziedziczyć po klasie odpowiedniego
adaptera, implementując tylko te zdarzenia które nas
interesują.
Przykład: Adapter
Aplet, rejestracja słuchacza zdarzeń myszy:
import java.awt.*; import java.awt.event.*; import java.applet.*; /* <applet code="AdapterDemo" width=300 height=100> </applet> */
public class AdapterDemo extends Applet { public void init() {
addMouseListener(new MyMouseAdapter(this)); addMouseMotionListener(
new MyMouseMotionAdapter(this)); }
Przykład: Adapter
Klasa obsługująca zdarzenia myszy, implementuje
tylko jedną metodę:
class MyMouseAdapter extends MouseAdapter { AdapterDemo adapterDemo;
public MyMouseAdapter(
AdapterDemo adapterDemo){
this.adapterDemo = adapterDemo; }
// Handle mouse clicked.
public void mouseClicked(MouseEvent me) { adapterDemo.showStatus("Mouse clicked"); }
Przykład: Adapter
Klasa obsługująca zdarzenia ruchu myszy,
implementuje tylko jedną metodę:
class MyMouseMotionAdapter extends MouseMotionAdapter { AdapterDemo adapterDemo; public MyMouseMotionAdapter( AdapterDemo adapterDemo) { this.adapterDemo = adapterDemo; }
// Handle mouse dragged.
public void mouseDragged(MouseEvent me) { adapterDemo.showStatus("Mouse dragged"); }