|
Spis treści |
|---|
|
4. Wątki
4.1. Szkielet programu
Tak jak w poprzedniej części kursu, tak i w tej tworzenie apletu rozpoczynamy od utworzenia projektu, wybierając z paska menu edytora NetBeans File | New Project. Przechodzimy wszystkie znane już nam kroki, wpisując nazwę projektu jako Zegar oraz nazwę pliku apletu o tej samej nazwie. Generuje to nam szablon apletu. Przystępujemy zatem do tworzenia panelu dla apletu w postaci osobnej klasy. W tym celu w oknie Project klikamy prawym przyciskiem myszy nazwę projektu i z menu kontekstowego wybieramy New | Java Class. Jako nazwę nowej klasy wpisujemy PanelZegar. Zostanie wygenerowana pusta klasa. Nie musimy ręcznie umieszczać w niej konstruktora – wystarczy, że umieścimy wskaźnik myszy między otwierającym a zamykającym nawiasem klamrowym i wciśniemy kombinację klawiszy [Ctrl]+[spacja].
Wywoła to okienko z listą, w której zaznaczamy konstruktor. Podwójne kliknięcie jego nazwy lewym przyciskiem myszy wygeneruje ten konstruktor w kodzie klasy.
W identyczny sposób możemy umieścić wewnątrz klasy zmienne czy metody odziedziczone po klasach nadrzędnych, modyfikatory i tym podobne obiekty języka. My chcieliśmy utworzyć klasę stanowiącą panel dla apletu, powinniśmy ją zatem rozszerzyć o klasę JPanel. Po nazwie konstruktora wpisujemy więc słowa extends JPanel. NetBeans podświetli nam JPanel na czerwono, dając znak, że nie mamy zaimportowanego pakietu, z którego pochodzi ta klasa. Pakiet możemy zaimportować automatycznie, wciskając kombinację klawiszy [Ctrl]+[Shift]+[I] (jeśli chcemy zaimportować wszystkie klasy, których jeszcze nie zaimportowaliśmy) lub [Alt]+[Shift]+[I] (gdy zależy nam tylko na tej jednej, którą zaznaczyliśmy).
Wewnątrz konstruktora za pomocą metody setSize() definiujemy rozmiar panelu:
import javax.swing.JPanel;
public class PanelZegar extends JPanel
{
public PanelZegar() { setSize(200,200); }
}
Aby przygotowany panel dodać do powierzchni apletu, przechodzimy w oknie edytora do pliku Zegar.java i wewnątrz metody init() tworzymy egzemplarz klasy PanelZegar. Następnie, korzystając z metody add(), dodajemy go do powierzchni apletu. Aby panel pasował rozmiarami do powierzchni apletu, przed dodaniem określamy jego wymiary:
public void init() {
setSize(200,200);
PanelZegar pz=new PanelZegar();
add(pz);
}
4.2. Rysujemy zegar
Mamy już gotowy pusty panel o odpowiednich rozmiarach. Możemy więc przystąpić do rysowania na jego powierzchni. Rysowanie odbywa się za pośrednictwem obiektu Graphics, dostarczanego przez metodę paintComponent(). To w niej wykonujemy wszystkie operacje związane z grafiką. Na początek rzutujemy obiekt Graphics na obiekt Graphics2D, który dostarcza kilku dodatkowych metod, oprócz tych dostępnych w klasie Graphics:
public void paintComponent(Graphics g)
{
Graphics2D g2=(Graphics2D)g;
}
|
Klasa Graphics2D jest podklasą klasy Graphics i może po niej dziedziczyć. Dlatego też oprócz metod klasy Graphics dostarcza swoje własne metody (klasy Graphics2D). |
|---|
Na początku należy wyczyścić zawartość panelu. Posłużymy się w tym celu metodą clearRect(), której argumentami są współrzędne górnego lewego wierzchołka prostokątnego obszaru oraz jego szerokość i wysokość. Pomoże nam to w prawidłowym odmalowaniu zawartości panelu podczas odświeżania. Następnie przystępujemy do rysowania tarczy zegara. Za pomocą metody setColor() ustawiamy kolor pędzla na jasnoniebieski:
g2.setColor(new Color(0,204,255));
Następnie pobieramy bieżący styl kreski. Służy do tego metoda getStroke() klasy Graphics2D, która zwraca obiekt typu Stroke:
Stroke kreska=g2.getStroke();
Po co pobierać styl kreski? Zachowanie go w zmiennej kreska pozwoli nam później na łatwe wprowadzanie zmian w sposobie rysowania kreski w danym kontekście graficznym i powracanie później do stylu pierwotnego.
Przed narysowaniem niebieskiego koła definiujemy stałą klasową typu całkowitego (integer), która będzie przechowywała długość promienia figury. Stałą określamy słowem kluczowym final zapisanym zaraz po modyfikatorze dostępu. Nazwy stałych przyjęło się pisać wielkimi literami. Warto pamiętać, że zawartości stałej, w przeciwieństwie do zmiennej, nie możemy już zmienić. Modyfikatorem dostępu dla stałej PROMIEN jest private, dzięki czemu będzie ona dostępna jedynie dla klasy, w której została zdefiniowana.
public class PanelZegar extends JPanel {
private final int PROMIEN=80;
....
}
Ładowanie











1. Nie działa :D (znaczy się na koniec trzeba dodać jeden nawias klamrowy zamykający główną klasę i dodać zmienne: private int kr=255,kg=255,kb=255; o których była mowa stronę wcześniej :) )
2. Sprawa kosmetyczna, mianowicie:
public void init() {
public void paintComponent(Graphics g)
{
a dokładniej chodzi mi o położenie nawiasu otwierającego. Trzeba przyjąć jakiś standard (jeden, albo drugi, a nie obydwa na raz :) )