Programowanie zdarzeniowe

Podobne dokumenty
Obsługa zdarzeń. Wykład 4

Programowanie zdarzeniowe

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Wykład 12: Obsługa Zdarzeń

Java SE Laboratorium nr 5. Temat: Obsługa zdarzeń

Marcin Luckner Warsaw University of Technology Faculty of Mathematics and Information Science

Podstawowe informacje o apletach

setdefaultcloseoperation(jframe.exit_on_close);//obsługa zamykania aplikacji setvisible(true); } //wyświetlenie okna

Java biblioteka Swing

GUI - projektowanie interfejsów cz. II

Języki i metody programowania Java Obsługa zdarzeń - przykłady

Programowanie graficznych interfejsów użytkownika

Kontenery i komponenty graficzne

Kurs programowania. Wykład 4. Wojciech Macyna. 23 marca 2016

POLIMORFIZM, INTERFEJSY, PROGRAMOWANIE ZDARZENIOWE

Java - interfejs graficzny

Programowanie w języku Java WYKŁAD

SWING. dr Jarosław Skaruz

LABORATORIUM 7 Cel: 1_1

Interfejs graczny w Javie.

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Tworzenie elementów graficznych

Programowanie obiektowe

Graphic User Interfaces pakiet Swing

Programowanie obiektowe

Programowanie Multimediów. Programowanie Multimediów JAVA. programowanie GUI. (AWT i Swing) [1]

Klasy abstrakcyjne. Klasę abstrakcyjną tworzymy przy pomocy modyfikatora abstract

Programowanie graficznych interfejsów uŝytkownika

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Dokumentacja do API Javy.

Programowanie Obiektowe GUI

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Języki Programowania II Wykład 7. Java Swing

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Programowanie komponentowe

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Programowanie obiektowe

Zakład Teoretycznych Podstaw Informatyki Instytut Matematyki i Informatyki Akademia Jana Długosza w Częstochowie

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

Programowanie w Javie Wykład 6 Okienka w Javie (AWT)

Aplikacja wielowątkowa prosty komunikator

Multimedia JAVA. Historia

Java Foundation Clases. Tworzenie graficznych interfejsów użytkownika (GUI) w Javie

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Laboratorium z informatyki sem. III/ćw. 2 Wydział Transportu PW /19 MATERIAŁY POMOCNICZE DO ĆWICZENIA 2

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Kurs programowania. Wykład 8. Wojciech Macyna

Współbieżność w środowisku Java

Informatyka i Ekonometria Programowanie komputerów Ćwiczenia Tworzenie aplikacji wykorzystaniem graficznego interfejsu użytkownika - Swing.

Applety Java. Applety są przykładem kodu Java wykonywanego po stronie klienta, ale bez ujawnionej (jak w przypadku skryptu) wersji źródłowej

Dodanie nowej formy do projektu polega na:

Scenariusz Lekcji. Część organizacyjna:

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Podstawy Swing. Tomasz Borzyszkowski

Programowanie graficznego interfejsu użytkownika. Wykład 8. Maciej Wołoszyn 10 maja 2006

Język obiektowy o składni podobnej do C++ Zarządzanie pamięcią niepotrzebne obiekty automatycznie usuwane

Programowanie obiektowe

Przykładowe roz wiązanie:

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Język Java część 2 (przykładowa aplikacja)

Architektura interfejsu użytkownika

1 Atrybuty i metody klasowe

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Tworzenie i obsługa graficznego interfejsu uŝytkownika

akademia androida Service, BroadcastReceiver, ContentProvider część IV

Podstawy Języka Java

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

Projektowanie aplikacji internetowych laboratorium

Programowanie Obiektowe Java

Programowanie zdarzeniowe

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Aplikacja wielow tkowa prosty komunikator

Interfejsy i klasy wewnętrzne

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Zastosowanie słuchaczy zdarzeń wg

