Uniwersytet dzki Wydzia Matematyki i Informatyki Katedra Analizy

  • Slides: 44
Download presentation
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej AWT cd. . Java Wykład

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

Plan wykładu Manager rozkładu n Zdarzenia w AWT n Grafika 2 D w AWT

Plan wykładu Manager rozkładu n Zdarzenia w AWT n Grafika 2 D w AWT n Omówienie przykładowych pakietów n Wyjątki n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Layout Manager n Menadżer rozkładu przypisany jest do każdego kontenera ¨ ¨ n n

Layout Manager n Menadżer rozkładu przypisany jest do każdego kontenera ¨ ¨ n n Prosty dla prostych rozkładów, jednakże bardzo ciężko jest projektować programy zawierające wiele elementów w pojedynczym menadżerze rozkładu. W celu zarządzania złożonymi rozkładami należy: ¨ ¨ n n Ustala pozycję i wielkość dla komponentu w oknie Pomocny przy organizowaniu zawartości okna, które zmienia rozmiar lub jest wyświetlane na różnych systemach Używać zagnieżdżonych kontenerów – każdy z własnym layout manager Używać niewidzialne komponenty oraz opcji menadżerów rozkładów Pisać własne layout manager Wyłączyć niektóre layout manager i zarządzać komponentami manualnie. Wszystkie Layout Manager implementują Layout Manager Interface add() metod wykorzystywana jest do dodawania komponentu. Pierwszym argumentem jest nazwa strefy, a drugim komponent. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Flow. Layout Manager n n Domyśłny dla Panel, JPanel, Applet Zachowanie: ¨ ¨ n

Flow. Layout Manager n n Domyśłny dla Panel, JPanel, Applet Zachowanie: ¨ ¨ n n Zmienianie rozmiaru komponentów do ich najlepszego rozmiaru Umieszczanie komponentów w rzędzie od lewej do prawej od góry do dołu Wiersze są wyśrodkowane domyślnie Konstruktor Flow. Layout() – wyśorodkowuje każdy wiersz i utrzymuje 5 px. odstępy pomiędzy komponentami i wierszami ¨ Flow. Layout(int alignment) – utrzymuje 5 px odstępy w wierszu, ale zmienia wyrównanie w wierszach: Flow. Layout. LEFT, Flow. Layout. RIGHT, Flow. Layout. CENTER ¨ Flow. Layout(int alignment, int h. Gap, int v. Gap) – pozwala specyfikować wyrównanie w wierszach jak i również odstęp poziomy i poionowy pomiędzy komponentami w [px]. ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Border. Layout Manager n Każdy z komponentów może być włożony do kontenera w jedną

Border. Layout Manager n Każdy z komponentów może być włożony do kontenera w jedną z lokalizacji: ¨ North ¨ South ¨ East ¨ West ¨ Center Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Grid. Layout n Zachowanie ¨ n n n Podział okna na równej wielkości prostokąty

Grid. Layout n Zachowanie ¨ n n n Podział okna na równej wielkości prostokąty bazujące na liczbie wierszy i kolumn podanych jako argument. Komponenty umieszczane są w komórkach w kolejności od lewej do prawej od góry do dołu w porządku dodawania do kontenera posiadającego ten rozkład Ignoruje preferowany rozmiar komponentu. Każdy komponent jest skalowany i dopasowywany do komórki Zbyt mała liczba komponentów powoduje pozostawienie wolnego miejsca w postaci białych prostokątów Zbyt wiele komponentów powoduje nieplanowane dodanie nowych kolumn Grid. Layout() ¨ n Tworzy pojedynczy wiersz z jedną kolumną zaalokowana dla każdego komponentu. Grid. Layout(int rows, int cols) Dzieli okno zgodnie z podaną liczbą kolumn oraz wierszy ¨ Liczba kolumn lub wierszy może być zero ¨ n Grid. Layout(int rows, int cols, int h. Gap, int v. Gap) ¨ Pozwala na wyspecyfikowanie przestrzeni pomiędzy poszczególnymi komórkami Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Grid. Bag. Layout n Zachowanie ¨ n n Dzieli okno na komórki, w których

Grid. Bag. Layout n Zachowanie ¨ n n Dzieli okno na komórki, w których komponenty mogą mieć różne rozmiary Dużo wygodniejsze i bardziej elastyczne niż inne standardowe menadżerzy rozkładów, jednakże dużo trudniejsze w użyciu: Każdy komponent zarządzany przez Grid. Bag. Layout skojarzony jest z Grid. Bag. Constraints, który definiowany jest przez: ¨ ¨ ¨ jak komponent jest rozkładany w wyświetlanym obszarze w której komórce komponent się rozpoczyna i kończy jak komponent rozciąga się, kiedy przestrzeń się zwiększa wyrównanie w komórkach Java 5 wprowadziła Spring. Layout, który jest podobny jednakże bardziej funkcjonalny/elastyczny ale również bardzo złożony. Stosowany przy projektowaniu GUI np. w netbeans. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Użycie Grid. Bag. Layout n Ustawienie rozkładu i zachowanie go w zmiennej referencyjnej: ¨

