Laboratorium z informatyki sem. II/ćw. 11 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 1
M
ATERIAŁY POMOCNICZE DO ĆWICZENIA11 Interfejsy
Komponenty Swing generują zdarzenia. Generowane są one za każdym razem, kiedy użytkownik używa klawiatury bądź myszki. Każdy obiekt może być informowany o takich zdarzeniach. Jedyne, co trzeba w tym kierunku zrobić, to wyposażyć obiekt w odpowiedni interfejs i zarejestrować go jako słuchacza zdarzeń pochodzących od konkretnego źródła.
Interfejsy stanowią mechanizm interakcji między niepowiązanymi wzajemnie obiektami różnych klas.
Interfejs to nazwany zbiór metod. Klasa może implementować interfejs, czyli zawarte w nim metody, odpowiednio do jej specyfiki. Dzięki takiemu rozwiązaniu różne klasy mogą w indywidualny sposób realizować metody, które z zewnątrz są dostępne w sposób jednorodny, tj. za pośrednictwem nagłówka określonego w definicji interfejsu.
• Interfejs definiuje zbiór (kolekcję) publicznych metod, zwykle powiązanych tematycznie i realizujących określoną funkcjonalność. W definicji interfejsu mogą ponadto występować stałe statyczne.
• Interfejs zawiera same nagłówki (sygnatury) definiowanych w nim metod abstrakcyjnych. Klasa implementująca interfejs musi zaimplementować wszystkie jego metody, albo będzie klasą abstrakcyjną.
• Nazwa interfejsu poprzedzona słowem kluczowym implements występuje na końcu nagłówka klasy, która go implementuje, po ewentualnej specyfikacji klasy nadrzędnej, np.:
public classMysz extends JFrameimplements MouseListener
• Klasa może dziedziczyć tylko z jednej klasy, natomiast może implementować wiele interfejsów.
Wówczas ich nazwy, po słowie kluczowym implements, są oddzielone przecinkami.
public classSkoczek extends JFrame implements ActionListener, MouseListener
Interfejsy na równi z klasami mogą być organizowane w pakiety oraz tworzyć hierarchie dziedziczenia.
W ćwiczeniu zastosowaliśmy interfejs MouseListenerdo obsługi zdarzeń myszy oraz
ActionListener do obsługi akcji zegara
Interfejs MouseListener i klasa MouseEvent
Poniżej zamieszczono definicję wykorzystanego w ćwiczeniu interfejsu MouseListener, który zawiera metody obsługujące zdarzenia myszy. Interfejs MouseListener należy do pakietu Javy java.awt.event oraz dziedziczy od zdefiniowanego w pakiecie java.util (pustego) interfejsu EventListener.
public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e); //kliknięcie myszą
public void mousePressed(MouseEvent e); //naciśnięcie przycisku myszy public void mouseReleased(MouseEvent e); //zwolnienie przycisku myszy public void mouseEntered(MouseEvent e); //nasunięcie kursora myszy public void mouseExited(MouseEvent e); //wycofanie kursora myszy }
Parametrem każdej z powyższych metod jest obiekt klasy MouseEvent, reprezentujący zdarzenie związane z użyciem myszy. Aby w naszej aplikacji sprawdzić, który przycisk myszy został wciśnięty i czy jednocześnie jest wciśnięty klawisz specjalny, wykorzystaliśmy następujące pola i metody klasy MouseEvent:
public static final int BUTTON1 – pole oznaczające lewy przycisk myszy (button#1)
podobnie pola
BUTTON2i
BUTTON3oznaczają przycisk środkowy i prawy
public int getButton() - metoda zwracająca informację, który przycisk wystąpił w zdarzeniu
public int getX()- metoda zwracająca współrzędną x położenia kursora myszy
public int getY()- metoda zwracająca współrzędną y położenia kursora myszy
public boolean isControlDown()- metoda zwracająca wartość true, gdy wciśnięty jest klawisz <Ctrl>, w przeciwnym przypadku metoda zwraca wartość false.
analogicznie metody isAltDown() i isShiftDown()dotyczą klawiszy <Alt> i <Shift>
Metoda addMouseListener() klasy java.awt.Component
Aby móc przechwytywać zdarzenia myszy musimy najpierw dodać do komponentu nasłuchującego odpowiedniego słuchacza, za pomocą metodyaddMouseListener, podając jako parametr klasę implementującą to zdarzenie. W aplikacji Mysz dodaliśmy nasłuch na obiekty tej klasy, wywołując w jej konstruktorze, metodę addMouseListener(this) , gdzie parametr this oznacza w tym przypadku klasę Mysz (która implementowała interfejs MouseListener
)
Tożsamość obiektu; słowo kluczowe
thisLaboratorium z informatyki sem. II/ćw. 11 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 2
Jeśli podczas tworzenia definicji klasy chcemy odwołać się w metodzie do bieżącego obiektu tej klasy, na rzecz którego metoda będzie wywołana, należy w miejsce nazwy obiektu zastosować słowo kluczowe this.
Interfejs ActionListener
Obsługuje zdarzenia generowanego przez obiekt klasy
Timer l
ub generowane przez użytkownika aplikacji na rzecz danego składnika interfejsu (np. klikniecie przycisku)..Posiada tylko jedną metodę abstrakcyjną actionPerformed(), zdefiniowaną następująco:public void actionPerformed(ActionEvent e){ }
Animacja
W dotychczas opracowanych przykładach grafiki w Javie wykorzystywaliśmy metodę rysowania paint() Aby przerysować dany składnik należy wywołać metodę repaint(), która aktualizuje obszar rysowania.
Tworząc animację należy umożliwić metodzie paint() rysowanie nowej zawartości grafiki w określonych odstępach czasu. W aplikacjach typu Swing zalecane jest sterowanie animacją za pomocą obiektu klasy Timer , który
w określonych, zadanych odstępach czasu generuje automatyczne wywołania metody actionPerformed( ) i to właśnie w tej metodzie wywołujemy metodę repaint()
Klasa Timer pakietu javax.swing
Klasa Timer umożliwia programowe generowanie zdarzeń w określonych odstępach czasu. Klasa, która ma te zdarzenia obsługiwać powinna implementować interfejs ActionListener i zawierać metodę actionPerformed().
Konstruktor klasy Timer ma postać:
• Timer(int dt, ActionListener a) - tworzy nowy obiekt i ustawia odstęp między generowanymi zdarzeniami na dt( w milisekundach). Parametr a oznacza obiekt nasłuchujący akcji timera, może mieć wartość null. Jeśli obsługa akcji jest realizowana w klasie zawierającej timer, to parametr ma wartość this
Podstawowymi metodami klasy Timer są:
• setDelay(int dt)– ustawia wartość odstępu czasu między zdarzeniami generowanymi przez timer dt – odstęp czasu w milisekundach
• start()– uruchamia generowanie zdarzeń
• stop()– zatrzymuje generowanie zdarzeń
• restart() – wznawia generowanie zdarzeń
Ikony, klasa Icon i ImageIcon
Ikona jest obiektem graficznym niewielkich rozmiarów, który można umieszczać np. na przyciskach lub poleceniach menu. Do wczytywania grafiki z pliku wykorzystuje się klasę ImageIcon. Klasa ta ma kilka konstruktorów, których parametry określają lokalizację lub nazwę pliku graficznego.
Przykład:
ImageIcon ic =new ImageIcon("T1.gif")
Instrukcja ta tworzy obiekt ic klasy ImageIcon i przypisuje mu grafikę załadowaną z pliku T1.gif Ponieważ nie jest określona ścieżka dostępu, plik powinien znajdować się w folderze projektu.