Programowanie zdarzeniowe I. Podstawy obsługi zdarzeń Małgorzata Prolejko ZDA JA16Z03
Plan Pojęcie zdarzenia Klasy i obiekty słuchaczy Rejestracja słuchaczy Obsługa naciśnięcia przycisku Rozpoznawanie obiektu zdarzenia Zastosowanie klas anonimowych do implementacji słuchacza zdarzeń Zdarzenia semantyczne
Pojęcie zdarzenia Zdarzenie jest obiektem pochodnym klasy java.util.eventobject. Utworzenie/wywołanie/wyzwolenie (trigger) zdarzenia przez pewien obiekt źródła może być zauważone przez inny obiekt (słuchacza). Słuchacz musi być poinformowany jakiego zdarzenia i od jakiego obiektu oczekiwać oraz co zrobić gdy ono już nastąpi. Zdarzenie Action / Event Źródło / wyzwalacz Action Trigger Słuchacz Action Listener
Pojęcie zdarzenia Zdarzenia najczęściej występują w kontekście obsługi interfejsu graficznego użytkownika (GUI) przy pomocy myszy bądź klawiatury. Wyzwalaczem są wtedy obiekty interfejsu użytkownika, zdarzenia są z góry zdefiniowane w bibliotekach java.awt.* i javax.swing.* a słuchaczami są obiekty implementujące interfejsy nasłuchu. Zdarzenie Action / Event Źródło / wyzwalacz Action Trigger Słuchacz Action Listener
Klasy i obiekty słuchaczy Aby zdarzenia mogły zostać obsłużone, źródło zdarzenia musi zarejestrować obiekt będący słuchaczem. Słuchacz musi implementować interfejs nasłuchu odpowiedniego zdarzenia. W przypadku obsługi GUI, istnieje lista predefiniowanych zdarzeń i odpowiadających im interfejsów nasłuchu. Każdy z interfejsów posiada zestaw metod pozwalających na zareagowanie na zdarzenie. Zdarzenie Interfejs Metody ActionEvent ActionListener actionperformed KeyEvent KeyListener keypressed, keyreleased, keytyped FocusEvent FocusListener focusgained, focuslost ItemEvent ItemListener itemstatechanged
Klasy i obiekty słuchaczy Tworzymy obiekt słuchacza implementujący interfejs ActionListener metodę actionperformed. Klasa słuchacza class Sluchacz implements ActionListener { public void actionperformed(actionevent e) { System.out.println("Klik!"); Interfejs słuchacza zdarzeń typu Action Jedyna metoda interfejsu Zdarzenie przekazywane do ciała metody
Rejestracja słuchaczy Aby słuchacz mógł zareagować na zdarzenie należy do zarejestrować w pewnym obiekcie źródła. Aby obiekt mógł zostać źródłem zdarzenia musi generować zdarzenia oraz posiadać metodę rejestracji słuchacza. W pakiecie awt jest to zwykle metoda addnnnlistener gdzie NNN odpowiada za zanwę zdarzenia (Key, Mouse, Action, ) JButton b = new JButton("Przycisk"); Sluchacz s = new Sluchacz(); b.addactionlistener(s); Źródło Słuchacz Rejestracja słuchacza w źródle
Obsługa naciśnięcia przycisku Klasę przycisku można znaleźć zarówno w pakiecie awt jak i Swing. java.awt.button javax.swing.jbutton Aby wyświetlić przycisk trzeba stworzyć kontener (okno) w którym przycisk będzie się znajdował. class Test extends Frame { class Test extends JFrame { Tworzymy przycisk i dodajemy do okna. Button b = new Button( A"); add(b); JButton b = new JButton( B"); getcontentpane().add(b);
Obsługa naciśnięcia przycisku Tworzymy obiekt słuchacza i rejestrujemy go w przycisku Sluchacz s = new Sluchacz(); b.addactionlistener(s); Okno wyświetlamy po uprzednim dopasowaniu rozmiarów okna do rozmiarów komponentów w nim umieszczonych za pomocą metody pack(). pack(); setvisible(true);
Obsługa naciśnięcia przycisku - awt obsługa słuchacza class Test extends Frame { public static void main(string[] a){ new Test(); Test() { Button b = new Button("Przycisk"); add(b); Sluchacz s = new Sluchacz(); b.addactionlistener(s); pack(); setvisible(true); Klasa główna rozszerzająca Jframe okno z pakietu Swing Metoda main tylko konstruuje okno Konstruktor okna: tworzy i dodaje przycisk class Sluchacz implements ActionListener{ public void actionperformed(actionevent e) { System.out.println("Klik!"); Package test1
Obsługa naciśnięcia przycisku - Swing obsługa słuchacza class Test extends JFrame { public static void main(string[] a){ new Test(); Test() { JButton b = new JButton("Przycisk"); getcontentpane().add(b); Sluchacz s = new Sluchacz(); b.addactionlistener(s); pack(); setvisible(true); Klasa główna rozszerzająca Jframe okno z pakietu Swing Metoda main tylko konstruuje okno Konstruktor okna: tworzy i dodaje przycisk class Sluchacz implements ActionListener{ public void actionperformed(actionevent e) { System.out.println("Klik!"); Package test2
Obsługa naciśnięcia przycisku Ćwiczenie 1. Napisz program, który zliczy naciśnięcia przycisku.
Rozpoznanie obiektu zdarzenia Podczas obsługi zdarzenia można sprawdzać jaki obiekt je wywołał dzięki informacjom zawartym w obiekcie Event. class Sluchacz implements ActionListener{ public void actionperformed(actionevent e) { Object o = e.getsource(); System.out.println(e.paramString()); System.out.println(e.getActionCommand()); System.out.println( o.getclass() +"\n"+ o.tostring()); Informacje o obiekcie zdarzenia Napis na przycisku (polecenie wywołania) Pobranie obiektu wywołującego zdarzenie Informacje o zdarzeniu w postaci łańsucha znaków (zwykle do debugowania) Package test3
Zastosowanie klas anonimowych Jeżeli słuchacz jest rejestrowany tylko w jednym źródle, można zrezygnować z deklarowania osobnej klasy i zastosować klasę anonimową. Sluchacz s = new Sluchacz(); b.addactionlistener(s); class Sluchacz implements ActionListener{ public void actionperformed(actionevent e) { System.out.println("Klik!"); b.addactionlistener( new ActionListener(){ public void actionperformed(actionevent e) { System.out.println("Klik!"); ); Package test4
Rozpoznanie obiektu zdarzenia Napisz program, który będzie wyświetlał 3 przyciski. Po kliknięciu jednego przycisku należy go dezaktywować metodą setenabled( ) z klasy AbstractButton uaktywniając pozostałe. Ćwiczenie 2.
Zdarzenia semantyczne Zdarzenia można podzielić na dwa rodzaje: - niskiego poziomu wciśnięcie przycisku myszy, klawisza klawiatury, ruch myszy, ruch kółka, itd. oraz - wysokiego poziomu wciśnięcie przycisku GUI, zaznaczenie chceckboxa, przesunięcie suwaka, itd Zdarzenia wysokiego poziomu nazywane są semantycznymi ponieważ działania użytkownika odczytywane są w kontekście wyświetlanego na ekranie GUI.
Zdarzenia semantyczne Lista zdarzeń semantycznych pakietu awt Zdarzenie ActionEvent ItemEvent AdjustmentEvent opis pewna akcja wykonywana przez komponent zmiana wybranego elementu z komponentu wieloelementowego Wybrane zdarzenia semantyczne pakietu Swing Zdarzenie MenuEvent MenuKeyEvent TreeExpansionEvent TreeSelectionEvent ListSelectionEvent opis Zdarzenia wyboru menu Menu zostało aktywowane za pomocą klawiatury Drzewo zostało rozwinięte/zwinięte Zmienił się wybrany element drzewa. Zmiana na liście rozwijanej