Mariusz Chmielewski - ISI WAT
1
kpt. mgr inż. Mariusz Chmielewski
Instytut Systemów Informatycznych
Wydział Cybernetyki
Wojskowa Akademia Techniczna
Programowanie zdarzeniowe
Wstęp
Plan wykładu
Plan wykładu
• Wprowadzenie do modelu programowania
zdarzeniowego
• Charakterystyka filozofia budowa GUI w technologii
JAVA
– Wprowadzenie do technologii Applet’ów Java
– Charakterystyka AWT
– Charakterystyka JFC - Swing
– Przegląd komponentów graficznych biblioteki
– Model obsługi zdarzeń – specyfika modelu
delegacji zdarzeń
– Zarządzanie komponentami
– Modyfikacje komponentów
• Przykłady kodów programowych
Mariusz Chmielewski - ISI WAT
2
Sterowanie wykonaniem programu
Sterowanie wykonaniem programu
• W jednoprocesowych architekturach w jednej
chwili obsługiwany był tylko jeden program;
• Sterowanie wykonaniem programu odbywa się
przez:
– jawne deklarowanie kolejności wykonania instrukcji
(działania) – program wsadowy lub jednoprzebiegowy;
– interaktywną pętlę obsługi menu (wybór opcji);
• Architektury wieloprocesowe pozwalają na:
– systemową pętlę obsługi zdarzeń i delegację modelu
obsługi zdarzeń – specyficzną dla wybranej technologii
wytwarzania oprogramowania:
• Java – AWT – SWING – SWT
• C++ (VC++ - Borland C++)
• C#
• Visual Basic;
Mariusz Chmielewski - ISI WAT
3
Pętla obsługi wyboru opcji –
Pętla obsługi wyboru opcji –
program
program
wykorzystujący konsolę
wykorzystujący konsolę
Mariusz Chmielewski - ISI WAT
4
PoczątekProgramu
WyświetlMenu(
"1.Faktura",
"2.Dodaj klienta",
"3.Indeksacja bazy",
"4.Koniec pracy")
AktywnaOpcja=1
PowtarzajPętlę:
PodświetlMenu(AktywnaOpcja)
PobierzDaneZKlawiatury(Znak)
Jeżeli (Znak=Enter)
wtedy WybierzAkcję(AktywnaOpcja):
1:
WystawFakturę
2:
DodajNowegoKlienta
3:
IndeksujBazęDanych
4:
PrzerwijPętlę
KoniecWyboruAkcji
Jeżeli (Znak=(Strzałka,Home,End,PgUp,PgDn))
wtedy ZmieńAktywnąOpcję(AktywnaOpcja,Znak)
KoniecPętli
KoniecProgramu
Pętla obsługi wyboru opcji – model
Pętla obsługi wyboru opcji – model
zdarzeniowy
zdarzeniowy
Mariusz Chmielewski - ISI WAT
5
PoczątekProgramu
ZaładujProceduryObsługiZdarzeńDoPamięci(
WystawFakturę,
DodajNowegoKlienta,
IndeksujBazęDanych
)
DodajDoSystemuMenu(
"1.Faktura",
"2.Dodaj klienta",
"3.Indeksacja bazy",
"4.Koniec pracy")
ZdefiniujPrzypisanieZdarzeńDoProcedur(
NaZdarzenie
WybranoOpcjęFaktura
reaguj:
WystawFakturę
NaZdarzenie
WybranoOpcjęDodajKlienta
reaguj:
DodajNowegoKlienta
NaZdarzenie
WybranoOpcjęReindeksacja
reaguj:
IndeksujBazęDanych
NaZdarzenie
WybranoOpcjęKoniecPracy
reaguj:
(
UsuńZPamięciProceduryObsługiZdarzeń,
UsuńDefinicjePrzypisaniaObsługiZdarzeńTegoProgramu,
PrzekażSterowanieSystemowiOperacyjnemu
)
)
PrzekażSterowanieSystemowiOperacyjnemu
KoniecProgramu
Model programowania zdarzeniowego
Model programowania zdarzeniowego
• Podstawowe cechy modelu delegacji obsługi zdarzeń:
– Brak jawnej pętli obsługi zdarzeń (ODSTĘPSTWO SWT !);
– Rozdział zdarzeń realizowany przez system operacyjny;
– Konwersja zdarzeń sprzętowych (od urządzeń
zewnętrznych, np. klawiatura, mysz) na zdarzenia typu
znaczeniowego (np. "wybrano opcję menu” itd.);
– Obsługa menu (zmiana wyglądu i przejście między jego
opcjami) jest realizowane niejawnie przez system
operacyjny;
• Programowanie obiektowe wspiera model sterowania
zdarzeniami:
– po zdarzeniu system deleguje obsługę do wskazanego
obiektu;
– dotyczy to obecnie wszystkich języków programowania a w
nich także programowania GUI;
Mariusz Chmielewski - ISI WAT
6
Model MVC – Model View Controller
Model MVC – Model View Controller
Mariusz Chmielewski - ISI WAT
7
Aplikacja
• Składowe logiczne trójwarstwowej
architektury MVC:
Warstwa
prezentacji
Warstwa
logiki aplikacji (usługi)
Serwer
web’owy
Serwer
aplikacji
View
Model
Controller
Warstwa
danych
Controller
÷ przetwarzanie żądań klienta;
÷ wiązanie ‘Model’ z „View’;
Model
÷ logika usług;
÷ przygotowanie danych (dostęp do bazy);
View
÷ prezentacja sformatowanych danych po stronie
użytkownika (także applety Java, HTML, JSP);
Kompozyt (Composite) – Wzorce
Kompozyt (Composite) – Wzorce
projektowe
projektowe
• System złożony z podsystemów o
strukturze drzewiastej ( reprezentacja
związku „całość-część”);
• Wspólny interfejs dla klas węzłów i liści –
ujednolicone widzenie kontenerów i
obiektów składowanych;
• Łatwo rozszerzalny o nowe podsystemy
implementujące (określony interfejs);
• Kompozyt -> buduje hierarchię z
obiektów prostych i złożonych
• Przykłady:
– Przykład w bibliotekach Javy: kontenery (JPanel,
JComponent, JFrame, JDesktopPane …, );
Mariusz Chmielewski - ISI WAT
8
Kompozyt (Composite) – Wzorce
Kompozyt (Composite) – Wzorce
projektowe
projektowe
• Adapter Definicja
Przeznaczenie
Wzorzec przekształca interfejs klasy w taki, jakiego klienci oczekują.
Dzięki Adapterowi klasy mogą współpracować, co bez niego nie byłoby
możliwe, ponieważ mają niezgodne interfejsy.
• Przykład
Dołączenie istniejącej rejestracji do grup do nowego modelu jej obsługi.
• Stosowalność
• chcemy wykorzystać istniejącą klasę, a jej interfejs nie odpowiada
temu, którego potrzebujemy;
• chcemy utworzyć klasę wielokrotnego użytku, która współpracuje z
niepowiązanymi ze sobą lub nieprzewidzianymi klasami, to znaczy
takimi, które niekoniecznie mają zgodne interfejsy;
• (tylko adapter obiektów) potrzebujemy użyć kilku istniejących
podklas, ale zaadaptowanie ich interfejsów przez tworzenie ich podklas
jest niepraktyczne; adapter obiektów może adaptować interfejs swojej
nadklasy.
Mariusz Chmielewski - ISI WAT
9
Kompozyt (Composite)
Kompozyt (Composite)
• Uczestnicy wzorca
– Component
• Definiuje interfejsy: dla klasy Client oraz dla węzłów i
liści składowych;
• Implementuje domyślne zachowanie;
– Leaf
• Definiuje zachowanie „prymitywów”;
• Nie ma potomków;
– Composite
• Implementuje zachowanie złożonych obiektów;
• Posiada potomków;
– Client
• współpracuje z obiektami kompozycji poprzez interfejs
Component;
Mariusz Chmielewski - ISI WAT
10
Kompozyt (Composite)
Kompozyt (Composite)
Mariusz Chmielewski - ISI WAT
11
Kompozyt (Composite) - warianty
Kompozyt (Composite) - warianty
Mariusz Chmielewski - ISI WAT
12
Kompozyt (Composite) - warianty
Kompozyt (Composite) - warianty
• Konsekwencje adaptera klas
• adaptuje Adaptowanego do Celu, ale nie będzie
działał na podklasy Adaptowanego;
• umożliwia Adapterowi przedefiniowanie części
zachowania Adaptowanego;
• wprowadza tylko jeden obiekt, aby dostać się do
Adaptowanego.
• Konsekwencje adaptera obiektów
• umożliwia jednemu Adapterowi działanie z
wieloma Adaptowanymi, w tym z wszystkimi
podklasami Adaptowanego;
• utrudnia przedefiniowywanie zachowania
Adaptowanego.
Mariusz Chmielewski - ISI WAT
13
Java 2 SE - Architektura
Java 2 SE - Architektura
Mariusz Chmielewski - ISI WAT
14
Abstarct Widget Toolkit
Abstarct Widget Toolkit
• Pierwsza, prymitywna biblioteka graficzna środowiska Java
dedykowana technologii apletów;
• AWT to komponenty
heavyweight
– Obiekty GUI w AWT wykorzystują komponenty systemu operacyjny;
– System operacyjny przejmuje na siebie mechanzimy renderowania
komponentów graficznych;
– np. w Windows przycisk w Java AWT jest implementowany przez
przycisk Windows‘a;
– Wygląd komponentów zależy od platformy i w odróżnieniu od
SWING nie udostępnia PLAF;
• W starych programach Java stosowano komponenty AWT;
– Swing jest sukcesorem AWT;
– NIGDY nie mieszamy
Swing i AWT w jednym programie;
• Składowe AWT są wciąż stosowane, np.
layout managers +
iterfejsy obsługi zdarzeń
Mariusz Chmielewski - ISI WAT
15
Java Foundation Classes - Swing
Java Foundation Classes - Swing
─ Swing jest częścią
Java Foundation Classes
(JFC)
– 18 publicznych pakietów, ponad 300 klas;
─ Od wersji 1.3 standardowy komponent środowiska
uruchomieniowego - udostępniane z JRE (javax.swing.*)
─ Wygląd niezależny od platformy operacyjnej – ujednolicony
Metal PLAF;
─ Swing wspiera komponenty
lightweight
– Rysowanie w obszarze zarządzanym przez Java;
– Funkcjonalność GUI zaimplementowana w Java – Mechanizmy
JVM są odpowiedzialne za renderowanie komponentów
graficznych;
─ Poprzednio mało wydajny (polepszone od Java 1.4)
─ Biblioteka jest bogatym zbiorem wzorców projektowych
szczególnie wartościowym z punktu widzenia inżynierii
oprogramowania;
Mariusz Chmielewski - ISI WAT
16
javax.accessibility
javax.swing.plaf
javax.swing.text
javax.swing
javax.swing.plaf.basic
javax.swing.text.html
javax.swing.border
javax.swing.plaf.metal
javax.swing.text.html.par
ser
javax.swing.colorchooser
javax.swing.plaf.multi
javax.swing.text.rtf
javax.swing.event
javax.swing.plaf.synth
javax.swing.tree
javax.swing.filechooser
javax.swing.table
javax.swing.undo
Zasady SWING – AWT ?
Zasady SWING – AWT ?
• Komponenty Swinga nie mogą być łączone w ramach
budowanych aplikacji z komponentami AWT.
• Komponenty AWT są komponentami, które
bezpośrednio wykorzystują właściwości platformy dla
której zostały zaimplementowane.
• Swing w odróżnieniu od innych technologii nie
wykorzystuje wsparcia systemu operacyjnego i sam
od podstaw implementuje mechanizmy wyświetlania
stąd uniezależnia się od platformy jednak również tym
samym nie korzysta z jej akceleracji graficznej.
• Jest to w głównej mierze powód dla którego
komponenty JFC w trakcie uruchamiania aplikacji
powodują zauważalne opóźnienie jak również są mniej
wydajniejsze niż komponenty platformy systemowej.
Mariusz Chmielewski - ISI WAT
17
Zasady SWING – AWT ?
Zasady SWING – AWT ?
• Mieszanie komponentów Swing i AWT jest
możliwe jednak wymaga odpowiedniego
budowania aplikacji.
• W takim przypadku należy zapewnić by aplikacja
graficzna w żadnym momencie nie dopuszczała
egzystowania komponentów Swing na tle
komponentów AWT.
• Taka sytuacja nie spowoduje błędu aplikacji
jednak uzyskamy efekt nakładania komponentu
– Komponent AWT
– Komponent Swing – JInternalFrame
– Obszar komponentu błędnie odrysowany
– AWT na część komponentu Swing.
Mariusz Chmielewski - ISI WAT
18
Zasady SWING – AWT ?
Zasady SWING – AWT ?
Mariusz Chmielewski - ISI WAT
19
Kompone
nt AWT
Komponent
Swing –
JInternalFrame
Obszar
komponentu
błędnie
odrysowany
SWT (Standard Widget Toolkit)
SWT (Standard Widget Toolkit)
•
SWT jest biblioteką graficzną dla środowiska
Java, stanowiącą alternatywę dla
standardowych bibliotek Javy: AWT i Swing;
•
Jest rozwijana na zasadach open source przez
Fundację Eclipse;
•
Zależna od platformy (są implementacje dla
większości platform);
•
Używa natywnych kontrolek systemowych (JNI) -
Widgets;
•
Tylko komponenty, które nie są wspierane przez
dany system operacyjny zaimplementowane;
•
Biblioteka wyższego poziomu – JFace (edytory w
oknie Eclipse);
Mariusz Chmielewski - ISI WAT
20
Swing
Swing
Mariusz Chmielewski - ISI WAT
21
Struktura SWING - Główne Komponenty
Struktura SWING - Główne Komponenty
Mariusz Chmielewski - ISI WAT
22
SWT
SWT
Mariusz Chmielewski - ISI WAT
23
• Etapy tworzenia GUI w Java:
– 1. Deklaracja kontrolek GUI (
controls
);
– 2. Implementacja obsługi zdarzeń (
event
handlers
) – interakcje przekazywanie
zdarzeń między komponentami;
– 3. Ułożenie kontrolek na ekranie przez
obiekty:
layout managers
i/lub
containers
– wykorzystanie gotowych komponentów,
konfiguracja LM, budowa własnego LM.
– 4? Modyfikacja PLAF
Mariusz Chmielewski - ISI WAT
24
Kontenery najwyższego poziomu
Kontenery najwyższego poziomu
• Kontrolka (
Control
):
–
kontrolka to komponent GUI:, np. przycisk, suwak;
–
nazywane widgets (window gadget), np. w systemie
UNIX
• Kontener (
Container
):
–
grupuje kontrolki i inne kontenery;
–
umożliwia grupowe zarządzanie (np. przesunięcie,
ukrywanie)
–
każdy program napisany ze Swing musi posiadać
przynajmniej jeden kontener najwyższego poziomu:
• JFrame ( pojedyncze okno aplikacji)
• JDialog (okienko dialogowe)
• JApplet (dla apletów)
Mariusz Chmielewski - ISI WAT
25
• Swing wyróżnia 6 kategorii kontrolek:
– podstawowe (basic controls)
– nieedytowalne (uneditable displays)
– edytowalne (editable displays)
– obszarowe (space-saving containers)
– kontenery najwyższego poziomu (top-
level containers)
– pozostałe (other containers)
Mariusz Chmielewski - ISI WAT
26
Podstawowe kontrolki - komponenty
Podstawowe kontrolki - komponenty
• Control
Swing Class Name
– button
JButton
,
JCheckBox
,
JRadioButton
– combo box
JComboBox
– list
JList
– menu
JMenu, JMenuBar, JMenuItem
– slider
JSlider
– toolbar
JToolbar
– text field
JTextField
, JPasswordField
Mariusz Chmielewski - ISI WAT
27
Podstawowe kontrolki - komponenty
Podstawowe kontrolki - komponenty
Mariusz Chmielewski - ISI WAT
28
• Control
Swing Class Name
– button
JButton
,
JCheckBox
,
JRadioButton
– combo box
JComboBox
– list
JList
– menu
JMenu, JMenuBar,
JMenuItem
– slider
JSlider
– toolbar
JToolbar
– text field
JTextField
,
JPasswordField
Obsługa zdarzeń (akcji)
Obsługa zdarzeń (akcji)
• Obsługa zdarzeń oparta jest na wzorcu
Observer/Listener
;
• Każdy komponent może być obserwowany
przez wielu obserwatorów;
• Każdy komponent może obsługiwać wiele
typów słuchaczy (np. zdarzenia obsługi
myszy, klawiatury, zmiany struktury itd.);
• Metody obsługi zdarzeń są wywoływane
automatycznie po zajściu zdarzenia;
• Komponent musi rejestrować obiekt
odpowiedzialny za obsługę zdarzeń;
Mariusz Chmielewski - ISI WAT
29
Obserwator (Observer - Listener)
Obserwator (Observer - Listener)
• Ciągłe odpytywanie o stan obiektu prowadzi
do znacznego spadku wydajności aplikacji;
• Obserwator (Observer) przechowuje
informację o stanie lub reaguje na zmianę
stanu innych obiektów;
• Luźne powiązanie z określonym obiektem;
• Może być kilku obserwatorów jednego
obiektu: relacja obiektów 1:N;
• Wybrany obiekt powiadamia
zainteresowanych o zmianie swojego stanu;
• Przykłady użycia:
– obsługa zdarzeń w okienkach,
– synchronizacja modelu z widokiem;
Mariusz Chmielewski - ISI WAT
30
Obserwator (Observer - Listener)
Obserwator (Observer - Listener)
• Uczestnicy
– Subject
• Posiada referencje do obiektów Observer;
• Interfejs operacji dołączania i odłączania obiektów
Observer;
– Observer
• Definiuje interfejs metody aktualizującej;
– Concrete Subject
• Przechowuje stan interesujący konkretny obiekt Observator;
• wysyła powiadomienia obiektom Observer;
– Concrete Observer
• przechowuje referencję do Concrete Subject;
• aktualizuje swój stan razem ze stanem obiektu Concrete
Subject;
Mariusz Chmielewski - ISI WAT
31
Obserwator (Observer - Listener)
Obserwator (Observer - Listener)
Mariusz Chmielewski - ISI WAT
32
interface Observer {
public void update( Oservable obs, Object
arg );
}
interface Observer {
public void update( Oservable obs, Object
arg );
}
Mariusz Chmielewski - ISI WAT
33
Program z GUI
Klasa implementująca
klasę listener’a
Zdarzenie (event)
Metoda
obsługi zdarzenia
Typowa akcja
to „update” danych
• Deklaracja zakresu nasłuchiwania – interfejs słuchacza
(listener);
• Klasy zdarzeń (komunikatów):
XXXEvent
• Klasy (interfejsy) nasłuchiwaczy:
XXXListener
• Powiązanie komponentu GUI z obiektem słuchacza -
rejestracja;
•
addXXXListener, removeXXXListener
• Implementacja metod obsługi zdarzeń zgodnie z
deklaracją;
•JRE automatycznie wywołuje metody obsługi zdarzeń;
Obsługa zdarzeń (akcji)
Obsługa zdarzeń (akcji)
• 10 podstawowych klas słuchaczy
(Listener):
– ActionListener
– ItemListener
– MouseListener
,
MouseMotionListener
– WindowListener
– KeyListener
– TextListener
– ComponentListener
– ContainerListener
– FocusListener
Mariusz Chmielewski - ISI WAT
34
Przykłady słuchaczy AWT
Przykłady słuchaczy AWT
Event listener interfaces in
java.awt.events
• ActionListener
• AdjustmentListener
• AWTEventListener
• ComponentListener
• ContainerListener
• FocusListener Focus
• HierarchyBoundsListener Hierarchy
• HierarchyListener Hierarchy
• InputMethodListener
• ItemListener
• KeyListener
• MouseListener
• MouseMotionListener
• MouseWheelListener
• TextListener
• WindowFocusListener
• WindowListener
• WindowStateListener
Mariusz Chmielewski - ISI WAT
35
Przykłady słuchaczy Swing
Przykłady słuchaczy Swing
Event listener interfaces in javax.swing.event
• AncestorListener
• CaretListener
• CellEditorListener
• ChangeListener
• DocumentListener
• HyperlinkListener
• InternalFrameListener
• ListDataListener
• ListSelectionListener
• MenuDragMouseListener
• MenuKeyListener
• MenuListener
• MouseInputListener
• PopupMenuListener
• TableColumnModelListener
• TableModelListener
• TreeExpansionListener
• TreeModelListener
• TreeSelectionListener
• TreeWillExpandListener
• UndoableEditListener
Mariusz Chmielewski - ISI WAT
36