[1] JAVA programowanie GUI (AWT i Swing)
[2] Wprowadzenie Pierwotnym GUI dla Javy był AWT (Abstract Window Toolkit) wg legendy powstał w miesiąc... Swing dodano dopiero w wersji Javy 1.2 (przełom 1997/98) Dlaczego skonstruowano kolejny sposób tworzenia interfejsów?
[3] Dlaczego nie AWT? Główny powód: niezadowolenie osób tworzących w Javie z istniejącego rozwiązania Wygląd interfejsów stworzonych przy pomocy AWT zależało od systemu operacyjnego AWT oferowało słabe wsparcie dla rysowania na ekranie oraz nie zapewniało kompatybilności operacji Drag and Drop pod kontrolą różnych systemów operacyjnych
[4] AWT a Swing AWT: Wygląd kontrolek specyficzny dla każdego systemu operacyjnego Swing: Wygląd kontrolek niezależny od systemu operacyjnego Schematy wyglądu (look and feel) Rozbudowane wsparcie dla rysowania 2D
[5] AWT a Swing AWT: Korzysta z wywołań funkcji systemowych przy tworzeniu i zarządzaniu wyglądem aplikacji Generalnie szybki, choć szybkość działania zależy od systemu operacyjnego Swing: W całości napisany w Javie Nieco wolniejszy, ale mniejsze różnice w prędkości pomiędzy platformami
[6] AWT i Swing AWT i Swing zawierają 2 podstawowe klasy: Component : metody dostępu do komponentów graficznych oraz metody do zmiany ich właściwości, Container : podklasa Component dostarczająca tzw. pojemniki, czyli obiekty grupujące
[7]
[8]
[9]
[10]
[11] Rozmieszczanie elementów na ekranie Kontrolą rozmieszczenia obiektów na ekranie zajmuje się Container. Do dyspozycji jest kilka klas. 1. BorderLayout (domyślny) 2. FlowLayout 3. GridLayout 4. GridBagLayout 5. null 6. BoxLayout
[12] Rozmieszczanie elementów na ekranie import java.awt.*; import java.applet.applet; public class buttondir extends Applet { public void init() { setlayout(new BorderLayout()); add(new Button("North"), BorderLayout.NORTH); add(new Button("South"), BorderLayout.SOUTH); add(new Button("East"), BorderLayout.EAST); add(new Button("West"), BorderLayout.WEST); add(new Button("Center"), BorderLayout.CENTER); } }
[13] Rozmieszczanie elementów na ekranie import java.awt.*; import java.applet.applet; public class mybuttons extends Applet { Button button1, button2, button3; public void init() { button1 = new Button("Ok"); button2 = new Button("Open"); button3 = new Button("Close"); add(button1); add(button2); add(button3); } }
[14] Rozmieszczanie elementów na ekranie import java.awt.*; import java.applet.applet; public class ButtonGrid extends Applet { public void init() { setlayout(new GridLayout(3,2)); add(new Button("1")); add(new Button("2")); add(new Button("3")); add(new Button("4")); add(new Button("5")); add(new Button("6")); } }
[15] Rozmieszczanie elementów na ekranie private javax.swing.jlabel getivjjlabel(){ if(ivjjlabel == null) { ivjjlabel = new javax.swing.jlabel(); ivjjlabel.setbounds(59, 10, 38, 15); ivjjlabel.settext("jlabel"); } return ivjjlabel; }
[16] Model View - Controller INPUT PROCESSING OUTPUT Podejście klasyczne CONTROLLER MODEL VIEW Podejście MVC
[17] Dlaczego MVC? Podejście po raz pierwszy wykorzystano w Smalltalku 80 Kontrolery, model i widoki traktowane jako oddzielne elementy Zmiany modelu natychmiast odzwierciedlane w widokach
[18] Model View - Controller VIEW CONTROLLER VIEW CONTROLLER MODEL VIEW CONTROLLER VIEW
[19] Założenia MVC... Wszystkie komponenty w systemie muszą dać się określić jako kontroler, model, widok bądź część któregoś z nich Połączenie model <-> widok jest realizowane dynamicznie w czasie działania programu, a nie w czasie kompilacji Jeżeli zaprojektujemy w MVC każdy komponent, to łatwe będzie ich łączenie w spójny projekt
[20] Założenia MVC... Usuwanie bądź przebudowa komponentu nie pociąga za sobą potrzeby ingerencji w cały system Model nie wie, jakie są jego kontrolery, nie zna także korzystających z niego widoków sam system zajmuje się ich spójnym połączeniem Kontrolery i Widoki znają skojarzony z nimi Model
[21] Przykład zastosowania MVC Gra komputerowa 3D shoot 'em up AKCJA: RUCH AKCJA: STRZAŁ AKCJA: OTWIERANIE DRZWI MODEL(e) ŚWIATA, OBIEKTÓW, POSTACI WIDOK: FPP WIDOK: Z GÓRY WIDOK: OD STRONY PRZECIWNIKA
[22] Java a MVC... Java oferuje wsparcie dla MVC poprzez dwie klasy: Obserwator (Observer) obiekt, który chce być powiadamiany o zmianach w innym obiekcie Obserwowany (Observable) każdy obiekt, którego zmiana stanu może zainteresować inny obiekt
[23] Swing a MVC observable MODEL CONTROLLER VIEW GUI observer
[24] Przykład (JButton) Model przechowuje stan, pozwala na jego modyfikację i odczytywanie. Dodatkowo pozwala dodawać/usuwać słuchaczy(listeners). Widok i kontroler zajmują się wyświetlaniem stanu i przycisku na ekranie. Tutaj także pamiętamy, w którym miejscu na ekranie znajduje się przycisk. Ta część zajmuje się również obsługą zdarzeń AWT.
[25] Zdarzenia W modelu, z którego korzysta Swing, akcje podejmowane są w odpowiedzi na zajście konkretnych zdarzeń. Aby powiązać zdarzenie z określoną akcją, każdej kontrolce musimy przyporządkować specjalną klasę, która będzie reagowała na zajście tego zdarzenia. Tę klasę nazywamy słuchaczem.
[26] Zdarzenia W modelu tym występuje strona wyzwalająca (trigger) zdarzenie i nasłuchująca (listener), czy zdarzenie zaszło. Aby móc nasłuchiwać, trzeba się najpierw zarejestrować u wyzwalającego i tym samym wyrazić zainteresowanie danym zestawem zdarzeń. Wówczas wyzwalający w razie zajścia zdarzenia będzie mógł wywołać na rzecz nasłuchującego metodę odpowiadającą zdarzeniu. Zestaw metod opowiadających zdarzeniom jest określony przez interfejs. Gdy korzysta się z wbudowanego systemu zdarzeń, wystarczy napisać stronę nasłuchującą, zwaną nasłuchiwaczem. Jest to klasa implementująca interfejs przeznaczony dla danego zestawu zdarzeń.
[27] Zdarzenia
[28] Zdarzenia import java.awt.event.actionlistener; import java.awt.event.actionevent; Większość komponentów reaguje na działania użytkownika wyzwoleniem zdarzenia akcji. Zdarzenie akcji jest reprezentowane przez obiekt ActionEvent, od którego można pozyskać informację na temat zdarzenia. Interfejs odpowiadający zdarzeniom akcji to ActionListener z metodą actionperformed. Aby obsługiwać działania użytkownika należy na komponencie zarejestrować metodą addactionlistener nasłuchiwacza, czyli instancję implementującą ten interfejs.
[29] Zdarzenia class ObslugaPrzycisku implements ActionListener { OblsugaPrzycisku() { JButton przycisk = new JButton("Naciśnij mnie"); przycisk.addactionlistener(this); } public void actionperformed(actionevent e) { System.out.println("I po co naciskasz?"); } }
[30] Zdarzenia - mysz Obsługa myszy opiera się na standardowym modelu zdarzeń. Interakcje użytkownika z myszą podzielono między kilka interfejsów: 1. podstawowy MouseListener 2. śledzący ruch wskaźnika MouseMotionListener 3. obejmujący oba powyższe MouseInputListener 4. śledzący obroty kulki myszy MouseWheelListener
[31] Zdarzenia - mysz Podstawowy interfejs import java.awt.event.mouselistener; import java.awt.event.mouseevent; MouseListener dostarcza następujące metody: * kliknięcie myszą void mouseclicked(mouseevent e) * naciśnięcie przycisku myszy void mousepressed(mouseevent e) * zwolnienie przycisku myszy void mousereleased(mouseevent e) * wejście myszy w obszar śledzenia void mouseentered(mouseevent e) * wyjście myszy z obszaru śledzenia void mouseexited(mouseevent e)
[32] Zdarzenia - mysz class ObsługaMyszy impelements MouseListener { ObsługaMyszy() { addmouselistener(this); // rejestracja zainteresowania zdarzeniami } } public void mouseclicked(mouseevent e) { System.out.println("Kliknięto " + e.getclickcount() + "razy"); System.out.println("w punkcie: (" + e.getx() + "," + e.gety() + ")"); }
[33] Wtyczki GUI (look and feel) Schematy wyglądu dostarczane wraz ze Swingiem: GTKLookAndFeel (Linux z GTK) MetalLookAndFeel (typowy dla Javy) MotifLookAndFeel WindowsLookAndFeel (typowy dla Windows) DefaultLookAndFeel
Wybór look and feel Jeśli aplikacja nie określi swojego LookAndFeel, zostanie użyty domyślny LookAndFeel Javy. [34] Wybór lookandfeel powinien wystąpić jako pierwszy w programie. Aby aplikacja przypominała wyglądem pozostałe, należy wybrać LookAndFeel zależny od platformy. Metoda wyboru rzuca różne wyjątki, którymi trzeba się zająć: try { UIManager.setLookAndFeel(UIManager.getSystemLookAnd FeelClassName()); } catch (Exception e) { } System.err.println("Nie można wybrać LookAndFeel");
[35] Wybór look and feel UIManager.setLookAndFeel( "com.sun.java.swing.plaf.gtk.gtklookandfeel"); "com.sun.java.swing.plaf.gtk.gtklookandfeel" "javax.swing.plaf.metal.metallookandfeel" "com.sun.java.swing.plaf.windows.windowslookandfeel" "com.sun.java.swing.plaf.motif.motiflookandfeel"
[36] Jigloo
[37] JForm Designer
[38] Podsumowanie Swing rozszerza AWT i przerasta go w wielu względach Wygląd aplikacji napisanych przy użyciu Swinga jest taki, jakiego sobie zażyczymy na każdej platformie Swing został zaprojektowany z uwzględnieniem architektury Model-View-Controller Dzięki zastosowaniu anonimowych słuchaczy pisanie kodu obsługującego zdarzenia jest szybkie