II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

Podobne dokumenty
PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

INSTRUKCJA DO ĆWICZENIA 5

4. W konstruktorze klasy Grafika wywołaj metodę określającą rozmiary ramki oraz ustaw kolor tła metodą setbackground():

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna.

Język Java część 2 (przykładowa aplikacja)

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie Obiektowe GUI

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

LABORATORIUM 7 Cel: 1_1

Java Podstawy. Michał Bereta

Język Java część 2 (przykładowa aplikacja)

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Aplikacje w Javie- wykład 11 Wątki-podstawy

Graphic User Interfaces pakiet Swing

Języki i metody programowania Java Lab2 podejście obiektowe

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Informatyka II. Laboratorium.

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

Projektowanie aplikacji internetowych laboratorium

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Multimedia JAVA. Historia

Programowanie obiektowe

Kontenery i komponenty graficzne

Wykład 5 Okna MDI i SDI, dziedziczenie

Ćwiczenia 9 - Swing - część 1

PHP 5 język obiektowy

Współbieżność w środowisku Java

Sieciowe Technologie Mobilne. Laboratorium 2

Misja#3. Robimy film animowany.

Technologie i usługi internetowe cz. 2

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Ćwiczenie 1 Automatyczna animacja ruchu

Interfejsy i klasy wewnętrzne

Aplikacje w środowisku Java

Podstawy Swing. Tomasz Borzyszkowski

Tworzenie elementów graficznych

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Tworzenie projektu zawierającego aplet w środowisku NetBeans. lab1. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Tworzenie prezentacji w MS PowerPoint

Klasy i obiekty cz II

Dokumentacja do API Javy.

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012

Prostokąt. AutoCAD pozwala na szybkie rysowanie figur o czterech bokach prostokątów. Do tego celu służy funkcja Prostokąt. Funkcję tą można wywołać:

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Rysowanie precyzyjne. Polecenie:

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Maskowanie i selekcja

Grafika i komunikacja człowiek komputer Laboratorium. Część 1: Wstęp do grafiki

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Celem ćwiczenia jest zapoznanie się z podstawowymi funkcjami i pojęciami związanymi ze środowiskiem AutoCAD 2012 w polskiej wersji językowej.

Rozwiązanie ćwiczenia 8a

Grafika i komunikacja człowiek komputer Laboratorium. Część 2: Graphics

Aplikacje internetowe i rozproszone - laboratorium

Podstawy Języka Java

Aplikacja wielowątkowa prosty komunikator

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Języki programowania imperatywnego

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Cykl lekcji informatyki w klasie IV szkoły podstawowej. Wstęp

Autokształtów Autokształt AUTOKSZTAŁTY Wstaw Obraz Autokształty Autokształty GDYNIA 2009

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

Ćwiczenie 23 Praca z plikiem.psd

1. Ćwiczenia z programem PowerPoint

Przewodnik po obszarze roboczym

Kierunek: ETI Przedmiot: Programowanie w środowisku RAD - Delphi Rok III Semestr 5. Ćwiczenie 5 Aplikacja wielo-okienkowa

learningpanel - materiały pomocnicze - JAK ZROBIĆ... Jak zrobić...

Laboratorium - Monitorowanie i zarządzanie zasobami systemu Windows XP

Java: interfejsy i klasy wewnętrzne

Dziedziczenie. Zadanie 1

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Laboratorium z informatyki sem. III/ćw.11 Wydział Transportu PW 2017/18

Wstawianie nowej strony

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Informatyka I. Interfejs GUI wysokiego poziomu. Biblioteka Swing. Programowanie zdarzeniowe. Politechnika Warszawska Wydział Transportu 2018

1. Wybierz polecenie rysowania linii, np. poprzez kliknięcie ikony W wierszu poleceń pojawi się pytanie o punkt początkowy rysowanej linii:

Laboratorium - Narzędzia linii uruchamiania w systemie Windows 7

Programowanie zdarzeniowe

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Budowa aplikacji z graficznym interfejsem użytkownika - GUI (Graphic User Interface)

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

UML a kod. C++, Java i C#

Język Java wątki (streszczenie)

Zaawansowane aplikacje WWW - laboratorium

