Programowanie obiektowe Wykład 7
Marcin Młotkowski
8 kwietnia 2015
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Plan wykładu
1
´c ´1 ˙ycia programisty, cz˛ Zz es
2
Swing Okna i kontrolki Obsługa zdarze´ n
3
Pułapki i rozwiazania ˛ ´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Marcin Młotkowski
Programowanie obiektowe
2 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Etap 1
Specyfikacja Zaprogramowa´ c system do obsługi biblioteki.
Marcin Młotkowski
Programowanie obiektowe
3 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Fragment implementacji public class Ksiazka { private String tytuł; private String autor; private int wydanie; public Ksiazka(String t, String a, int w) { this.tytuł = t; this.autor = a; this.wydanie = w; } public String toString() { return "Ksia˙ ˛zka " + this.tytuł + " " + this.autor; } } Marcin Młotkowski
Programowanie obiektowe
4 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Etap 2
Rozszerzenie specyfikacji ˙eby jeszcze dało si˛ Ale z e edytowa´ c dane w okienku!
Marcin Młotkowski
Programowanie obiektowe
5 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Implementacja w Javie public class Ksiazka { private String tytuł; private String autor; private int wydanie; public Ksiazka(String t, String a, int w) { ... } public String toString() { ... } public void Edycja() { ... } }
Marcin Młotkowski
Programowanie obiektowe
6 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Plan wykładu
1
´c ´1 ˙ycia programisty, cz˛ Zz es
2
Swing Okna i kontrolki Obsługa zdarze´ n
3
Pułapki i rozwiazania ˛ ´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Marcin Młotkowski
Programowanie obiektowe
7 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Wprowadzenie do biblioteki Swing
Najwa˙ zniejsze informacje istotnie ulepszona wersja AWT (Abstract Window Toolkit); ´ wygladu niezale˙ zno´ sc ˛ i innych mechanizmów od systemu operacyjnego; wsparcie dla internacjonalizacji. Intensywnie korzysta z mechanizmów obiektowych: klas, obiektów i dziedziczenia.
Marcin Młotkowski
Programowanie obiektowe
8 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Z czego składa si˛ e Swing
´c ´ widoczna Cz˛ es Okna, kontrolki i menu ´ Obsługa klikni˛ ec Zdarzenia i słuchacze.
Marcin Młotkowski
Programowanie obiektowe
9 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Gdzie jest Swing?
import javax.swing.*; import java.awt.*; import java.awt.event.*;
Marcin Młotkowski
Programowanie obiektowe
10 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Hierarchia klas javax.swing.* JComponent
JLabel
Frame
JTextComponent JFrame
JTextField
Marcin Młotkowski
Programowanie obiektowe
11 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Szybkie rozwiazanie ˛
Marcin Młotkowski
Programowanie obiektowe
12 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Okno główne
JFrame frame = new JFrame("Edycja ksia˙ ˛zki"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Marcin Młotkowski
Programowanie obiektowe
13 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Okno główne
JFrame frame = new JFrame("Edycja ksia˙ ˛zki"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container kontener = frame.getContentPane(); GridLayout layout = new GridLayout(4, 2); kontener.setLayout(layout);
Marcin Młotkowski
Programowanie obiektowe
13 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Edycja autora
JLabel autor_etykieta = new JLabel("Autor"); kontener.add(autor_etykieta); JTextField autor = new JTextField(this.autor, 40); kontener.add(autor);
Marcin Młotkowski
Programowanie obiektowe
14 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Edycja tytułu
JLabel tytuł_etykieta = new JLabel("Tytuł"); kontener.add(tytuł_etykieta); JTextField tytuł = new JTextField(this.tytuł, 40); kontener.add(tytuł);
Marcin Młotkowski
Programowanie obiektowe
15 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Edycja wydania
JLabel wydanie_etykieta = new JLabel("Wydanie"); kontener.add(wydanie_etykieta); JTextField wydanie = new JTextField(Integer.toString(this.wydanie), 40); kontener.add(wydanie);
Marcin Młotkowski
Programowanie obiektowe
16 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Przycisk zapisu danych
JButton b = new JButton("Zapisz"); b.addActionListener(this); kontener.add(b);
Marcin Młotkowski
Programowanie obiektowe
17 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Zako´ nczenie budowania okna edycji
frame.pack(); frame.setVisible(true);
Marcin Młotkowski
Programowanie obiektowe
18 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Reakcja na klikni˛ ecie
public class Ksiazka implements ActionListener { public void actionPerformed(ActionEvent e) { // np. pobranie z kontrolki wpisanych danych: JTextfield.getText();
} public void Edycja() { b.addActionListener(this); } }
Marcin Młotkowski
Programowanie obiektowe
19 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Wynik
Marcin Młotkowski
Programowanie obiektowe
20 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Obsługa zdarze´ n
Zdarzenie Klikni˛ ecie myszka, ˛ naci´ sni˛ ecie klawisza, upłyni˛ ecie czasu, zako´ nczenie jakiej´ s operacji. Kontrolka Kontrolka zwiazana ˛ ze zdarzeniem, np. klikni˛ ety przycisk. Obsługa zdarzenia Akcja (metoda) wykonywana po zaistnieniu zdarzenia.
Marcin Młotkowski
Programowanie obiektowe
21 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Subskrypcja zdarze´ n w Swingu
Kontrolka "przyjmujaca ˛ zdarzenia" Kontrolka ma list˛ e klas, które implementuja˛ interfejs ActionListener. Po ka˙ zdym zdarzeniu wszystkie elementy listy sa˛ informowane o zaistnieniu zdarzenia. Słuchacz Implementuje metod˛ e actionPerformed(ActionEvent), która jest wywoływana w momencie wystapienia ˛ zdarzenia.
Marcin Młotkowski
Programowanie obiektowe
22 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Implementacja nasłuchu public class Ksiazka implements ActionListener { public void actionPerformed(ActionEvent e) { ... } public void Edycja() { ... JButton b = new JButton("Zapisz"); b.addActionListener(this); ... } }
Marcin Młotkowski
Programowanie obiektowe
23 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Słuchacze
Obiekty moga˛ rejestrowa´ c Słuchaczy (dowolna˛ ich liczb˛ e); informacja o zmianach jest rozsyłana przez obiekt do wszystkich słuchaczy; w Swingu Słuchacz implementuje interfejs EventListener i pochodnych, w tym ActionListener.
Marcin Młotkowski
Programowanie obiektowe
24 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Implementacja słuchacza, 1. podej´ scie
public class Ksiazka implements ActionListener { b.addActionListener(this); }
Marcin Młotkowski
Programowanie obiektowe
25 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Implementacja słuchacza, 2. podej´ scie
public class Ksiazka { class MyListener implements ActionListener { public void actionPerformed(ActionEvent e) { ... } } ... b.addActionListener(new MyListener()); ... }
Marcin Młotkowski
Programowanie obiektowe
26 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Implementacja słuchaczy, 3. podej´ scie
Klasa anonimowa b.ActionListener( new ActionListener() { public void actionPerformed(ActionEvent evt) { ... } } );
Marcin Młotkowski
Programowanie obiektowe
27 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
Okna i kontrolki Obsługa zdarze´ n
Własno´ sci klasy anonimowej
mo˙ zna definiowa´ c "w locie" i nie trzeba wymy´ sla´ c nazwy; klasa anonimowa ma dost˛ ep do zmiennych obiektu macierzystego.
Marcin Młotkowski
Programowanie obiektowe
28 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Plan wykładu
1
´c ´1 ˙ycia programisty, cz˛ Zz es
2
Swing Okna i kontrolki Obsługa zdarze´ n
3
Pułapki i rozwiazania ˛ ´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Marcin Młotkowski
Programowanie obiektowe
29 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Rozwój oprogramowania
˙eby działało na komórce/palmtopie/.... Ale z
Marcin Młotkowski
Programowanie obiektowe
30 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Rozwój oprogramowania
˙eby działało na komórce/palmtopie/.... Ale z Implementacja public class Ksiazka { public void Edycja() { ... } public void EdycjaWersjaKomórkowa() { ... } public void EdycjaWersjaPalmtop() { ... } }
Marcin Młotkowski
Programowanie obiektowe
30 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Wynik
implementacja "wła´ sciwej" klasy Ksia˙ ˛zka: 15 wierszy; implementacja edycji (tylko Swing): 40 wierszy
Marcin Młotkowski
Programowanie obiektowe
31 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Refleksja
Czy klasa Ksiazka ma dobra˛ nazw˛ e?
Marcin Młotkowski
Programowanie obiektowe
32 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
´rodku klasy Ksiazka? Co jest w s
implementacja funkcjonalno´ sci zwiazanej ˛ z modelowaniem ksia˙ ˛zki ´rodowiskiem kod odpowiedzialny za interakcj˛ e ze s okienkowym
Marcin Młotkowski
Programowanie obiektowe
33 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Reguła programowania obiektowego
Zasada pojedynczej odpowiedzialno´ sci Klasa powinna mie´ c wyłacznie ˛ jeden obszar odpowiedzialno´ sci.
Marcin Młotkowski
Programowanie obiektowe
34 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Wprowadzenie
Wzorzec projektowy MVC: Model–View–Controller jeden z pierwszych wzorców projektowych zaprojektowany dla biblioteki graficznej
Marcin Młotkowski
Programowanie obiektowe
35 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Interakcja z otoczeniem
Książka - autor: String - tytuł: String - wydanie: int
Edycja książki
Marcin Młotkowski
Programowanie obiektowe
36 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
MVC
Model Dane oraz zale˙ zno´ sci mi˛ edzy nimi View Widok danych (ekran, drukarka, html) Controller "Co´ s" co modyfikuje stan Modelu (np. przyciski na ekranie).
Marcin Młotkowski
Programowanie obiektowe
37 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Współdziałanie elementów
Kontroler ma referencj˛ e do Modelu i na podstawie akcji u˙ zytkownika (naci´ sni˛ ecie klawisza) wywołuje odpowiednie metody modyfikujace ˛ stan Modelu. Widok (lub Widoki) nasłuchuja˛ zmian w Modelu i aktualizuja˛ wyglad ˛ w przypadku modyfikacji.
Marcin Młotkowski
Programowanie obiektowe
38 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
MVC w Swingu
Książka
Edycja książki
Marcin Młotkowski
- autor: String - tytuł: String - wydanie: int
Programowanie obiektowe
39 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Ulepszanie kodu
Rozdzielenie klasy na dwie klasy: public class Ksiazka { ... }
public class KsiazkaWidokSwing { public KsiazkaWidok(Ksiazka k) { ... } }
Marcin Młotkowski
Programowanie obiektowe
40 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Podsumowanie
Rozdzielenie klas wzgl˛ edem odpowiedzialno´ sci daje naturalny podział kodu; ´ zastosowanie wzorca MVC lub podobnego daje mo˙ zliwo´ sc niezale˙ znej implementacji klas modelu i skojarzonych z nimi interfejsów graficznych; definiowanie podklasy modelu mo˙ ze naturalnie by´ c odzwierciedlone w podklasie interfejsu.
Marcin Młotkowski
Programowanie obiektowe
41 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Ocena dotychczasowego rozwiazania ˛
rozdzielono obiekt od jego "edytora"; uruchomienie edytora wymaga przesłania danych z obiektu (modelu) do edytora; zako´ nczenie pracy edytora wymaga przesłania poprawionych danych z edytora do obiektu.
Marcin Młotkowski
Programowanie obiektowe
42 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Marzenie programisty
Powiazanie ˛ kontrolek (takich jak JTextField) bezpo´ srednio z danymi.
Marcin Młotkowski
Programowanie obiektowe
43 / 44
´c ´1 ˙ycia programisty, cz˛ Zz es Swing Pułapki i rozwiazania ˛
´c ´2 ˙ycia programisty, cz˛ Zz es Model–View–Controller MVC w Swingu
Rozwiazanie ˛ w Swingu
Koncepcja dokumentu: dokument jest kontenerem na tekst; zarówno na prosty tekst jak i na ustrukturalizowane dokumenty (html, xml) dokumenty mo˙ zna podłacza´ ˛ c jako obserwatory do kontrolek, wtedy transfer danych z kontrolki do dokumentu jest automatyczny; dalsze informacje: javax.swing.text.AbstractDocument i podklasy.
Marcin Młotkowski
Programowanie obiektowe
44 / 44