Aplikacja (oprogramowanie) będzie umożliwiać przygotowanie, przeprowadzenie badania oraz analizę wyników według określonej metody.

Aplikacje w środowisku Java

Aplikacje w Javie- wykład 11 Wątki-podstawy

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Java Podstawy. Michał Bereta

Wizualne tworzenie aplikacji z wykorzystaniem

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Programowanie obiektowe zastosowanie języka Java SE

Budowa aplikacji wielowarstwowych. Obsługa zdarzeń

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

Pierwsze kroki. Algorytmy, niektóre zasady programowania, kompilacja, pierwszy program i jego struktura

Pierwsza ramka. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 10

Java niezbędnik programisty spotkanie nr 12. Graficzny interfejs użytkownika

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Wykład 8: klasy cz. 4

Programowanie zaawansowane

Transkrypt:

Programowanie zdarzeniowe III. Zaawansowana obsługa zdarzeń Małgorzata Prolejko ZDA JA16Z03

Plan Hierarchia zdarzeń Typy zdarzeń niskiego poziomu Zdarzenia okna Obsługa kliknięcia myszy Adaptery Zdarzenia dotyczące myszki Zdarzenia klawiatury Multicasting Kolejka zdarzeń

Hierarchia zdarzeń Event Object AWT Event Action E Adjustment E Component E Item E Focus E Input E Paint E Window E Key E Mouse E MouseWheel E

Typy zdarzeń niskiego poziomu Zdarzenia niskiego poziomu to te, które dziedziczą po ComponentEvent. Zdarzenie FocusEvent PaintEvent WindowEvent InputEvent KeyEvent MouseEvent MouseWheelEvent Zdarzenie dotyczące fokusu Zdarzenie informujące o potrzebie odmalowania komponentu Zdarzenia okna Zdarzenia urządzeń wejścia Zdarzenia klawiatury Zdarzenia myszki Zdarzenia kółka myszki Źródłami tych zdarzeń mogą być dowolne komponenty GUI.

Zdarzenia okna Zdefiniowane są trzy interfejsy nasłuchu zdarzeń okna: WindowFocusListener słuchacz zdarzeń fokusu okna WINDOW_GAINED_FOCUS okno zyskało fokus (bycie aktywnym) windowgainedfocus WINDOW_LOST_FOCUS okno straciło fokus windowlostfocus WindowListener słuchacz zdarzeń widoczności okna WINDOW_ACTIVATED - okno aktywowano windowactivated WINDOW_DEACTIVATED okno dezaktywowano windowdeactivated WINDOW_ICONIFIED okno zminimalizowano windowiconified WINDOW_DEICONIFIED okno przywrócono windowdeiconified WINDOW_OPENED okno zostało otwarte windowopened WINDOW_CLOSING okno zostanie zamknięte windowclosin WINDOW_CLOSED okno zostało zamknięte windowclosed WindowStateListener słuchacz zdarzeń stanu okna WINDOW_STATE_CHANGED stan okna się zmienił - windowstatechanged

Zdarzenia okna Podstawowe działanie i odmalowywanie ramki okna JFrame jest już wstępnie zaimplementowane. Można jednak wybrać jedną z predefiniowanych operacji, która zostanie wykonana podczas zamykania okna. Metoda setdefaultcloseoperation przyjmuje jeden z wcześniej zadeklarowanych parametrów zdefiniowanych w WindowConstants: DO_NOTHING_ON_CLOSE : Nic nie robi, a operacja zamknięcia obsługiwana jest tylko przez odpowiednią implementację zdarzenia windowclosing HIDE_ON_CLOSE : tylko chowa ramkę DISPOSE_ON_CLOSE : chowa i niszczy ramkę (ale nie kończy działania aplikacji) EXIT_ON_CLOSE : Zamyka aplikację. setdefaultcloseoperation(windowconstants.exit_on_close);