Ćwiczenie pochodzi ze strony

Języki i metody programowania Java Obsługa zdarzeń - przykłady

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

GUI - projektowanie interfejsów cz. II

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Transkrypt:

INSTRUKCJA DO ĆWICZENIA 9 Animacja z wieloma wątkami Projekt1 Utwórz aplikację Swing, która umożliwi rysowanie na panelu 10 prostokątów o tej samej podstawie i losowych wysokościach, niezależnie zmieniających się w losowych odstępach czasu t 500,1000 [msek]. Animację można rozpocząć lub zatrzymać za pomocą 2 zgrupowanych przycisków. Przy rozpoczęciu animacji prostokątom są nadawane losowe kolory. Po zatrzymaniu i w stanie początkowym panel jest pusty. I Tworzenie panelu graficznego 1. Utwórz projekt wykorzystujący pakiet Swing. Projektowi nadaj nazwę Projekt91, a klasie głównej nazwę Animacja. 2. W tytule ramki wpisz tekst : Animacja z wieloma wątkami 3. W konstruktorze klasy Animacja ustal rozmiar ramki(setsize), oraz biały kolor tła (setbackground()). 4. W definicji klasy Animacja umieść wewnętrzną klasę PanelGraficzny dziedziczącą od klasy JPanel z pakietu Swing, wyposażoną w deklarację metody paintcomponent(), która zawiera instrukcje czyszczenia tła: protected void paintcomponent(graphics g) { g.clearrect(0, 0, getwidth(),getheight()); 5. W klasie Animacja zadeklaruj pole: PanelGraficzny panel; 6. W konstruktorze klasy głównej utwórz obiekt panel, dodaj go do ramki, ustal jego rozmiary i położenie tak, by rozmiar i położenie odpowiadały rysunkowi powyżej. Aby narysować obramowanie panelu, dopisz w konstruktorze instrukcję: panel.setborder(new LineBorder(Color.BLACK)); 7. Uruchom aplikację i sprawdź położenie, rozmiar oraz kolor tła panelu. II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku 1. Dodaj do projektu nową pustą klasę Javy o nazwie Prostokąt, dziedziczącą od klasy Thread, która reprezentuje odrębny wątek programu Javy. 2. Poniżej nagłówka klasy Prostokąt zadeklaruj następujące pola: Color k; // kolor prostokata int x, w, h, H; //x- współrzędna pozioma położenia, w- szerokość prostokąta, H- Wysokość panelu int dt; //odstęp czasu uśpienia wątku i jednocześnie zmianami wysokości prostokąta 3. Poleceniem InsertCode Constructor... utwórz konstruktor Prostokąt() nadający wartości polom x, w oraz H. Na końcu jego treści dopisz instrukcję nadającą zmiennej k i dt losowe wartości: Prostokąt(int x, int w, int H) { this.x = x; this.w = w; this.h = H; k = new Color(r.nextInt(256), r.nextint(256), r.nextint(256)); // losowy kolor prostokąta dt = 500 + r.nextint(1000); 4. W definicji klasy Prostokąt zadeklaruj metodę rysującą prostokąt o szerokości w i wysokości h, kolorem k void rysuj(graphics g) { g.setcolor(k); g.fillrect(x, H - h, w, h); 5. W definicji klasy Prostokąt wpisz metodę run() z ramową konstrukcją usypiania i wznawiania wątku, w której co dt milisekund losowana będzie wysokość h prostokąta: public void run() { while(true){ h = r.nextint(200); // losowa wysokość prostokąta try {Thread.sleep(dt); //uśpienie wątku na dt milisekund catch (InterruptedException e) { 6. Zapamiętaj zmiany w klasie Prostokąt Materiały do użytku wewnętrznego strona 1

III Tworzenie wątków w klasie Animacja 1. Przejdź do zakładki Design klasy Animacja i przy dolnej krawędzi ramki umieść dwa przyciski RadioButtoni zgrupuj je z użyciem komponentu ButtonGroup. Poleceniem menu podręcznego w okienku nawigacji zmień napisy obok przycisków na start i stop. 2. Pod nagłówkiem klasy Animacja zadeklaruj tablicę 10 elementowa do przechowywania obiektów klasy Prostokąt Prostokąt[] tp = new Prostokąt[10]; // tablica wątków 3. Utwórz metodę obsługi akcji dla przycisku z tytułem start i wpisz w niej instrukcje, które tworzą w pętli 10 wątków klasy Prostokąt, dodają je do tablicy i uruchamiają je polecaniem start() oraz odświeżają grafikę panelu: for (int i = 0; i < 10; i++) { int d = panel.getwidth() / 10; tp[i] = new Prostokąt(i * d, d, panel.getheight()); tp[i].start();// nowe wątki 4. Uzupełnij metodę paintcomponent o instrukcję rysowania w pętli 10 utworzonych wątków: for (int i = 0; i < 10; i++) { tp[i].rysuj(g); 5. Uruchom aplikację i sprawdź,że wystąpił błąd typu NullPointerException związany z tym, że przy tworzeniu panelu graficznego w metodzie paintcomponent odwołujemy się do wątków, których jeszcze nie ma. Aby uniknąć takiej sytuacji należy rysować obiekty klasy prostokąt pod warunkiem że już istnieją, albo utworzyć je już w konstruktorze klasy Animacja. Skorzystamy z drugiego rozwiązania. 6. W konstruktorze klasy Animacja dodaj instrukcje tworzenia początkowych wątków: for (int i = 0; i < 10; i++) { tp[i]=new Prostokąt(0, 0, 0); 7. Uruchom ponownie aplikację i sprawdź działanie przycisku start IV Definicja obiektu klasy Timer w klasie Animacja 1. W klasie Animacja zaimplementuj interfejs ActionListener - przed nawiasem rozpoczynającym definicję klasy. Animacja dopisz: implements ActionListener 2. Zaimportuj ten interfejs a następnie lewym przyciskiem myszy kliknij ikonę żarówki po lewej stronie nagłówka klasy Animacja i wybierz polecenie Implement all abstract metods (zostanie wygenerowana metoda actionperformed(), która automatycznie będzie się wykonywała, co czas określony przez obiekt klasy Timer ) 3. Wpisz treść metody actionperformed(), która przemalowuje panel: 4. W klasie Animacja zadeklaruj pole t klasy Timer. Zaimportuj klasę javax.swing.timer, wybierając odpowiednią klasę w dialogu Fix Imports. W konstruktorze klasy Animacja dopisz instrukcję tworzącą zegar generujący zdarzenia w stałych odstępach czasu i instrukcję uruchamiającą zegar: t = new Timer(10, this); t.start(); V Zatrzymywanie animacji przycisk stop 1. Zadeklaruj w klasie Animacja statyczną zmienną ruch typu boolean i nadaj jej wartość true: static boolean ruch = false; 2. Przejdź do klasy Prostokąt i w metodzie run uzależnij zmianę zmiennej h od zmiennej wprowadzonej w poprzednim punkcie: if ( Animacja.ruch ) h = r.nextint(200); // losowa wysokość prostokąta 3. Oprogramuj zdarzenie kliknięcia przycisku stop tak, by możliwe było wstrzymanie ruchu prostokątów ruch = false; 4. Do metody obsługującej kliknięcie przycisku start dodaj instrukcję: ruch = true; 5. Uruchom aplikację i sprawdź działanie przycisków. Materiały do użytku wewnętrznego strona 2

Projekt2 Utwórz aplikację Swing, która umożliwi rysowanie na panelu samochodów wjeżdżających do tunelu z różnymi prędkościami. Ruch każdego obiektu realizowany jest w oddzielnym wątku. Samochody są obiektami klasy Polygon, generowanymi w losowych odstępach czasu t 250,1500 [msek] przez obiekt klasy Timer. Panel graficzny odmalowywany jest w odstępach czasu określonych za pomocą drugiego obiektu klasy Timer.. I Tworzenie panelu graficznego 1. Utwórz projekt wykorzystujący pakiet Swing. Projektowi nadaj nazwę Projekt92, a klasie głównej nazwę Animacja2. 2. W tytule ramki wpisz tekst : Animacja z wieloma wątkami 3. W konstruktorze klasy Animacja2 ustal rozmiar ramki na 1000x 400. 4. W definicji klasy Animacja2 umieść wewnętrzną klasę PanelGraficzny dziedziczącą od klasy JPanel z pakietu Swing, wyposażoną w deklarację metody paintcomponent(), która zawiera instrukcje czyszczenia tła, rysowania ramki panelu, jezdni oraz dwóch tuneli w postaci prostokątów: protected void paintcomponent(graphics g) { g.setcolor(light_gray); g.fillrect(0, 0, getwidth(), getheight()); g.setcolor(color.black); g.drawline(0, 150, getwidth(), 150); g.setcolor(color.blue); g.fillrect(getwidth() - 30, 50, 30, 100); g.fillrect(0, 50, 30, 100); 5. W klasie Animacja zadeklaruj pole: PanelGraficzny panel; 6. W konstruktorze klasy głównej utwórz obiekt panel, dodaj go do ramki. 7. Aby panel zajął całą powierzchnię ramki wystarczy wybrać opcję Border Layout dla właściwość Set Layout ramki. 8. Uruchom aplikację i sprawdź rozmiar oraz kolor tła panelu. II Tworzenie klasy Samochód dziedziczącej z klasy Polygon implementującej interfejs Runnable 1. Dodaj do projektu nową pustą klasę Javy o nazwie Samochód, dziedziczącą od klasy Polygon z pakietu java.awt. 2. Poniżej nagłówka klasy Samochód zadeklaruj następujące pola: Color kolor; int dx ;// prędkość samochodu static int[] x = {0, 10, 10, 12, 20, 22, 22, 68, 68, 72, 78, 80, 80, 90, 90, 70, 65, 20, 10, 0; static int[] y = {143, 143, 146, 150, 150, 146, 143, 143, 146, 150, 150, 146, 143, 143, 123, 123, 108, 108, 123, 123; 3. W klasie Samochód utwórz jej konstruktor dziedziczony z klasy Polygon i nadający wartości polom kolor oraz dx. Na końcu jego treści dopisz instrukcję nadającą zmiennej k i dt losowe wartości.; public Samochód(Color k) { super(x, y, Math.min(x.length, y.length)); //wywołanie konstruktora klasy Polygon //trzeci parametr to liczba wierzchołków wyliczana jako minimum z długości obu tablic współrzędnych kolor = k; dx = r.nextint(4) + 1;// losowa prędkość 4. W definicji klasy Samochód zadeklaruj metodę rysującą wielobok o wierzchołkach umieszczonych w tablicach x i y void rysuj(graphics g) { g.setcolor(kolor); g.fillpolygon(this); 5. Zapamiętaj zmiany w klasie Samochód i przejdź do edycji klasy Animacja2 Materiały do użytku wewnętrznego strona 3

6. Pod nagłówkiem klasy Animacja2 zadeklaruj generator liczb losowych r oraz zadeklaruj i utwórz 2 obiekty klasy Samochód: Samochód S1=new Samochód( new Color(r.nextInt(256), r.nextint(156), r.nextint(156))); Samochód S2=new Samochód( new Color(r.nextInt(256), r.nextint(156), r.nextint(156))); 7. W konstruktorze klasy Animacja2 przesuń te obiekty względem panelu: S1.translate(50,0);S2.translate(200,0); 8. W klasie PanelGraficzny, w metodzie paintcomponent() narysuj obiekty S1 i S2 za pomocą metody rysuj() klasy Samochód: S1.rysuj(g); S2.rysuj(g); 9. Uruchom aplikację III Tworzenie wątku z klasy Samochód poprzez implementację interfejsu Runnable Klasa Samochód dziedziczy już z klasy Polygon, tak więc nie może dziedziczyć jeszcze z klasy Thread.Może jednak implementować interfejs Runnable, który umożliwia danej klasie tworzyć wątki. 1. Do klasy Samochód dodaj implementację wspomnianego interfejsu dodając do nagłówka implements Runnable 2. Zaimportuj dodany interfejs oraz zaimplementuj jego abstrakcyjną metodę run 3. W metodzie run() wpisz ramową konstrukcję usypiania i wznawiania wątku, w której co 5 milisekund zmieniane będzie położenie obiektu klasy Samochód poprzez cykliczne wywołanie metody translate() klasy Polygon. public void run() { while(true){ translate(dx, 0); // zmiana położenia wieloboku o wektor [dx,0] try {Thread.sleep(5); //uśpienie wątku na dt milisekund catch (InterruptedException e) { 4. Zapamiętaj zmiany w klasie Samochód IV Tworzenie wątków klasy Samochód oraz definicja obiektu klasy Timer w klasie Animacja2 1. W klasie Animacja2 zaimplementuj interfejs ActionListener - przed nawiasem rozpoczynającym definicję klasy. Animacja2 dopisz: implements ActionListener 2. Zaimportuj ten interfejs, a następnie lewym przyciskiem myszy kliknij ikonę żarówki po lewej stronie nagłówka klasy Animacja i poleceniem Implement all abstract metods zaimplementuj metodę actionperformed(). Wpisz w niej instrukcję która przemalowuje panel: 3. W klasie Animacja2 zadeklaruj pole t klasy Timer. Zaimportuj klasę javax.swing.timer, wybierając odpowiednią klasę w dialogu Fix Imports. W konstruktorze klasy Animacja2 dopisz instrukcję tworzącą zegar generujący zdarzenia w stałych odstępach czasu i instrukcję uruchamiającą zegar: t = new Timer(10, this); t.start(); 5. W konstruktorze klasy Animacja2 utwórz i uruchom wątki dla obiektów S1 i S2 dodając na końcu instrukcje: new Thread(S1).start(); new Thread(S2).start(); 6. Uruchom kilkukrotnie aplikację i zaobserwuj losową prędkość oraz kolor pojazdów V Tworzenie listy wątków klasy Samochód oraz drugiego obiektu klasy Timer; 1. Pod nagłówkiem klasy Animacja2 zadeklaruj listę dynamiczna kolejka do przechowywania obiektów klasy Samochód List<Samochód> kolejka = new ArrayList<>(); 2. Poniżej listy zadeklaruj i utwórz nowy timer; posłuży on do generowania losowych odstępów czasu między kolejnym utworzeniem samochodu i dodaniem go do listy kolejka Timer t1 = new Timer(250 + r.nextint(1500), this); 3. Uruchom timer t1 w konstruktorze klasy Animacja2: t1.start(); Materiały do użytku wewnętrznego strona 4

4. Zmodyfikuj metodę actionperformed() do poniżej postaci: if (e.getsource().equals(t)) { if (e.getsource().equals(t1)) { Samochód S = new Samochód(new Color(r.nextInt(256), r.nextint(156), r.nextint(156))); kolejka.add(s); new Thread(S).start(); t1.setdelay(200 + r.nextint(1500)); 5. Zmodyfikuj metodę paintcomponent() klasy PanelGraficzny. Usuń instrukcje rysowania samochodów S1 i S2 i dopisz instrukcje rysowania obiektów z listy kolejka ale tylko tych, które są widoczne na panelu. 6. Uruchom aplikację. for (Samochód S : kolejka) { if (S.getBounds().x<getWidth()) { S.rysuj(g); Zadania do samodzielnego wykonania Zad1. Zmodyfikuj Projekt91 tak, aby wraz ze zmianą wysokości prostokąta zmieniał się jego kolor na losowy. Zad2. Zmodyfikuj Projekt92 dodając do klasy PanelGraficzny interfejs MouseListener,umożliwiający obsługę zdarzeń dla myszy. Oprogramuj metodę mousepressed() tak, aby kliknięcie lewego przycisku myszy zmieniało tło panelu na kolor losowy. Zad3. W projekcie Projekt92 wstaw przy dolnej krawędzi ramki przycisk klasy JButton. Oprogramuj zdarzenie jego kliknięcia tak, by pojawiało się okno z informacją o aktualnej liczbie samochodów na liście kolejka (patrz ćw.6) Zad4. Skopiuj do foldera roboczego projekt Projekt6 gry zręcznościowej wykonanej na ćwiczeniu 6, umieszczony w folderze sieciowym I2\cw9. Zmodyfikuj ten projekt tak, aby ruch każdego skoczka odbywał się z losową prędkością w osobnym wątku. Materiały do użytku wewnętrznego strona 5