Laboratorium 6
Wprowadzenie do wątków
Pobierz archiwum ze skompresowanym projektem eclipse - projekt zawiera trzy pakiety - w jednym zawarte są przykłady tworzenia wątków, pozostałe dwa przeznaczone są na dwa ćwiczenia. Realizację zadania 2 można rozpocząć po ukończeniu zadania 1. Osoby nieobecne na wykładzie dotyczącym wątków powinny zapoznać się ponadto z prezentacją z wykładu.
Zadanie 1 (2,5 pkt)
W pakiecie pl.edu.pw.fizyka.java.lab7.zadanie1 stwórz prostą aplikację Swing, w której przynajmniej trzy elementy będą się dynamicznie zmieniać w trakcie uruchomienia aplikacji. Po 20 sekundach od uruchomienia aplikacja powinna się automatycznie zamykać.
Przykładowe możliwości realizacji:
- "Animowany przycisk" - nowa klasa dziedzicząca po JButton, w której tekst i/lub ikona na przycisku zmienia się cyklicznie (można wzorować się na przykładach JButtonRunnable oraz JButtonScheduled). Można również stworzyć "migający przycisk", w którym kolory tła i czcionki co sekundę zmieniają się cyklicznie.
- Dynamicznie zmieniająca się etykieta (JLabel).
- Płynnie zmieniający się kolor tła panelu/okna aplikacji - wątek powinien w sposób ciągły zmieniać kolor.
- "Automatyczna" zmiana rozmiaru i/lub położenia okna lub obiektów wewnątrz okna.
- Samoistnie przewijający się obiekt klasy JSlider (lub pochodnej).
- Samoistnie rozwijające się menu.
- Zmieniający się tytuł okna.
- Inne pomysły mile widziane.
Punktacja:
- Stworzenie okna aplikacji – 0,5 pkt
- Stworzenie trzech dynamicznie zmieniających się obiektów - 1,5 pkt.
- Samoistne zamykanie się aplikacji po 20 sekundach - 0,5 pkt.
Zadanie 2 (2,5 pkt)
W pakiecie pl.edu.pw.fizyka.java.lab7.zadanie2 znajdują się trzy klasy: klasa Prostokat, klasa PanelRysowania oraz klasa główna MainClass. Klasa Prostokat przechowuje pozycję, rozmiar oraz kolor prostokąta oraz posiada metodę paint(Graphics g), która odpowiada za narysowanie prostokąta w przekazanym jako argument obiekcie graficznym klasy Graphics. Klasa PanelRysowania dziedziczy z JPanel i zawiera deklarację listy obiektów klasy Prostokąt. Metoda paintComponent klasy JPanel została przeciążona, tak aby wszystkie prostokąty znajdujące się w liście były rysowane. Ponadto klasa PanelRysowania zawiera dwie metody pozwalające na dodanie losowego prostokąta, lub prostokąta o zdefiniowanych parametrach. W klasie MainClass tworzone jest okno oraz obiekt klasy PanelRysowania, do którego dodany jest jeden prostokąt o znanych parametrach oraz dwadzieścia losowych.
Zadania do realizacji:
- Zmodyfikuj program tak, aby każdy z prostokątów poruszał się z niezależnie określaną prędkością. Prostokąty powinny odbijać się od krawędzi panelu LUB po ukryciu się za jednym z boków pojawiać się od strony boku przeciwległego (1,5 pkt).
- Zmodyfikuj program tak, aby co najmniej jeden prostokąt w trakcie poruszania wyświetlał sekwencyjnie 4-5 obrazków (plików graficznych) tworzących jakąś prostą animację (1 pkt).
Wskazówki:
- W klasie Prostokąt konieczne będzie dodanie nowych pól, np. zawierających składowe prędkości vx i vy. Zalecane wartości składowych prędkości to liczby całkowite od 0 do 10.
- Wątek sterujący ruchem prostokątów można powiązać z klasą PanelRysowania (wątek powinien uaktualniać współrzędne wszystkich prostokątów zgodnie z ich prędkością, po czym "odświeżać" zawartość panelu (metoda repaint()).
- Do realizacji drugiej części zadania zaleca się dodanie do klasy Prostokąt tablicy obiektów BufferedImage oraz zaimplementowanie interfejsu Runnable, tak aby obiekt sam decydował, który z obrazków powinien być wyświetlany przez metodę paint(Graphics g).
Więcej informacji na temat wątków:
-
- https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
- Ponadto, podobnie jak na niemal każdy temat związany z programowaniem, można znaleźć dość szczegółowe filmiki na youtube, np.: https://www.youtube.com/results?search_query=java+threads+tutorial