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");
}

Podobne dokumenty