Wykład 12: Obsługa Zdarzeń
Transkrypt
Wykład 12: Obsługa Zdarzeń
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 ● 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 void void void void mouseClicked(MouseEvent me) mouseEntered(MouseEvent me) mouseExited(MouseEvent me) mousePressed(MouseEvent me) 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ą. 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"); }