Użycie Grid. Bag. Layout n Ustawienie rozkładu i zachowanie go w zmiennej referencyjnej: ¨ ¨ n Przygotowanie objektu Grid. Bag. Constraints ¨ n constraints. gridx = x 1; constraints. gridy = y 1; constraints. gridwidth = width 1; constraints. gridheight = height 1; Dodanie 1 komponentu do okna uwzględniając jego Grid. Bag. Constraints ¨ n Grid. Bag. Constraints constraints = new Grid. Bag. Constraints(); Ustawienie Grid. Bag. Constraints dla jednego komponentu: ¨ ¨ n Grid. Bag. Layout layout = new Grid. Bag. Layout(); set. Layout(layout); add(component 1, constraints); Powtórzenie kroków dla pozostałych komponentów Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Pola w Grid. Bag. Constrains n gridx, gridy Specyfikuje górny lewy róg komponentu ¨

Pola w Grid. Bag. Constrains n gridx, gridy Specyfikuje górny lewy róg komponentu ¨ Najwyższa komórka jest lokowana w (gridx, gridy)=(0, 0) ¨ n n n Ustawienie Grid. Bag. Constraints. RELATIVE w sytuacji autoinkrementacji kolumn wierszy Grid. Bag. Constraints constraints = new Grid. Bag. Constraints(); constraints. gridx = Grid. Bag. Constraints. RELATIVE; container. add(new Button(„ 1"), constraints); container. add(new Button („ 2")); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Wyłączenie menadżera rozkładu n Zachowanie ¨ Jeśli rozkład jest ustawiony jako null, wówczas komponenty

Wyłączenie menadżera rozkładu n Zachowanie ¨ Jeśli rozkład jest ustawiony jako null, wówczas komponenty muszą być rozmieszczane i skalowane ręcznie. ¨ Pozycjonowanie i skalowanie komponentów: component. set. Size(width, height) n component. set. Location(left, top) n lub component. set. Bounds(left, top, width, height) n Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Wskazówki przy używaniu Layout Manager n Używaj zagnieżdżonych kontenerów ¨ n n n Nie

Wskazówki przy używaniu Layout Manager n Używaj zagnieżdżonych kontenerów ¨ n n n Nie próbuje dopasować na siłę swojego złożonego rozkładu elementów do jednego menadżera rozkładu. Staraj się podzielić projekt w sekcje. Skorzystaj z Panel jako sekcji wykorzystując do tego jego własny layout manager Wyłącz menadżera rozkładu dla niektórych kontenerów, w których nie ma zbyt wielu elementów i można zarządzać nimi ręcznie. Dopasuj puste miejsce wokół komponentów: Po przez zmianę rozmiaru przestrzeni przydzielonej standardowo przez menadżera rozkładu ¨ Użyj Płótna lub Box (w Swing) jako niewidzialnych elementów oddzielających komponenty ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Menadżer rozkładu podsumowanie n n Inne rozkłady: Box. Layout, Card. Layout Domyślne layout managers

Menadżer rozkładu podsumowanie n n Inne rozkłady: Box. Layout, Card. Layout Domyślne layout managers ¨ ¨ n n n Dla apletu i panelu: Flow. Layout Dla okienka i dialog Border. Layout Menadżer rozkładu respektuje preferowany rozmiar komponentu w różny sposób Grid. Bag. Layout jest najbardziej skomplikowanym rozkładem ale jednocześnie najbardziej funkcjoanlnym/elastycznym Grid. Bag. Constraints wykorzstywany w przypadku konieczności wyspecifikowania rozkładu dla każdego komponentu Złożone rozkłady mogą być uproszczone przez zastosowanie zagnieżdżonych kontenerów W AWT jako element odzielający wykorzystuje się Canavas a w Swing Box Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zdarzenia (Events) n n Cel: potrzeba dowiedzenia się o czymś, co wydarzyło się poza

Zdarzenia (Events) n n Cel: potrzeba dowiedzenia się o czymś, co wydarzyło się poza obiektem. Zdarzenie (Event) – nośnik informacji o zajściu określonej sytuacji ¨ ¨ n n Przykład 1: użytkownik wciska przycisk na ekranie Przykład 2: Przyjście pewnej porcji informacji na port serwera (aplikacja web chat) Obiekt, w którym pojawiło się zdarzenie – generator zdarzeń (event generator). Np. przycisk na ekranie. Obiekt, który wykona pewne zadanie po otrzymaniu zdarzenia – event handler. Dla wybranego zdarzenia może być wiele event handlers, które mogą wykonać różne zadania. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Mechanizm obsługi zdarzeń n n n Archaiczne podejście do obsługi zdarzeń: polling. Przebieganie stanu

