Wykład 12: Obsługa Zdarzeń
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: public void removetypelistener(typelistener el)
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() AWTEvent jest podklasą EventObject.
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 itp.
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: long when,
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? boolean triggerspopup)
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ęć: int getclickcount()
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
Użytkownik naciska i zwalnia klawisz 'home'. Dwa zdarzenia: naciśnięty, zwolniony. 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.
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 ignorować zdarzenia naciśnięcia/zwolnienia klawiszy.
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 = ""; int X = 10, Y = 20; // output coordinates
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ą.
public class AdapterDemo extends Applet { public void init() { addmouselistener(new MyMouseAdapter(this)); addmousemotionlistener( new MyMouseMotionAdapter(this)); 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> */
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");