Obsługa kliknięcia myszy Jeżeli interesuje nas fizyczne kliknięcie, a nie obsługa przycisku lub elementu GUI, należy zaimplementować zdarzenie niskiego poziomu dotyczące myszki MouseEvent. Interfejs słuchacza tego zdarzenia zawiera pięć metod: mousepressed klawisz myszki został wciśnięty mousereleased klawisz myszki został zwolniony mouseclicked nastąpiło kliknięcie: wciśnięcie i zwolnienie przycisku w tym samym miejscu ekranu mouseentered kursor najechał na element mouseexited kursor opuścił element Źródłem tego zdarzenia, tak jak i innych niskopoziomowych mogą być dowolne komponenty GUI np. JButton, lub JPanel.

Obsługa kliknięcia myszy b.addmouselistener(new MouseListener(){ public void mouseclicked(mouseevent e) { System.out.println("klik " + e.getclickcount() + " raz"); public void mouseentered(mouseevent e) { System.out.println("wejście - wsp. el :x=["+ e.getx()+";"+e.gety()+"]"); public void mouseexited(mouseevent e) { System.out.println("zejście - wsp X ekranu: x=["+ e.getxonscreen()+"]"); public void mousepressed(mouseevent e) { System.out.println("wciśnięcie przycisku w punkcie "+ e.getpoint().tostring()); public void mousereleased(mouseevent e) { System.out.println("puszczenie przycisku"); ); Package test5

Adaptery Wykorzystanie interfejsu słuchacza wymaga od programisty zaimplementowania wszystkich metod jakie ten interfejs deklaruje. Czasami chcemy obsłużyć tylko jedną z metod (np. mouseclicked). W takim przypadku pozostałe implementacje będą puste. b.addmouselistener(new MouseListener(){ public void mouseclicked(mouseevent e) { System.out.println("klik " + e.getclickcount() + " raz"); ); public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) {

Adaptery Aby zapobiec pustym implementacjom i co za tym idzie nadmiernemu kodowi, wprowadzono klasy adaptacyjne. Są to klasy implementujące interfejsy słuchaczy, ale z samymi pustymi ciałami metod. class MouseAdapter implements MouseListener{ public void mouseclicked(mouseevent e) { public void mouseentered(mouseevent e) { public void mouseexited(mouseevent e) { public void mousepressed(mouseevent e) { public void mousereleased(mouseevent e) { ); Teraz skonstruowanie słuchacza z obsłużoną jedną metodą będzie wymagało jedynie przeładowania tej metody. b.addmouselistener(new MouseAdapter(){ public void mouseclicked(mouseevent e) {System.out.println("klik); ); Package test6

Adaptery Klasy adaptacyjne zostały zaimplementowane dla siedmiu słuchaczy (tych, które mają więcej niż jedną metodę). ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter implements ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener

Zdarzenia dotyczące myszki Zdarzeniom myszki przypisane są trzy rodzaje słuchaczy: MouseListener, MouseMotionListener oraz MouseWheelListener. MouseListener MouseMotionListener MouseWheelListener mouseclicked mousemoved mousewheelmoved mouseentered mouseexited mousepressed mousereleased mousedragged Klasa MouseEvent posiada metody zwracające pozycję kursora na ekranie bądź na elemencie, numer wciśniętego przycisku myszy, liczbę kliknięć. int getxonscreen() int getyonscreen() Point getlocationonscreen() int getx() int gety() Point getpoint() int getbutton() int getclickcount()

Zdarzenia klawiatury Zdarzeniom klawiatury przypisany jest tylko jeden słuchacz: KeyListener. KeyListener keytyped keypressed keyreleased Pojawia się kiedy wpisano zdefiniowaną kombinację znaków Wciśnięcie klawisza Puszczenie klawisza Klasa KeyEvent posiada metody pozwalające na sprawdzenie jakiego rodzaju klawisz został wciśnięty. getextendedkeycode() getkeychar() getkeycode() isactionkey() zwraca rozszerzony kod zdarzenia zwraca znak klawisza zwraca kod klawisza sprawdza czy klawisz jest funkcyjny

Zdarzenia wejścia Zdarzenia wejścia dotyczą zarówno myszki jak i klawiatury. Przechowywane są w ich nadklasie InputEvents. Metody tej nadklasy pozwalają na sprawdzenie wystąpienia wciśniętych klawiszy funkcyjnych consume() zużywa zdarzenie zapobiegając jego propagacji dalej isconsumed() sprawdza czy zdarzenie zostało zużyte getmodifiers()- zwraca rozszerzoną maskę modyfikatorów wciśniętych podczas wystąpienia zdarzenia getmodifiersex() zwraca rozszerzoną maskę modyfikatorów getwhen() zwraca czas w ms od początku epoki kiedy nastąpiło zdarzenie isaltdown() isaltgraphdown() iscontroldown() ismetadown() isshiftdown()

Multicasting Istnieje czasem potrzeba wykonania pewnych akcji równocześnie na wielu komponentach, gdy zdarzenie wystąpi na jednym z nich. Np. zamknięcie wszystkich okien jednym przyciskiem. Kiedy jedno zdarzenie wysyłane jest wielu słuchaczom, mówimy o multicastingu. Słuchacze rejestrowani są w źródle i umieszczani na liście słuchaczy. Gdy następuje zdarzenie, każdy słuchacz z listy zostaje o nim poinformowany. Sluchacz s1 = new Sluchacz(); Sluchacz s2 = new Sluchacz(); Sluchacz s3 = new Sluchacz(); trzy różne obiekty słuchaczy Zrodlo z = new Zrodlo(); z.dodajsluchacza(s1); z.dodajsluchacza(s2); z.dodajsluchacza(s3); jedno źródło zdarzenia rejestracja każdego ze słuchaczy

Multicasting JButton jb1 = new JButton("Poszerz"); JButton jb2 = new JButton("Zwęź"); ActionListener slposzerz1 = new ActionListener(){ @Override public void actionperformed(actionevent e) { jb1.setsize(jb1.getwidth()+10,jb1.getheight()); ; ActionListener slposzerz2 = new ActionListener(){ @Override public void actionperformed(actionevent e) { jb2.setsize(jb2.getwidth()+20,jb2.getheight()); ; jb1.addactionlistener(slposzerz1); jb1.addactionlistener(slposzerz2); Package test6 dwa różne obiekty słuchaczy jedno źródło zdarzenia rejestracja każdego ze słuchaczy

Kolejka zdarzeń W bibliotece AWT zaimplementowano kolejkę zdarzeń dla komponentów z niej korzystających. Gdy jakieś zdarzenie ma miejsce, zostaje wstawione do kolejki i oczekuje na przetworzenie void postevent(awtevent). Następnie narzędzie obsługujące kolejkę pobiera zdarzenie AWTEvent getnextevent(), znajduje jego słuchaczy i wywołuje odpowiednią metodę obsługi zdarzenia u słuchacza. Można także zdarzenie w kolejce podejrzeć (bez usuwania go z kolejki) metodą AWTEvent peekevent(). Ponieważ niektóre zdarzenia zdarzają się bardzo często, ale są krótkie(jak poruszenia myszką) a inne wymagają dłuższego czasu na wykonanie(np. odmalowywanie komponentów), narzędzie AWT może dzielić i łączyć zadania tak, by optymalizować czas i zasoby procesora.

Główna kolejka zdarzeń Główna Kolejka Zdarzeń (wątek dystrybucji zdarzeń, Event Dispatch Thread EDT) zajmuje się synchronizacją wątków i zdarzeń. Aby dobrze obsługiwać zdarzenia GUI program powinien tworzyć własny wątek dodany do tej kolejki. public static void main(string[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run(){... ); kod programu, który zwykle był w main ie Własne zdarzenia także muszą być wygenerowane i wstawione do kolejki w osobnym wątku.