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:

  1. "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.
  2. Dynamicznie zmieniająca się etykieta (JLabel).
  3. Płynnie zmieniający się kolor tła panelu/okna aplikacji - wątek powinien w sposób ciągły zmieniać kolor.
  4. "Automatyczna" zmiana rozmiaru i/lub położenia okna lub obiektów wewnątrz okna.
  5. Samoistnie przewijający się obiekt klasy JSlider (lub pochodnej).
  6. Samoistnie rozwijające się menu.
  7. Zmieniający się tytuł okna.
  8. Inne pomysły mile widziane.

Punktacja:

  1. Stworzenie okna aplikacji – 0,5 pkt
  2. Stworzenie trzech dynamicznie zmieniających się obiektów - 1,5 pkt.
  3. 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:

  1. 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). 
  2. 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:

  1. 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.
  2. 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()).
  3. 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: