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