Mechanizm obsługi zdarzeń n n n Archaiczne podejście do obsługi zdarzeń: polling. Przebieganie stanu obiektów w pętli. Podejście absorbujące dużą ilość zasobów (olbrzymia pętla). Generator zdarzeń udostępnia usługę rejestracji – pamięta, do których event handlers powinien przekazać zdarzenia Rejestracja event handlers u generatora zdarzeń Wykorzystanie diagramów MSC do modelowania systemów sterowanych zdarzeniami. Message Driven Application - Zastosowania w systemach rozproszonych. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Mechanizm obsługi zdarzeń w Javie n n n Generatory zdarzeń udostępnia JVM. Programista implementuje

Mechanizm obsługi zdarzeń w Javie n n n Generatory zdarzeń udostępnia JVM. Programista implementuje wyłączenie zachowanie event handlers – tzw. nasłuchiwaczy (listeners). W razie wyszukanych potrzeb programista może jednak zaimplementować własne generatory zdarzeń. Po implementacji event handlers należy zarejestrować go u właściwego generatora zdarzeń Przykład: Java Button n Generuje zdarzenia Action. Events n Nasłuchiwacz rejestruje się u Java Button po przez wywołanie metody add. Action. Listner z parametrem wskazującym kto będzie nasłuchiwał. Metoda ta generuje wiadomość add. Action. Listener n Java Button pamięta, kto się u niego zarejestrował (automatyczny mechanizm dostarczany przez JVM) n W momencie wystąpienia zdarzenia w Java Button, Java Button generuje wiadomość action. Performed, do każdego z zarjestrowanych nasłuchiwaczy. n Listner powinien mieć zaimplementowaną metodę action. Performed, która zostanie wywołana przez JVM w momencie otrzymania wiadomości Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Mechanizm obsługi zdarzeń diagram MSC Button = new Button(„Klik!"); Button. add. Action. Listener(new Nasluchiwacz());

Mechanizm obsługi zdarzeń diagram MSC Button = new Button(„Klik!"); Button. add. Action. Listener(new Nasluchiwacz()); // rejestracja class Nasluchiwacz implements Action. Listener { public void action. Performed(Action. Event e) { System. out. println(„nasinieto przycisk"); // wykonanie zadania } } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykład 2 – hierarchia generowania zdarzeń przez komponenty. n public boolean handle. Event(Event e)

Przykład 2 – hierarchia generowania zdarzeń przez komponenty. n public boolean handle. Event(Event e) ¨ n n e – parametr z referencją na zdarzenie, które powstało Ważna jest wartość zawracana przez handle. Event. Informuje JVM, czy zdarzenie zostało w pełni obsłużone Zdarzenie propaguje w górę drzewa, do momentu, kiedy nie zostanie poprawnie obsłużone Źródło: http: //www. javaworld. com/javaworld/jw-08 -1996/jw-08 -event. html? page=1 Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Metody pomocnicze do obsługi zdarzeń n n n W przypadku konieczności obsłużenia wybranych zdarzeń

Metody pomocnicze do obsługi zdarzeń n n n W przypadku konieczności obsłużenia wybranych zdarzeń można skorzystać z funkcji pomocniczych Metoda pomocnicza zwraca wartość false w przypadku, gdy zdarzenie zostanie w pełni obsłużone Przykład 3 n n n action(Event evt, Object what) got. Focus(Event evt, Object what) lost. Focus(Event evt, Object what) mouse. Enter(Event evt, int x, int y) mouse. Exit(Event evt, int x, int y) mouse. Move(Event evt, int x, int y) mouse. Up(Event evt, int x, int y) mouse. Down(Event evt, int x, int y) mouse. Drag(Event evt, int x, int y) key. Down(Event evt, int key) key. Up(Event evt, int key) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykładowy zestaw zdarzeń Przykłady zdarzeń n Window Events ¨ ¨ ¨ n KEY_PRESS KEY_RELEASE

Przykładowy zestaw zdarzeń Przykłady zdarzeń n Window Events ¨ ¨ ¨ n KEY_PRESS KEY_RELEASE KEY_ACTION_RELEASE (401) (402) (403) Mous Events ¨ ¨ ¨ n (201) (202) (203) (204) (205) Keyboard Events ¨ ¨ n WINDOW_DESTROY WINDOW_EXPOSE WINDOW_ICONIFY WINDOW_DEICONIFY WINDOW_MOVED MOUSE_DOWN MOUSE_UP MOUSE_MOVE MOUSE_ENTER MOUSE_EXIT MOUSE_DRAG 501 502 503 504 505 Różne zdarzenia ¨ ¨ ¨ ACTION_EVENT LOAD_FILE SAVE_FILE GOT_FOCUS LOST_FOCUS 1001 1002 1003 1004 Źródło: http: //www. unix. org. ua/orelly/javanut/figs/jn 2_2001. gif Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Klasa Event n n n n long when Chwila, w które zdarzenie wystąpiło. int

Klasa Event n n n n long when Chwila, w które zdarzenie wystąpiło. int id Typ zdarzenia (patrz następny slajd) int x Współrzędna X określająca miejsce, w którym zdarzenie się pojawiło w odniesieniu do komponentu, który jest aktualnie przetwarzany. Początkowa wartość x jest to górny lewy róg. int y Współrzędna X określająca miejsce, w którym zdarzenie się pojawiło w odniesieniu do komponentu, który jest aktualnie przetwarzany. Początkowa wartość x jest to górny lewy róg. int key Dla zdarzeń pochodzących z klawiatury. Jest to kod wciśniętego klawisza. Przeważnie jest to wartość zapisana w postaci unicode. int modifiers arytmetyczna reprezentacja wartości SHIFT_MASK, CTRL_MASK, META_MASK, and ALT_MASK. Wartość zostaje zmieniona odpowiednio dla zmiany stanu klawiszy shift, control, meta, alt. int click. Count Liczba kliknięć myszy. Pole te jest istotne wyłącznie przy zdarzeniu MOUSE_DOWN. Object arg Zależny od zdarzenia argument. Dla obiektów Button, object jest ciągiem znaków, który zawiera jego etykietę. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Przykład 1. Aplikacja obsługująca zdarzenia Źródło: http: //www. javaworld. com/javaworld/jw-08 -1996/jw-08 -event. html Wydział

Przykład 1. Aplikacja obsługująca zdarzenia Źródło: http: //www. javaworld. com/javaworld/jw-08 -1996/jw-08 -event. html Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Java 2 D n n Java 2 D API umożliwia pracę z obrazami, tekstem

Java 2 D n n Java 2 D API umożliwia pracę z obrazami, tekstem i grafiką jako rozszerzenie AWT Zakres dostarczanej funkcjonalności: ¨ ¨ ¨ ¨ Ujednolicony model renderingu dla różnych rodzajów wyświetlaczy i drukarek (user space) Duży zbiór różnych podstawowych kształtów geometrycznych takich jak: prostokąty, krzywe, elipsy jak i również mechanizm do renderowania dowolnych kształtów. Mechanizm dla wykrywania kilknięć na kształtach, tekście i obrazkach Sterowanie sposobem rednerowania zachodzących na siebie obiektów Zarządzanie kolorami Wsparcie dla wydruków złożonych dokumentów Sterowanie jakością renderowanych obiektów (anty-aliasing) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Układ współrzędnych n Java 2 D rozróżnia dwa układy współrzędnych Przestrzeń użytkownika (user space)

Układ współrzędnych n Java 2 D rozróżnia dwa układy współrzędnych Przestrzeń użytkownika (user space) – miejsce, w którym obiekty są specyfikowane ¨ Przestrzeń urządzeń (device space) – układ współrzędnych związanych z urządzeniem, na którym ma zostać wyświetlona wyspecyfikowana grafika np. monitor, drukarka, Typem dla x i y jest integer. Wspierany jest również float i double. (0, 0) x ¨ y Przy transformacji przestrzeni użytkownika do przestrzeni urządzenia punktem odniesienia jest lewy górny róg. Wartości x, y rosną odpowiednio w dół i w prawo Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Java 2 D rendering n n Java udostępnia wspólny mechanizm modelowania grafiki dla różnych

Java 2 D rendering n n Java udostępnia wspólny mechanizm modelowania grafiki dla różnych urządzeń W przypadku konieczności wyświetlenia/wykreślenia danego kształtu wywoływane są automatycznie metody paint() lub update() z kontekstem graficznym Graphics. Metody te zawiera każdy obiekt rozszerzający Component. n Pakiet java. awt. Graphics 2 D oferuje następujące możliwości: rysowanie podstawowych kształtów geometrycznych z uwzględnieniem krawędzi (metody draw) ¨ wypełnianie kształtów kolorem lub określonym wzorem (metody fill) ¨ rysowanie tekstu (draw. String). Określenie czcionki wskazuje w jaki sposób ma być danych tekst przekształcony w obiekt graficzny, który jest wypełniony kolorem lub wzorem ¨ rysowanie obrazków (metoda draw. Image) ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Metody wykorzystywane przy rysowaniu w Java 2 D n Metody do rysowania można podzielić

Metody wykorzystywane przy rysowaniu w Java 2 D n Metody do rysowania można podzielić na dwie grupy Metody definiujące kształt (metody draw, fill) ¨ Metody określające w jaki sposób ten kształt ma być narysowany – zmiana atrybutów kontekstu (Graphics) ¨ n W celu użycia dodatkowych funkcjonalności oferowanych przez Java 2 D należy rzutować obiekt typu Graphics na Graphics 2 D public void paint (Graphics g) { Graphics 2 D g 2 = (Graphics 2 D) g; . . . } n Możliwość modyfikacji atrybutów związanych z określonym kontekstem ¨ ¨ ¨ ¨ modyfikacja szerokości linii/krawędzi rysunku zmiana sposobu łączenia linii/krawędzi przekształcanie rysunku: obracanie skalowanie lub przycinanie określanie koloru i wzoru wypełnienia kształtu określenie w jaki sposób obiekty są ze sobą skomponowane określanie czcionki definiowanie współczynnika jakość/wydajność (aliasing) Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Java 2 D vs AWT public void paint(Graphics g) { // ustawianie atrybutów pędzela

Java 2 D vs AWT public void paint(Graphics g) { // ustawianie atrybutów pędzela g. set. Color(some. Color); g. set. Font(some. Limited. Font); // kreślenie kształtów g. draw. String(…); g. draw. Line(…) g. draw. Rect(…); // outline g. fill. Rect(…); // solid g. draw. Polygon(…); // outline g. fill. Polygon(…); // solid g. draw. Oval(…); // outline g. fill. Oval(…); // solid //etc… } public void paint. Component(Graphics g) { // czyszczenie obrazu super. paint. Component(g); // rzutowanie kontekstu na konteskt Java 2 D Graphics 2 D g 2 d = (Graphics 2 D)g; // Set pen parameters g 2 d. set. Paint(fill. Color. Or. Pattern); g 2 d. set. Stroke(pen. Thickness. Or. Pattern); g 2 d. set. Composite(some. Alpha. Composite); g 2 d. set. Font(any. Font); g 2 d. translate(…); g 2 d. rotate(…); g 2 d. scale(…); g 2 d. shear(…); g 2 d. set. Transform(some. Affine. Transform); // definiowanie własnego kształtu Some. Shape s = new Some. Shape(…); // rysowanie kształtu g 2 d. draw(s); // outline g 2 d. fill(s); // solid } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Figury podstawowe - rysowanie (1) n n Java 2 D API udostępnia podstawowe kształty:

Figury podstawowe - rysowanie (1) n n Java 2 D API udostępnia podstawowe kształty: linia, punkt, prostokąt, etc… w pakiecie java. awt. geom Klasy reprezentujące kształty implementują interfejs ¨ ¨ n n Należy uzyskać obiekt typu Graphics 2 D Każda funkcja wymaga zdefiniowana punktu zaczepienia ¨ ¨ n Shape: pozwala opisać krzywą Path. Iterator: określa w jaki sposób są pobierane elementy krzywej. np. java. awt. Graphics. draw. Line(int x 1, int y 1, int x 2, int y 2). (x 1, y 1) początek linii, a (x 2, y 2) koniec linii. Jeśli chcemy narysować kształt z Java 2 D możemy użyć funkcji draw ¨ ¨ ¨ g 2. draw(new Line 2 D. Double(x 1, y 1, x 2, y 2)); lub Line 2 D. Float(float X 1, float Y 1, float X 2, float Y 2) ; lub Line 2 D. Float(Point 2 D p 1, Point 2 D p 2); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Figury podstawowe - rysowanie (2) n n Krzywe kwadratowe: Quad. Curve 2 D Metoda

Figury podstawowe - rysowanie (2) n n Krzywe kwadratowe: Quad. Curve 2 D Metoda set. Curve – pozwala na określenie dwóch punktów końcowych oraz punktu sterującego krzywą n n n Quad. Curve 2 D q = new Quad. Curve 2 D. Float(); q. set. Curve(0, 0, 200, 600, 400, 0); g 2 d. draw(q); Krzywe sześcienne: Cubic. Curve 2 D Kawałek parametryzowanej krzywej sześciennej Metoda set. Curve analogiczna do metody set. Curve z krzywej kwadratowej poszerzona o drugi punkt kontrlony Cubic. Curve 2 D q = new Cubic. Curve 2 D. Float(); q. set. Curve(0, 0, 50, 100, 400, 0 g 2 d. draw(q); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Figury podstawowe - rysowanie (3) n Klasa Rectangle dziedziczy po Rectangular. Shape i implementuje

Figury podstawowe - rysowanie (3) n Klasa Rectangle dziedziczy po Rectangular. Shape i implementuje interfejs Shape oraz kilka dodatkowych metod pozwalających na określenie położenia, rozmiaru, środka, etc… g 2. draw(new rectangle 2 D. Double(x, y, rectwidth, rectheight)); n n Klasa Round. Rectangle definiuje prostokąt z zaokrąglonymi wierzchołkami. Do wyspecyfikowania prostokąta wymagane są: położenie, wysokość, szerokość, wartość wysokości kąta zaokrąglenia, wartość szeorkości kąta zaokrąglenia g 2. draw(new Round. Rectangle 2 D. Double(x, y, rectwidth, rectheight, 10)); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Figury podstawowe - rysowanie (4) n n Elipsa – krzywa zdefiniowana w typie Ellipse

Figury podstawowe - rysowanie (4) n n Elipsa – krzywa zdefiniowana w typie Ellipse 2 d Do narysowania wymagana jest położenie oraz wysokość i szerokość g 2. draw(new Ellipse 2 D. Double(x, y, rectwidth, rectheight)); n n Łuk – część elipsy. Zdefiniowana w klasie Arc 2 D. Do opisania potrzebne jest: położenie, wysokość i szerokość prostokąta w który jest wpisana elipsa, początek i koniec kąta, typ zamknięcia. Typy zamknięcia: OPEN, PIE, CHORD g 2. draw(new Arc 2 D. Double(x, y, rectwidth, rectheight, 90, 135, Arc 2 D. OPEN)); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Własne kształty n n Do rysowania własnych kształtów została stworzona klasa General. Path implementuje

Własne kształty n n Do rysowania własnych kształtów została stworzona klasa General. Path implementuje interfejs Shape i pozwala rysować krzywe, które złożone są z podstawowych kształtów: linie, krzywe sześcienne i kwadratowe, int x 2 Points[] = {0, 90, 0, 90}; int y 2 Points[] = {0, 40, 0}; General. Path lamana = new General. Path(General. Path. WIND_EVEN_ODD , x 2 Points. length); lamana. move. To (x 2 Points[0], y 2 Points[0]); for (int index = 1; index < x 2 Points. length; index++) { lamana. line. To(x 2 Points[index], y 2 Points[index]); }; g 2. draw(lamana); n Metody do kształtowania General. Path ¨ ¨ ¨ move. To(float x, float y) – przesuń aktualny punkt ścieżki do danego punktu line. To(float x, float y) – dodaj kawałek linii do obecnej ścieżki quad. To(float ctrlx, float ctrly, float x 2, floaty 2) – dodaj krzywą sześcienną do aktualnej ścieżki. curve. To(float ctrlx 1, float ctrly 1, float ctrlx 2, float ctrly 2, float x 3, floaty 3) – dodaj krzywą sześcieną do aktualnej ścieżki close. Path() – zamknij aktualną ścieżkę. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Określenie grubości i rodzaju krawędzi (stroking) oraz wypełnienia n Wygląd kształtów możemy modyfikować po

Określenie grubości i rodzaju krawędzi (stroking) oraz wypełnienia n Wygląd kształtów możemy modyfikować po przez: wypełnienie (filling) – wypełnianie kształtu określonym kolorem, gradientem lub wzorem ¨ określanie krawędzi (stroking) – krawędź może mieć grubość, kolor, styl ¨ n Ażeby narysować kształty należy zmienić przed wywołaniem metody draw ustawienia kontsktu Graphics 2 D. Zaokrąglony prostokąt z przerywaną linią final static float przer 1[] = {10. 0 f}; final static Basic. Stroke przer = new Basic. Stroke(1. 0 f, Basic. Stroke. CAP_BUTT, Basic. Stroke. JOIN_MITER, 10. 0 f, przer 1, 0. 0 f); g 2. set. Stroke(przer); g 2. draw(new Round. Rectangle 2 D. Double(x, y, rect. Width, rect. Height, 10)); Gradient na elpisie czerwon 2 bialy = new Gradient. Paint(0, 0, color. RED, 100, 0, color. WHITE); g 2. set. Paint(czerwony 2 bialy); g 2. fill (new Ellipse 2 D. Double(0, 0, 100, 50)); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Style linii n n Style linii są definiowane przez atrybut krawędzi dla danego kontekstu

Style linii n n Style linii są definiowane przez atrybut krawędzi dla danego kontekstu Graphics W celu ustawienia wybranego stylu linii należy utworzyć instancje Basic. Stroke i ustawić dla kontekstu Graphics za pomocą funkcji set. Stroke. Metoda draw narysuje kształt zgodnie z ustawioną definicją linii n Właściwości stylu linii: Grubość linii ¨ Rodzaj połączenia linii: JOIN_BEVEL, JOIN_MITER, JOIN_ROUND ¨ Styl zakończenia linii: CAP_BUTT, CAP_ROUND, CAP_SQUARE ¨ Przerywanie linii. Ażeby zdefiniować przerywanie linii należy określić długość części widocznej i niewidocznej i umieścić w tablicy ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Wzory wypełnienia n n n Wzory wypełnienia są definiowane jako atrybut procesu malowania Wybranie

Wzory wypełnienia n n n Wzory wypełnienia są definiowane jako atrybut procesu malowania Wybranie wzoru wypełnienia wymaga utworzenia obiektu implementującego interfejs Paint oraz ustawienia go dla wybranego kontekstu graficznego Graphics za pomocą metody set. Paint Trzy klasy implementują interfejs Paint: Color, Gradient. Paint – określony przez punkt, w którym rozpoczyna się dany kolor oraz punkt, w którym kończy się dany kolor. ¨ Texture. Paint – definiowany przez Buffer. Image. Należy wskazać obraz oraz rozmiar prostokąta z obrazem, który będzie powielany ¨ ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Praca z obrazami n n Obrazy są obiektami, które posiadają wysokość i szerokość oraz

Praca z obrazami n n Obrazy są obiektami, które posiadają wysokość i szerokość oraz własny układ współrzędnych Możliwe akcje do wykonania na obrazach: ¨ Ładowanie zewnętrznych obrazów w formatach GIF, PNG, JPEG do wewnętrznej reprezentacji obrazu w Java 2 D ¨ Bezpośrednie tworzenie obrazu i jego renderowanie ¨ Bezpośrednie rysowanie zawartości obrazu na powierzchni przeznaczonej do rysowania ¨ Zapisywanie obrazów w plikach w następujących formatach. GIF, PNG, JPEG. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Klasy związane z obrazami n n java. awt. Image – jest to klasa bazowa

Klasy związane z obrazami n n java. awt. Image – jest to klasa bazowa dla pozostałych klas związanych z obrazami przechowująca informację o obrazie jako tablica pikseli java. awt. image. Bufferd. Image – klasa dziedzicząca po Image umożliwiająca bezpośrednią pracę nad obrazem (np. ustawianie kolorów pikseli). Aplikacje mogą bezpośrednio tworzyć instancję tej klasy Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Klasa Buffered. Image n n Przeprowadzane operacje na obrazie realizowane są bezpośrednio w pamięci

Klasa Buffered. Image n n Przeprowadzane operacje na obrazie realizowane są bezpośrednio w pamięci Udostępnia metody do przechowywania, interpretacji i uzyskiwania danych dotyczących pikseli Może być renderowany przez Graphics lub Graphcis 2 D Buffered. Image określony jest przez: ¨ ¨ Raster Model Koloru (Color. Model). n Funkcje Raster’a: Reprezentuje układ współrzędnych związanych z obrazem ¨ Zarządza danymi dot. obrazu bezpośrednio w pamięci ¨ Udostępnia mechanizm tworzenia różnych podobrazów z pojedynczego bufora z danymi o obrazie ¨ Oferuje metody pozwalające na dostęp do poszczególnych pikseli obrazu ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Czytanie/ładowanie obrazu n n n Java 2 D umożliwia ładowanie obrazu z zewnętrznego formatu

Czytanie/ładowanie obrazu n n n Java 2 D umożliwia ładowanie obrazu z zewnętrznego formatu za pomocą Image I/O API obsługuje następujące formaty: GIF, PNG, JPEG, BMP, WBMP Rozpoznanie typu kodowania obrazu realizowane jest automatycznie Wczytywanie obrazu może być realizowane również nie tylko z pliku, ale także ze strumienia danych Więcej informacji na temat Image I/O API: http: //java. sun. com/j 2 se/1. 4. 2/docs/gui de/imageio/spec/imageio_guide. TOC. f m. html n Przykład wczytania obrazu ¨ Buffered. Image img = null; try { img = Image. IO. read(new File("strawberry. jpg")); } catch (IOException e) {} Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Rysowanie obrazów n Do rysowania obrazów w danym położeniu służy funkcja: ¨ boolean Graphics.

Rysowanie obrazów n Do rysowania obrazów w danym położeniu służy funkcja: ¨ boolean Graphics. draw. Image(Image img, int x, int y, Image. Observer observer); n n x, y – określają pozycję obrazu observer informuje aplikację o fakcie załadowania obrazu w przypadku asynchronicznym. Nie jest wymagany dla Buffered. Image Obraz jest rysowany 1: 1 w przestrzeni użytkownika (user space) Przykład metody umożliwiającej rysowanie części obrazu, skalowanie oraz stosowanie filtrów: ¨ boolean Graphics. draw. Image(Image img, int dstx 1, int dsty 1, int dstx 2, int dsty 2, int srcx 1, int srcy 1, int srcx 2, int srcy 2, Image. Observer observer); n n n src – reprezentuje obszar, który będzie skopiowany i odrysowany dst – określają obszar, w którym będą przerysowane dane z src Rozmiary obrazka obliczane są analogicznie dla wysokości i szerokości w następujący sposób: srcx 2 -scrx 1 Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Stosowanie filtrów n Filtrowanie danego obrazka polega na utworzeniu nowego z użyciem pewnego algorytmu

Stosowanie filtrów n Filtrowanie danego obrazka polega na utworzeniu nowego z użyciem pewnego algorytmu modyfikującego poszczególne piksele (np. modyfikacja kanału alpha, czyli przeźroczystości) ¨ void Graphics 2 D. draw. Image( Buffered. Image img, Buffered. Image. Op op, int x, int y) n Buffered. Image. Op – klasa implementująca określony filtr n Przykładowe filtry: Convolve. Op. Każdy z wyjściowych pikseli jest obliczany z pośród go otaczających. Może być wykorzystany do rozmywania lub wyostrzania obrazów. ¨ Affine. Transformp. Filtr ten mapuje piksele ze źródłowej pozycji do innego położenia docelowego dokonującą transformacji na lokalizacji pikseli ¨ Lookup. Op. Filtr dokonuje zamiany kolorów na podstawie dostarczonej tablicy kolorów. ¨ Rescale. Op. Filtr mnoży wartości opisujące kolor przez ten sam współczynnik. Może być wykorzystany do rozjaśniania lub przyciemnia obrazu lub zmiany przeźroczystości. ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Tworzenie i rysowanie obrazów n Dowolny obraz może być utworzony z wykorzystaniem następujący konstruktorów:

Tworzenie i rysowanie obrazów n Dowolny obraz może być utworzony z wykorzystaniem następujący konstruktorów: new Buffered. Image(width, height, type) – konstruuje Buffered. Image dla wybranego predefiniowanego typu obrazu of ¨ new Buffered. Image(width, height, type, color. Model) – konstruuje Buffered. Image dla wybranego typu obrazu: TYPE_BYTE_BINARY lub TYPE_BYTE_INDEXED. ¨ new Buffered. Image(color. Model, raster, premultiplied, properties) – konstruuje nowy Buffered. Image z określonym Modelem Kolorów i Rastrem. ¨ n Obraz może być stworzony nie tylko na ekranie. Obraz może być rozważany w kontekście powierzchni po której można rysować. Do tego celu służy metoda create. Graphics() ¨ Buffered. Image off_Image = new Buffered. Image(100, 50, Buffered. Image. TYPE_INT_ARGB); Graphics 2 D g 2 = off_Image. create. Graphics(); Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Podwójne buforowanie n n Obraz tworzony w pamięci może być wykorzystany do budowy mechanizmu

Podwójne buforowanie n n Obraz tworzony w pamięci może być wykorzystany do budowy mechanizmu podwójnego buforowania. Mechanizm podwójnego buforowania zmniejsza użycie zasobów dzięki czemu animacja jest płynna W tym przypadku przetworzenie obrazu realizowane w pamięci po czym obraz jest kopiowany na ekran Java 2 D umożliwiających dostęp do mechanizmów przyśpieszających obróbkę obrazów w buforze: Metoda get. Capabilities pozwala określić, czy wyświetlanie obrazu jest przyśpieszone (accelerated). ¨ Metoda set. Acceleration. Priority pozwala na ustawienie współczynnika określającego jak ważne jest przyśpieszenie wyświetlania danego obrazu ¨ Metoda get. Acceleration. Priority zwraca informacje na temat priorytetu przyśpieszenia wyświetlania obrazu. ¨ Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Zapisywanie obrazu n Zapisanie obrazu na dysku z Buffered. Image z użyciem Image I/O

Zapisywanie obrazu n Zapisanie obrazu na dysku z Buffered. Image z użyciem Image I/O API static boolean Image. IO. write(Rendered. Image im, String format. Name, File output) throws IOException ¨ Metoda Image. O. write woła plug-in dla danego typu obrazka, które nazwa przekazywana jest w parametrze format. Name. Dzięki temu można łatwo rozszerzyć listę obsługiwanych formatów. ¨ n n Standardowo obsługiwane formaty: JPEG, PNG, GIF, BMP i WBMP Metoda String writer. Names[] = Image. IO. get. Writer. Format. Names(); zwraca listę wspieranych formatów przez JRE try { Buffered. Image bi = get. My. Image(); // zapisanie obrazu File outputfile = new File("saved. png"); Image. IO. write(bi, "png", outputfile); } catch (IOException e) { } Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007

Właściwości obrazów Format Zalety Wady Wspiera animację i przeźroczystość Tylko 256 kolorów GIF Bardzo

Właściwości obrazów Format Zalety Wady Wspiera animację i przeźroczystość Tylko 256 kolorów GIF Bardzo dobra alternatywa dla Nie wspiera animacji PNG kolorowych obrazów, które nie mogą być zakodowane stratnie w porównaniu do JPG i GIF JPG Bardzo dobry dla obrazów będących zdjęciami. Kompresja stratna, źle się zachowuje w przypadku kodowania tekstu, i innych rodzajów obrazu, które muszą zachować ostrość. Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej © 2007