Uniwersytet dzki Wydzia Matematyki i Informatyki Katedra Analizy

  • Slides: 29
Download presentation
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Swing Java Wykład 7 mgr

Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Swing Java Wykład 7 mgr inż. Michał Misiak

Plan wykładu Co to jest Swing n Swing w Net. Beans n Obsługa zdarzeń

Plan wykładu Co to jest Swing n Swing w Net. Beans n Obsługa zdarzeń w Swing n Nasłuchiwacze n Kontrolki Swing n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Co to jest Swing n n Swing jest częścią Java Foundation Classes (JFC) Swing

Co to jest Swing n n Swing jest częścią Java Foundation Classes (JFC) Swing zapewnia: ¨ ¨ ¨ ¨ Zbiór kontrolek do tworzenia zaawansowanych GUI: tabele, listy, drzewa, taby, etc … rozbudowaną funkcjonalność do pracy z tekstem wsparcie dla wielonarodowości (języki, odpowiedni układ elementów) look & feels (zaawansowane l’n’f z synth) Java 2 D (Swing został zbudowany na tym pakiecie) Mechanizm do przywracania i ponawiania operacji (undo & redo) wsparcie dla osób niepełnosprawnych (lupa, syntezator, wyświetlanie informacji na wyświetlaczu brile’a) transfer danych: operacja wklej, wytnij, drag&drop Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontroli w Swing n n n n JButton JCheck. Box JCombo. Box JList JMenu

Kontroli w Swing n n n n JButton JCheck. Box JCombo. Box JList JMenu JRadio. Button JSlider JSpinner n n JText. Field JPassword. Field Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontrolki z formatowaniem JColor. Chooser n JEditor. Pane n JText. Pane n JFile. Chooser

Kontrolki z formatowaniem JColor. Chooser n JEditor. Pane n JText. Pane n JFile. Chooser n JTable n JText. Area n JTree n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu n n JLabel JProgress. Bar JSeparator

Kontrolki do wyświetlania informacji oraz kontrolki najwyższego poziomu n n JLabel JProgress. Bar JSeparator JTool. Tip n n n n JPanel JScroll. Pane JSplit. Pane JTabbed. Pane JTool. Bar JInternal. Frame JLayered. Pane Root. Pane Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Swing & Netbeans Wsparcie IDE przy projektowaniu GUI – automatyczna generacja kodu n Narzędzia

Swing & Netbeans Wsparcie IDE przy projektowaniu GUI – automatyczna generacja kodu n Narzędzia do projektowania GUI w Netbeans n ¨ Paleta kontrolek ¨ Obszar do projektowania ¨ Okno właściwości ¨ Inspektor Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykład 1 Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykład 1 Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Event Listner n n n event source ev e nt ob je ct event

Event Listner n n n event source ev e nt ob je ct event listner event object n W celu obsłużenia danego typu zdarzenia należy zaimplementować odpowiedni typu interfejsu np. Action. Listner Dana klasa może implementować wiele nasłuchiwaczy Każde zdarzenie ma typ i informację o źródle Generatorami zdarzeń są przeważnie komponenty bądź modele event source Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zdarzenia n n n Zdarzenia powinny być mały obiektami ponieważ obsługiwane są przez główny

Zdarzenia n n n Zdarzenia powinny być mały obiektami ponieważ obsługiwane są przez główny wątek zajmujący się również rysowaniem Dłuższe operacje powinny być wykonywane w nowym wątku Podejścia do implementacji nasłuchwiaczy: ¨ ¨ ¨ n osobna klasa implementacja jako klasa prywatna wykorzystanie klasy Event. Handler dla prostych zdarzeń Każde ze zdarzeń dziedziczy z typu Event. Object, natomiast jest przeważnie uszczegółowiany np. (Mouse. Event) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Typy zdarzeń n Zdarzenia niskopoziomowe (Low-Level Events) niskopoziomowe zdarzania w ramach okna oraz wejścia

