background image

Mariusz Chmielewski - ISI WAT

1

kpt. mgr inż. Mariusz Chmielewski

Instytut Systemów Informatycznych

Wydział Cybernetyki

Wojskowa Akademia Techniczna

Programowanie zdarzeniowe

Wstęp

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

Kompozyt (Composite)

Kompozyt (Composite)

Mariusz Chmielewski - ISI WAT

11

background image

Kompozyt (Composite) - warianty

Kompozyt (Composite) - warianty

Mariusz Chmielewski - ISI WAT

12

background image

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

background image

Java 2 SE - Architektura

Java 2 SE - Architektura

Mariusz Chmielewski - ISI WAT

14

background image

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

background image

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

background image

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

background image

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

background image

Zasady SWING – AWT ?

Zasady SWING – AWT ?

Mariusz Chmielewski - ISI WAT

19

Kompone
nt AWT

Komponent 
Swing – 
JInternalFrame

Obszar 
komponentu 
błędnie 
odrysowany

background image

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

background image

Swing

Swing

Mariusz Chmielewski - ISI WAT

21

background image

Struktura SWING  - Główne Komponenty

Struktura SWING  - Główne Komponenty

Mariusz Chmielewski - ISI WAT

22

background image

SWT

SWT

Mariusz Chmielewski - ISI WAT

23

background image

• 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

background image

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

background image

• 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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

}

background image

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ń;

background image

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

background image

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

background image

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


Document Outline