Prezentacja mgr - Analiza możliwości programowania frameworków opartych o model MVC
Programowanie w języku Java WYKŁAD -...
Transcript of Programowanie w języku Java WYKŁAD -...
Programowanie w języku Java
WYKŁAD
dr inż. Piotr Zabawa
Certyfikowany Konsultant IBM/Rational
e-mail: [email protected]
www: http://www.pk.edu.pl/~pzabawa 05.05.2014
Zakład Inżynierii Oprogramowania
WYKŁAD 11GUI w Swing – cz. 1
Wykład został w znacznej mierze oparty na:
http://www.tutorialspoint.com/swing/
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
GUI = Graphical User Interface
Może być związane:
• z aplikacją desktopową (nasz wykład)
• z aplikacją webową (inne przedmioty)
Z punktu widzenia inżynierii oprogramowania opracowanie
wymagań/architektury/projektu/implementacji/testów prace w projekcie
informatycznym nad GUI związane są z tzw. user experience.
Istnieją dobre praktyki związane z projektowaniem GUI. Oprócz
ogólnych praktyk (kwestie techniczne) należy mieć na względzie fakt, że
w różnych dziedzinach zastosowań mogą być różne zwyczaje.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
Technologie służące wytwarzaniu GUI niezależnego od platformy
dostępne w 2013 roku:
• QML
• Qt
• Juce
• Adobe Air
• Mono+GTK
• Java FX
• SWT
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
W ramach Java SE GUI może być realizowane w postaci aplikacji
desktopowej zarządzanej bezpośrednio przez Window Manager danego
systemu operacyjnego albo w postaci apletów zarządzanych przez
przeglądarkę. Koncepcja apletów została jednak zdominowana przez
bardziej dojrzałe technologie webowe, dlatego zostanie całkowicie
pominięta w czasie wykładów.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
Na kolejnym slajdzie pokazano kontekst działania GUI nawiązujący
do rozwiązań znanych z Linuxa.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
Na kolejnym slajdzie pokazano strukturę okna w systemie
okienkowym.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Do niedawna uważano, że Swing jest wzorcowo zaprojektowaną
biblioteką ilustrującą dobre praktyki stosowane w języku Java. Jednak są
przeciwnicy tego podejścia/realizacji oraz trwają prace nad JavaFX –
biblioteką GUI mającą wkrótce (Java 9?) zastąpić bibliotekę Swing.
W ramach wykładu omówimy Swing ze względu na następujące
ograniczenia w Java FX:
• Braki w implementacji dostępnej w Java 7
• Niedojrzałość jej implementacji w Java 8
• Brak dostatecznego wsparcia narzędziowego
• Brak dostatecznego wsparcia społecznościowego (tutoriale, książki,
fora dyskusyjne,…)
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Zalety biblioteki Swing:
• Sprzętowo przyspieszane wyświetlanie
• MVC
• Wykorzystanie technologii Java – managed code
• Wsparcie przez środowiska deweloperskie – projektowanie
WYSIWYG, narzędzia testowania
• Wsparcie społecznościowe (por. rys)
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Wady biblioteki Swing w Java 7:
• Zdarzają się krytyczne błędy, które długo pozostają nierozwiązane (np.
File.exists)
• Ograniczenia związane z Mac OS
• Konieczność umieszczania JRE w dystrybucji oprogramowania
• Ograniczenia implementacyjne związane z BufferedImage – trudności
z przyspiesznaiem sprzętowym, trudności z wyświetlaniem obiektów
rastrowych BufferedImage
• Problemy z wyświetlaniem GUI przy dostępie przez VMware lub
przez remote desktop
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Przegląd
• Swing API stanowi zbiór rozszerzalnych komponentów GUI
ułatwiających programiście implementację GUI aplikacji
desktopowych. Biblioteka ta została skonstruowana na bazie AWT i
stanowi jej nakładkę (wrapper). Komponenty Swing zostały
opracowane zgodnie z wzorcem architektonicznym MVC i spełniają
następujące założenia:
• Pojedyncze API zapewniające obsługę różnorodnych widoków
• Możliwość automatycznego generowania aplikacji z modelu
• Zorientowanie na wsparcie narzędziowe
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Architektura MVC
Architektura Swing API wspiera MVC następująco:
• Model reprezentuje dane komponentów.
• View reprezentuje widok danych komponentu.
• Controller pobiera dane od użytkownika z widoku i odzwierciedla
zmiany w danych komponentu.
• Komponenty Swing mają Model jako osobny element a View i
Controller należą do elementów GUI. Dzięki temu Swing jest łatwo
rozszerzalny.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Cechy Swing
• Light Weight – komponenty Swing są niezależne od natywnych API
systemów operacyjnych ponieważ jego komponenty nie odwołują się
wprost do API systemu operacyjnego.
• Rich controls - Swing dostarcza bogatego zbioru zaawansowanych
kontrolek jak np. Tree, TabbedPane, slider, colorpicker, table controls
• Highly Customizable – kontrolki Swing mogą być łatwo
dostosowywane do potrzeb użytkownika gdyż ich wygląd jest
niezależny od reprezentacji wewnętrznej.
• Pluggable look-and-feel – wygląd aplikacji, których GUI oparte jest
na Swing API może być zmieniany w czasie wykonania.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Kontrolki Swing
Każde GUI uwzględnia następujące trzy aspekty:
• UI elements: Główne elementy wizualne dostępne dla użytkownika.
Ich przykłady zostaną omówione dalej.
• Layouts: Określają jak poszczególne kontrolki powinny być położone
na ekranie. Zagadnienie to zostanie omówione dalej.
• Behavior: Są związane ze zdarzeniami generowanymi przez
użytkownika działającego na elementach GUI. Pozwalają obsługiwać
zdarzenia w sposób asynchroniczny i wielowątkowy.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa Component
• Klasa Component jest bazową klasą abstrakcyjną dla kontrolek AWT
nie będących elementami menu. Component reprezentuje obiekt
mający reprezentację graficzną.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing - klasa Container
• Klasa Container jest nadklasą dla kontenerów AWT. Obiekt klasy
Container może zawierać inne komponenty AWT.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing - klasa JComponent
• Klasa JComponent jest klasą bazową dla wszystkich komponentów
Swing z wyjątkiem komponentów leżących najwyżej w hierarchii.
Aby skorzystać z komponentu dziedziczącego z JComponent należy
umieścić go w hierarchii kontenerów, której wierzchołkiem jest jeden
z kontenerów Swing.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JLabel
• Klasa JLabel może wyświetlać
tekst i/lub obraz. Zawartość obiektu
Label może być pozycjonowana w
pionie i w poziomie względem tego
komponentu. Domyślnie jest
wycentrowana w pionie. Etykiety
tekstowe są domyślnie ustawione
przy lewej krawędzi kontrolki, a
graficzne są domyślnie
wycentrowane.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JButton
• Klasa JButton stanowi
implementację przycisku.
Komponent ten ma etykietę (tekst
i/lub grafika – jak Label) i generuje
zdarzenia w czasie wciskania.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JColorChooser
• Klasa JColorChooser dostarcza
panelu kontrolek
zaprojektowanych w celu
umożliwienia użytkownikowi
manipulowania kolorami i
dokonywania wyboru koloru.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing JCheckBox Class
• Klasa JCheckBox jest
implementacją check-boxu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing - klasa JRadioButton
• Klasa JRadioButton jets
implementacją radio-button.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JList
• Klasa JList jest komponentem
wyświetlającym listę obiektów
pozwalającą użytkownikowi
wybrać jeden lub wiele z nich.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing klasa JComboBox
• Klasa JComboBox jest
komponentem zawierającym
przycisk lub pole edytowalne oraz
listę rozwijaną dynamicznie.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing klasa JTextField
• Klasa JTextField jest
komponentem pozwalającym na
edytowanie pojedynczej linii
tekstu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing –klasa JPasswordField
• Klasa JPasswordField jest
komponentem dedykowanym do
obsługi funkcjonalności hasła i
pozwala na edytowanie
pojedynczej linii tekstu maskując
jego treść.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JTextArea
• Klasa JTextArea jest
wieloliniowym obszarem do edycji
tekstu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa ImageIcon
• Klasa ImageIcon jest
implementacją interfejsu Icon
wyświetlającego ikonę dla obrazu
graficznego.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JScrollBar
• Klasa JScrollBar jest
implementacją paska przewijania.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JOptionPane
• Klasa JOptionPane jest
komponentem dostarczającym
standardowych metod dla
wyskakującego okienka
dialogowego służącego
poinformowaniu użytkownika o
czymś.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JFileChooser
• Klasa JFileChooser jest komponentem dostarczającym
użytkownikowi prostego mechanizmu wybierania pliku.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JProgressBar
• Klasa JProgressBar jest
komponentem wyswietlającym
postęp jakiegoś zadania.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JSlider
• Klasa JSlider jest komponentem
pozwalającym użytkownikowi na
graficzny wybór wartości za
pomocą suwaka poruszającego
się w określonym zakresie.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - komponenty
Swing – klasa JSpinner
• Klasa JSpinner jest
komponentem pozwalającym
użytkownikowi na wybranie
wartości parametru z
uporządkowanej sekwencji
wartości za pomocą strzałek
przewijania lub za pomocą
pola wejściowego.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasy Event
• Klasy Event reprezentują zdarzenia. Java dostarcza wielu różnych
wyspecjalizowanych klas tej kategorii. Omówione zostaną
przykładowe, najczęściej używane.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
Klasa EventObject
• Jest to klasa bazowa, z której wyprowadzane są wszystkie klasy
zdarzeń. Obiekty tych klas konstruowane są w taki sposób, aby źródło
zdarzenia – obiekt, w którym zdarzenie zostało zainicjowane było w
nim reprezentowane za pomocą referencji do tego obiektu. Klasa ta
jest zdefiniowana w pakiecie java.util.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa AWTEvent
• Jest to klasa bazowa dla wszystkich zdarzeń AWT. Zastępuje ona
klasy zdarzeń wywodzonych z klasy java.awt.Event. Jest ona
zdefiniowana w pakiecie java.awt. Za pomocą metody getID() można
zidentyfikować typ zdarzenia.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa ActionEvent
• Klasa ta jest zdefiniowana w pakiecie java.awt.event. Obiekt
ActionEvent jest generowany gdy zostanie wciśnięty przycisk lub
nastąpi kliknięcie lub podwójne kliknięcie na pozycji z listy.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa InputEvent
• Klasa InputEvent jest klasą bazową dla wszystkich zdarzeń
generowanych na poziomie komponentów. Zdarzenia wejściowe są
dostarczane do Listener’ów zanim zostaną obsłużone przez źródło, w
którym powstały. Pozwala to na przejęcie kontroli nad
wygenerowanym zdarzeniem przez Listener’a lub podklasę
komponentu zanim komponent źródłowy obsłuży je w sposób dla
niego charakterystyczny. Np. przejęcie zdarzenia mousePressed
wygenerowanego na komponencie przycisku Button pozwala
zabezpieczyć obiekt klasy Button przed aktywowaniem go.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa KeyEvent
• Obiekt tej klasy jest generowany w czasie wprowadzania z klawiatury
znaku. Są trzy rodzaje takich zdarzeń reprezentowane za pomocą
następujących stałych całkowitych:
– KEY_PRESSED
– KEY_RELASED
– KEY_TYPED
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa MouseEvent
• Zdarzenie to świadczy o wykonaniu czynności za pomocą myszy na
komponencie. Jest ono generowane gdy:
– Zostanie wciśnięty przycisk myszy
– Zostanie zwolniony przycisk myszy
– Zostanie kliknięty (wciśnięty i zwolniony) przycisk myszy
– Kursor myszy wejdzie w obszar komponentu
– Kursor myszy znajduje się w obszarze komponentu
– Mysz zostanie poruszona
– Przycisk myszy zostanie wciśnięty i przytrzymany
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa WindowEvent
• Obiekt tej klasy reprezentuje zmianę stanu okna. Zdarzenie to jest
generowane w przypadku otwarcia, zamknięcia, aktywacji,
dezaktywacji, zwinięcia, rozwinięcia, uzyskania lub utraty fokusu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa AdjustmentEvent
• Klasa AdjustmentEvent reprezentuje zdarzenie zmiany rozmiaru
generowane przez komponenty mogące zmieniać rozmiar (nie
wszystkie).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING - klasa ComponentEvent
• Klasa ComponentEvent reprezentuje zdarzenia generowane gdy
komponent zostanie przesunięty, zmieni rozmiar lub widoczność
(zostanie ukryty lub odsłonięty).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa ContainerEvent
• Klasa ContainerEvent reprezentuje zdarzenie informujące o zmianie
zawartości kontenera związane z dodaniem do niego lub usunięciem z
niego komponentu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – interfejs MouseMotionEvent
• Interfejs MouseMotionEvent świadczy o czynności myszy wykonanej
na komponencie. Zdarzenie takie jest generowane przez komponent
gdy mysz zostanie przesunięta lub wciśnięta nad nim.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - zdarzenia
SWING – klasa PaintEvent
• Klasa PaintEvent jest używana do zapewnienia skolejkowania
wywołań metody paint/update wraz z innymi zdarzeniami
dostarczanymi z kolejki zdarzeń.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasy Event Listeners
• Event listener reprezentuje interfejsy odpowiedzialne za obsługę
zdarzeń. Java dostarcza wielu klas Event listener’ów – tutaj zostaną
pokazana najczęściej wykorzystywane. Każda metoda event listener’a
ma jeden argument będący odpowiednią podklasą klasy EventObject.
Np. metody klasy będącej mouse event listener’em przyjmują jako
argument obiekty klasy MouseEvent, gdzie MouseEvent dziedziczy z
klasy EventObject.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
Interfejs EventListner
• Jest to interfejs, który musi być rozszerzany przez każdy interfejs event
listenera.Definicja tego interfejsu znajduje się w pakiecie java.util.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs ActionListener
• Musi być implementowany przez każdą klasę przetwarzającą
ActionEvent. Obiekt tej klasy musi być zarejestrowany w
komponencie. Można tego dokonać za pomocą metody
addActionListener(). Kiedy powstanie action event, wtedy zostanie
wywołana metoda actionPerformed() obiektu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs ComponentListener
• Powinna go implementować klasa, która przetwarza ComponentEvent.
Obiekt tej klasy musi zostać zarejestrowany w komponencie. Można
tego dokonać za pomocą metody addComponentListener(). Zdarzenia
component event są generowane jedynie dla celów informacyjnych.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs ItemListener
• Powinien zostać zaimplementowany przez klasę przetwarzającą
ItemEvent. Obiekt tej klasy musi zostać zarejestrowany w
komponencie. Można tego dokonać za pomocą metody
addItemListener(). Gdy pojawi się action event, wtedy zostanie
wywołana metoda itemStateChanged() obiektu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs KeyListener
• Powinien zostać zaimplementowany przez klasę przetwarzającą
KeyEvent. Obiekt tej klasy musi zostać zarejestrowany w
komponencie. Można tego dokonać za pomocą metody
addKeyListener().
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs MouseListener
• Klasa przetwarzająca MouseEvent powinna implementować ten
interfejs. Obiekt tej klasy musi zostać zaimplementowany w
komponencie. Można tego dokonać za pomocą metody
addMouseListener().
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs WindowListener
• Klasa przetwarzająca WindowEvent powinna implementować ten
interfejs. Obiekt tej klasy musi zostać zarejestrowany w komponencie.
Można tego dokonać za pomocą metody addWindowListener().
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs AdjustmentListener
• Interfejs AdjustmentListener jest używany do odbierania zdarzeń
dopasowania (adjustment events). Klasa przetwarzająca te zdarzenia
musi implementować ten interfejs.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs ContainerListener
• Interfejs ContainerListener jest używany do odbierania zdarzeń
container events. Klasa przetwarzająca te zdarzenia musi
implementować ten interfejs.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs MouseMotionListener
• Interfejs MouseMotionListener jest używany do odbierania zdarzeń
mouse motion events generowanych na komponencie. Klasa
przetwarzająca te zdarzenia musi implementować ten interfejs.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – interfejs FocusListener
• Interfejs FocusListener jest używany do odbierania zdarzeń focus
events. Klasa przetwarzająca te zdarzenia musi implementować ten
interfejs.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
Adaptery SWING Event Adapters
• Adaptery są klasami abstrakcyjnymi służącymi odbieraniu różnych
zdarzeń. Metody w tych klasach są puste. Klasy te służą jako Utility
Classes do tworzenia obiektów listener’ów.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasa FocusAdapter
• Klasa FocusAdapter jest abstrakcyjną klasą adaptera do odbierania
zdarzeń focus events.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasa KeyAdapter
• Klasa KeyAdapter jest klasą abstrakcyjną adaptera służącą odbieraniu
zdarzeń keyboard events.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasa MouseAdapter
• Klasa MouseAdapter jest abstrakcyjną klasą adaptera do odbierania
zdarzeń mouse events.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasa MouseMotionAdapter
• Klasa MouseMotionAdapter jest klasą abstrakcyjną adaptera do
odbierania zdarzeń mouse motion events.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing – obsługa zdarzeń
SWING – klasa WindowAdapter
• Klasa WindowAdapter jest abstrakcyjną klasą adaptera do odbierania
zdarzeń window events.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING Layouts
• Layout oznacza ułożenie komponentów w kontenerze w określonych
pozycjach. Zadanie układania komponentów realizowane jest
automatycznie przez Layout Manager.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
Layout Manager
• Automatycznie rozmieszcza wszystkie komponenty w kontenerze. Jeśli go nie
określimy, to jest używany domyślny. Ręcznie nie opłaca się implementować jego
funkcjonalności – jest to trudne z następujących powodów:
– Obsłużenie dużej ilości kontrolek w kontenerze jest trudne
– Zwykle nie dysponujemy informacją o rozmiarach komponentu wtedy gdy chcemy
go odpowiednio umieścić w kontenerze.
• Swing dostarcza wielu klas layout manager. Obsługują one również skutki zmiany
rozmiaru okna kontenera rozmieszczając ponownie w nim komponenty.
• Z każdą instancją klasyContainer skojarzony jest obiekt layout managera. Każda klasa
layout managera musi implementować interfejs LayoutManager.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – iterfejs LayoutManage
• Interfejs LayoutManager jest używany do definiowania interfejsu
klas wiedzących jak rozmieszczać komponenty w kontenerach.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – interfejs LayoutManager2
• Interfejs LayoutManger jest używany do definiowania interfejsu dla
klas wiedzących jak rozmieszczą komponenty w kontenerach w
oparciu o obiekt layout constraints.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa BorderLayout
• Klasa BorderLayout rozmieszcza
komponenty tak aby ulokować je w
pięciu regionach: east, west, north,
south i center. Każdy region może
zawierać tylko jeden komponent i
każdy komponent jest
identyfikowany za pomocą
odpowiedniej stałej NORTH,
SOUTH, EAST, WEST i
CENTER.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa CardLayout
• Klasa CardLayout rozmieszcza
każdy komponent w kontenerze
jako kartę. Wdanej chwili może
być widoczna tylko jedna karta i
kontener jest wykorzystywany jako
stos kart.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa FlowLayout
• Klasa FlowLayout rozmieszcza
komponenty od lewej strony do
prawej.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa GridLayout
• Klasa GridLayout rozmieszcza
komponenty w siatce prostokątnej.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa GridBagLayout
• Klasa GridBagLayout
rozmieszcza komponenty
horyzontalnie i wertykalnie.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa GroupLayout
• Klasa GroupLayout grupuje
komponenty hierarchicznie.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - layout
SWING – klasa SpringLayout
• Klasa SpringLayout rozmieszcza
komponenty na podstawie zbioru
ograniczeń (constraints).
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
Klasy SWING Menu
• Każde główne okno aplikacji ma w górnej części skojarzony z nim
pasek menu. Pasek menu składa się z wielu pozycji dostępnych dla
użytkownika aplikacji. Ponadto każdy wybór może zawierać listę opcji
zwanych drop down menu. Kontrolki Menu i MenuItem są podklasami
MenuComponent.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JMenuBar
• Klasa JMenuBar dostarcza
implementacji paska menu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JMenuItem
• Klasa JMenuItem reprezentuje pozycję w menu. Wszystkie pozycje w
menu powinny dziedziczyć z klasy JMenuItem lub z jednej z jej
podklas. Domyślnie skojarzona jest z etykietą.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JMenu
• Klasa Menu reprezentuje element
menu rozwijany z poziomu paska
menu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JCheckboxMenuItem
• Klasa JCheckboxMenuItem reprezentuje check-box, który może
znajdować się w menu. Wybranie check-box’a w menu zmienia stan
kontrolki z on na off albo z off na on.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JRadioButtonMenuItem
• Klasa JRadioButtonMenuItem reprezentuje radio-button, który może
zostać umieszczony w menu. Wybranie radio-button w menu zmienia
stan kontrolki z on na off albo z off na on.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - menu
SWING – klasa JPopupMenu
• Klasa ta reprezentuje menu rozwijane dynamicznie w określonej
pozycji komponentu.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - kontenery
Kontenery SWING
Kontenery są integralną częścią komponentów GUI w SWING.
Kontener dostarcza miejsca, w którym może znaleźć się komponent.
Container w AWT jest komponentem pozwalającym na dodawanie do
niego komponentów. Warto zwrócić uwagę na następujące własności
kontenerów:
• Podklasy Container są nazywane kontenerami. Np. JPanel, JFrame i
JWindow.
• Kontener może zawierać jedynie komponenty.
• Z każdym kontenerem związany jest charakterystyczny dla niego
domyślny layout. Może on zostać zmieniony za pomocą przeciążonej
metody setLayout().
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - kontenery
SWING – klasa JPanel
• Klasa JPanel jest ogólnym lekkim
kontenerem.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - kontenery
SWING – klasa JFrame
• Klasa JFrame jest rozszerzeniem
klasy java.awt.Frame
wprowadzającą do niej wsparcie
dla komponentowej architektury
JFC/Swing.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing - kontenery
SWING – klasa JWindow
• Klasa JWindow jest kontenerem,
który może zostać wyświetlony
ale nie zawiera paska tytułu ani
przycisków zarządzania oknem.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Dobre praktyki w Swing:
• Każde okno powinno rozszerzać JFrame albo JDialog (w zależności od
typu okna). Ułatwia to zarządzanie własnościami okna bez
konieczności odwoływania się do konkretnego obiektu jego podklasy..
• Metoda main() powinna zostać umieszczona w osobnej klasie.
Zwiększa to prawdopodobieństwo ponownego wykorzystania okna.
• Listener’y powinny być implementowane w anonimowych klasach
wewnętrznych w Java 7 lub za pomocą wyrażeń lambda w Java 8.
Klasa główna nie powinna implementować żadnego listenera. Chroni
to przed atakiem polegającym na przechwytywaniu komunikatów
poza obiektem, z którym są one skojarzone.
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
• Klasy GridBagLayout należy używać ostrożnie. Jest to bardzo bogaty
Layout Manager, chociaż trudny do opanowania.
• Klasy JPanel należy używać ostrożnie. Należy najpierw zastanowić
się, które komponenty powinny zmienić swój rozmiar wraz ze zmianą
rozmiaru okna a następnie zgrupować te komponenty w JPanel.
Czasem wymaga to zagnieżdżania w sobie obiektów klasy JPanel.
• Zawsze należy zaczynać od utworzenia wątku dispatchera zdarzeń.
• Najpierw należy wywołać metodę pack() potem dopasować rozmiar
ramki a dopiero potem wywołać metodę setVisible().
• Warto rozważyć użycie metody getMaximumWindowBounds():
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
Rectangle bounds = env.getMaximumWindowBounds();
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swing
Przykład zastosowania powyższych dobrych praktyk
public class Main {
public static void main(String[] args) {
final String text = args[0];
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
final MyWindow wnd = new MyWindow(text);
wnd.setVisible(true);
}
});
}
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
GUI w Swingpublic class MyWindow extends JFrame {
public MyWindow(String text) {
super("My Window");
setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) {
MyWindow.this.setVisible(false);
MyWindow.this.dispose();
}
});
final JButton btn = new JButton(text);
btn.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(MyWindow.this, "Button Pressed",
"Hey", JOptionPane.INFORMATION_MESSAGE);
}
});
setLayout(new FlowLayout()); add(btn); pack();
}
}
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania
Koniec
dr inż. Piotr Zabawa Instytut Informatyki Wydział Fizyki, Matematyki i Informatyki
Zakład Inżynierii Oprogramowania