Typy zdarzeń n Zdarzenia niskopoziomowe (Low-Level Events) niskopoziomowe zdarzania w ramach okna oraz wejścia ¨ Przykłady: Mouse. Event, Key. Event ¨ n Zdarzenia semantyczne (Semantic Events) Mogą być odpalane przez wejście użytkownika lub pojawienie się danych ¨ Przykłady: Action i Item ¨ n Zaleca się nasłuchiwanie zdarzeń semantyczny niż niskopoziomowych, gdyż pozwala to na przenaszalność aplikacji Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Interfejsy n Jeden interfejs może mieć więcej niż jedną metodą. Np. Mouse. Listner zawiera

Interfejsy n Jeden interfejs może mieć więcej niż jedną metodą. Np. Mouse. Listner zawiera metody: mouse. Pressed, mouse. Released, mouse. Entered, mouse. Exit i mouse. Click n Zgodnie z założeniami Javy należy zaimplementować wszystkie funkcje interfejsu, jednak nieużywane mogą mieć puste ciało Zestaw Interfejsów i Adapterów: http: //java. sun. com/docs/books/tutorial/uiswing/events/api. html Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Adapter Każdy nasłuchiwać interfejs może mieć kilka typów adapterów n Adapter implementuje wszystkie metody

Adapter Każdy nasłuchiwać interfejs może mieć kilka typów adapterów n Adapter implementuje wszystkie metody interfejsu z pustym ciałem n Klas, która ma obsługiwać dany typ zdarzeń dziedziczy po klasie adapter n Wybrane metody należy przeładować n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Klasy wewnętrzne i anonimowe klasy wewnętrzne n n Problem: wykorzystać adapter ale bez konieczności

Klasy wewnętrzne i anonimowe klasy wewnętrzne n n Problem: wykorzystać adapter ale bez konieczności dziedziczenia przez klasę publiczną? Np. aplet dziedziczy już po klasie Applet, więc de facto nie może implementować adaptera Rozwiązanie: ¨ ¨ n n stworzyć klasę wewnętrzną stworzyć klasę anonimową Wydajność: szybkość uruchomienia aplikacji oraz wielkość pamięci zależna od ilości załadowanych klas Jeśli klasa nie będzie zadeklarowana jako statyczna, ma ona dostęp do pól klasy, w której się znajduje. public class My. Class extends Applet {. . . cos. add. Mouse. Listener(new My. Adapter()); . . . class moj. Adapter extends Mouse. Adapter { public void mouse. Clicked(Mouse. Event e) { //implementacja obsługi zdarzenia } } } public class My. Class extends Applet {. . . cos. add. Mouse. Listener(new Mouse. Adapter() { public void mouse. Clicked(Mouse. Event e) { //implementacja obsługi zdarzenia } }); . . . } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Klasa Event. Handler n n n Klasa Event. Handler wspiera dynamiczne generowanie prostego jednowyrażeniowego

Klasa Event. Handler n n n Klasa Event. Handler wspiera dynamiczne generowanie prostego jednowyrażeniowego nasłuchiwacza zdarzeń Pozwala uprościć strukturę kodu Zwiększa wydajność aplikacji – nie potrzeba wczytywać dodatkowych klas (wielokrotna implementacja klasy dla tego samego typu interfejsu) Wykorzystanie Event. Handler uniemożliwia wykrycie błędu podczas komplikacji. W przypadku błędu w trakcie wykonywania programu rzuci obrzydliwy wyjątek. Umożliwia rozseparowanie logiki aplikacji od grafiki //zastosowanie Event. Handler my. Button. add. Action. Listener((Act ion. Listener)Event. Handler. cre ate(Action. Listener. class, frame, "to. Front")); //zastosowanie klasy wewnetrznej my. Button. add. Action. Listener(new Action. Listener() { public void action. Performed(Action. Event e) { frame. to. Front(); } }); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zastosowania Event. Handler n Umożliwia szybki dostęp do właściwości zdarzenia i ustawia wartość na

Zastosowania Event. Handler n Umożliwia szybki dostęp do właściwości zdarzenia i ustawia wartość na obiekcie źródłowym n Umożliwia szybki dostęp do właściwości obiektu generatora zdarzeń i ustawienie na docelowym elemencie //uzycie Event. Handler. create(Action. Listener. c lass, my. Button, "next. Focusable. Component", "source") //uzycie Event. Handler. create(Action. Listener. c lass, my. Button, "label", "source. text") //uzycie klasy wewnetrznej new Action. Listener() { public void action. Performed(Action. Event e) { my. Button. set. Next. Focusabl e. Component((Component)e. get. Source ()); } } //uzycie klasy wewnetrznej new Action. Listener() { public void action. Performed(Action. Event e) { my. Button. set. Label(((JTex t. Field)e. get. Source()). get. Text()); } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Lista nasłuchiwaczy wspieranych przez wszystkie kompnenty n n Component Listener – nasłuchuje zdarzeń związanych

Lista nasłuchiwaczy wspieranych przez wszystkie kompnenty n n Component Listener – nasłuchuje zdarzeń związanych ze zmianą wielkości, widoczności oraz pozycji komponentu Focus Listener – sprawdza, czy komponent jest ustawiony fokus Key Listener – zdarzenia odpalane są tylko przez komponent, na którym jest fokus Mouse Listener – nasłuchuje kliknięcia, przytrzymania klawisza, ruchu myszki wewnątrz lub poza komponent n n n Mouse-Montion Listener – nasłuchuje zmian pozycji kursora Mouse-Wheel Listener – ruch kółka myszki ponad komponentem Hierarchy Bound Listner – zmiany w hierarchii zawierania komponentów dotyczący pozycji oraz skalowania Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykładowy nasłuchiwacz: Compnent Listener n Nasłuchuje zdarzeń generowanych przez komponent tj. : Zmiana pozycji

Przykładowy nasłuchiwacz: Compnent Listener n Nasłuchuje zdarzeń generowanych przez komponent tj. : Zmiana pozycji ¨ Zmiana rozmiar ¨ Ukrycie ¨ n n Adapter Compenent Adapter Kolejne kroki przy pisaniu Compnent Listner: Deklaracja klasy implementującej nasłuchiwacz ¨ Wybranie komponentu, który przechwyci zdarzenia ¨ Dodanie nasłuchiwacza do wybranych komponentów ¨ Obsłużenie zdarzeń: Hidden, Shown, Resized, Moved ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykładowy nasłuchiwacz: Container Listener n Służy do pobierania zdarzeń generowanych na poziomie kontenera ¨

Przykładowy nasłuchiwacz: Container Listener n Służy do pobierania zdarzeń generowanych na poziomie kontenera ¨ dodanie/usunięcie kontenera public class Container. Event. Demo implements Container. Listener {. . . przycisk = new JPanel(new Grid. Layout(1, 1)); przycisk. add. Container. Listener(this); . . . public void component. Added(Container. Event e) { display. Message(" dodano ", e); } public void component. Removed(Container. Event e) { display. Message(" usunieto ", e); } void display. Message(String akcja, Container. Event e) { wyswietlacz. append(((JButton)e. get. Child()). get. Text() + " was" + action + e. get. Container(). get. Class(). get. Name() + newline); }. . . } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przyciski (Buttons) n Przycisk umożliwia: Wyświetlanie tekstu i obrazów ¨ Przypisanie skrótów (podświetlenie litery

Przyciski (Buttons) n Przycisk umożliwia: Wyświetlanie tekstu i obrazów ¨ Przypisanie skrótów (podświetlenie litery w przycisku – tzw. mnemonic) ¨ Wyświetlanie podpowiedzi (Tool. Tip) ¨ wyświetlenie tekstu formatowanego w HTML ¨ n Nasłuchiwacze: ¨ n Action Listner Ustawienie standardowego przycisku (set. Default. Button) //stworzenie przycisku b 1 = new JButton(„Nazwa", Icon); //ustawienie skrótu set. Mnemonic(Key. Event. VK_M ) //ustawnie nazwy akcji b 1. set. Action. Command(„akcja") //ustawienie Action Listner b 1. add. Action. Listener(this); //ustawienie podpowiedzi b 1. set. Tool. Tip. Text(„porada”) //wylaczenie przycisku b 3. set. Enabled(false); //Obsluga zdarzenia public void action. Performed(Action. Event e) { if(„Nazwa". equals(e. get. Action. Command () )) { b 2. set. Enabled(false); … Więcej informacji: http: //java. sun. com/docs/books/tutorial/uiswing/components/button. html#abstractbutton Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Check Boxes & Przycisk Radio n n CB stanowi grupę, w której wszystkie, kilka

Check Boxes & Przycisk Radio n n CB stanowi grupę, w której wszystkie, kilka bądź żaden może zostać zaznaczony JCheck. Box i JCheck. Box. Menu. Item dziedziczą z Abstract. Button – możliwość umieszczania CB w Menu Możliwość formatowania CB podobnie jak przycisku Przycisk Radio – możliwość zaznaczenia wyłączenie jednego przycisku pierwszy. Button = new JCheck. Box(„pierwszy"); pierwszy. Button. set. Mnemonic(Key. Event. VK_P ); //zaznaczanie przycisku pierwszy. Button. set. Selected(true ); drugi. Button = new JCheck. Box(„Drugi"); drugi. Button. set. Mnemonic(Key. Event. VK_G ); drugi. Button. set. Selected(true ); //obsluga zdarzen pierwszy. Button. add. Item. Listener(this ); public void item. State. Changed(Item. Event e) {. . . Object source = e. get. Item. Selectable(); if (source == pierwszy. Button) { //TODO } else if (source == drugi. Button) { Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Grupowanie przycisków n n n Możliwość dodania różnych RB lub CB do wybranej grupy

Grupowanie przycisków n n n Możliwość dodania różnych RB lub CB do wybranej grupy Button. Group Umieszczanie innych rodzajów przycisków poza RB lub CB nie ma sensu, ponieważ nie implementują stanu włączony/wyłączony Kroki przy tworzeniu grupy przycisków ¨ Stwórz podklasę JFrame ¨ Wywołaj Context. Pane razem z layout manager ¨ Zadeklaruj zbiór przycisków radio ¨ Stwórz obiekt Button. Group ¨ Wołaj metodę add na obiekcie buttongroup w celu dodania każdego przycisku do grupy Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Color Chooser n n n Paleta kolorów z funkcjonalnością wyboru Paleta składa się z

Color Chooser n n n Paleta kolorów z funkcjonalnością wyboru Paleta składa się z dwóch części: zestawu kolorów oraz podglądu CC wykorzystuje Color. Selection. Model obsługuje RGB, HSB Color. Selection. Model odpala zdarzenia po każdej zmianie koloru Pokazywanie CC jako okno dialogowe Możliwość usunięcia panelu do poglądu, po przez ustawienie panelu bez rozmiaru cc = new JColor. Chooser(o. get. Foreground()); //wykorzystanie Color. Selection. Model cc. get. Selection. Model(). add. Change. Listener(this); . . . public void state. Changed(Change. Event e) { Color new. Color = cc. get. Color(); obraz. set. Foreground(new. Color); } Color new. Color = JColor. Chooser. show. Dialog( Color. Chooser. Demo 2. this, "Choose Background Color", banner. get. Background()); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Kontenery najwyższego poziomu n n n Kontener najwyższego poziomu Kontenery najwyższego poziomu (top-level) to:

Kontenery najwyższego poziomu n n n Kontener najwyższego poziomu Kontenery najwyższego poziomu (top-level) to: JFrame, JDialog i JApplet Każde komponent musi przynależeć do hierarchii komponentów. Hierarchia (conatainment hierarchy) jest to drzewo, którego liśćmi są komponenty, a korzeniem kontener najwyższego poziomu. W przypadku, gdy są trzy top-level kontenery wówczas mamy 3 hierarchie Każdy kontener najwyższego poziomu zawiera tzw. content pane, do którego dodawane są komponenty Menu Bar – jest uznawany jako kontener najwyższego poziomu, ale poza content pane JFrame Content. Pane Menu. Bar JFrame JMenu. Bar Layered Pane Dodawanie komponentu okno. get. Content. Pane(). add( yellow. Label, Border. Layout. CENTER); JLabel Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007 Content. Pane

JCompnent n n Wszystkie komponenty Swingowe z „J” dziedziczą po JCompnent. Np. JPanel, JButton,

JCompnent n n Wszystkie komponenty Swingowe z „J” dziedziczą po JCompnent. Np. JPanel, JButton, etc… JCompnent rozszerza Container, a Container rozszerza Component. Compnent udostępnia generowanie zdarzeń i rysowanie. ¨ Container umożliwia dodawanie do niego komponentów i rozkładanie ich ¨ n Wszystkie komponenty ¨ ¨ ¨ ¨ ¨ Porady - Tool tips – tekst pomocniczy. Ustawiane za pomocą metody: set. Tool. Tip. Text Rysowanie i obramowanie. set. Boreder pozwala zdefiniować obramowanie komponentu. Rysowanie realizowane jest w metodzie paint. Component Look and feel. Charakterystyczne właściwości. Możliwość umieszczania dodatkowych informacji put/get. Client. Property Wsparcie dla rozkładu Wsparcie dla osób niepełnosprawnych Wsparcie dla drag ‘n’ drop Podwójne buforowanie Wsparcie dla klawiatury Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Text Component JText. Compnent JText. Field JFormatted. Text. Field JPasswor. Field Kontrolki tekstowe Obszar

Text Component JText. Compnent JText. Field JFormatted. Text. Field JPasswor. Field Kontrolki tekstowe Obszar tekstu Formatowane obszary tekstu Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

JText. Component n JText. Component udostępnia następującą funkcjonalność: ¨ model document, który zarządza treścią

JText. Component n JText. Component udostępnia następującą funkcjonalność: ¨ model document, który zarządza treścią komponentu ¨ view sposób wyświetlania dokumentu na ekranie ¨ sterownik zwany editor kit, który implementuje zdarzenia wykorzystywane przy edycji tekstu ¨ wsparcie dla funkcji cofnij i ponów (undo/redo) ¨ filtry do nawigowania po dokumencie oraz zdarzenia dla „karetki” (caret) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Dokument n n n Rozdzielenie widoku od danych Klasa document implementuje document interfejs Dokument

Dokument n n n Rozdzielenie widoku od danych Klasa document implementuje document interfejs Dokument udostępnia funkcjonalność: ¨ ¨ ¨ n zawiera tekst w elementach, które mogą odnosić się do paragrafu, logicznej struktury umożliwia edycję po przez wołanie metod remove i insert. String nasłuchiwacze do zmian wprowadzanych w tekście zarządza obiektem Position, który śledzi pozycję podczas wprowadzania zmian do tekstu pozwala na uzyskanie informacji o długości tekstu, segmentach tekstu, etc… Interfejs Styled. Document pozwala na zaznaczanie tekstu określonym stylem Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Nasłuchiwacz dla zmian n Dwa rodzaje nasłuchiwaczy: ¨ ¨ n Nasłuchiwacza dla zmian w

Nasłuchiwacz dla zmian n Dwa rodzaje nasłuchiwaczy: ¨ ¨ n Nasłuchiwacza dla zmian w dokumencie odbiera zdarzenia: ¨ ¨ ¨ n n dla dokumentu dla obsługi funkcji cofnij/ponów wstawiania usuwania zmiany stylu tekstu Style. Document pozwala na generowanie wszystkich zdarzeń. Plain. Document umożliwia generowanie wyłączenie zdarzeń dotyczących wstawiania/usuwania doc. add. Document. Listener(new My. Document. Listener()); protected class My. Document. Listener implements Document. Listener { public void insert. Update(Document. Event e) { display. Edit. Info(e); } public void remove. Update(Document. Event e) { display. Edit. Info(e); } public void changed. Update(Document. Event e) { display. Edit. Info(e); } private void display. Edit. Info(Document. Event e) { Document document = (Document)e. get. Document(); int change. Length = e. get. Length(); change. Log. append(e. get. Type(). to. String() + ": " + change. Length + " character" + ((change. Length == 1) ? ". " : "s. ") + " Text length = " + document. get. Length() + ". " + newline); } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007