Laboratorium z informatyki sem. II/ćw. 8 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 11
MATERIAŁYPOMOCNICZEDOĆWICZENIA 8
Aplikacja wykorzystująca pakiet Swing
• Pakiet Swing, będący częścią biblioteki Java Foundation Classes, umożliwia tworzenie w języku Java interaktywnych interfejsów graficznych, pozwalających na wprowadzanie danych za pomocą myszki, klawiatury i innych urządzeń tego typu. Wszystkie składniki tego pakietu zostały całkowicie
zaimplementowane w języku Java, co zapewnia zgodność i niezależność wyglądu poszczególnych składników pakietu na różnych platformach.
• Pierwszym etapem tworzenia aplikacji z wykorzystaniem pakietu Swing jest utworzenie klasy, która będzie reprezentowała graficzny interfejs użytkownika. Obiekt tej klasy stanowi kontener
przechowujący poszczególne składniki interfejsu.
Klasa JFrame
• W większości aplikacji takim głównym obiektem interfejsu jest albo okno proste (obiekt klasy JWindow), albo ramka (obiekt klasy JFrame), czyli okna z paskiem tytułu oraz z przyciskami Minimalizuj, Maksymalizuj , Zamknij. Jednym ze sposobów utworzenia graficznego interfejsu
użytkownika wykorzystującego pakiet Swing jest zdefiniowanie go jako podklasy klasy JFrame, tak jak to zrobiliśmy w naszym ćwiczeniu
Metody klasy Component użyte w ćwiczeniu
setSize(int szerokość, int wysokość) zmienia rozmiary komponentu
setBackground(Color kolor) nadaje kolor tła komponentu graficznego przy użyciu metody clearRect
Rysowanie w Java Swing na ramce
• Do wykreślania obiektów graficznych w Javie służy kontekst graficzny będący obiektem (abstrakcyjnej) klasy java.awt.Graphics
.
Klasa ta udostępnia metody pozwalające na rysowanie figur geometrycznych jak również zewnętrznych obrazów. W ćwiczeniu do rysowania wykorzystaliśmy metodę paint(), która jest wywoływana automatycznie, nie powinniśmy jej wywoływać sami.Odświeżenie komponentu, niezbędne np. do zmiany rysunku, uzyskujemy wywołując metodę
repaint().
Wybrane metody klasy Graphics
Do tworzenia grafiki w naszej aplikacji wykorzystaliśmy m.in. następujące metody klasy
Graphics:setColor(Color k) – ustala bieżący kolor grafiki
setFont(Font f) – ustala bieżącą czcionkę
drawString(String s, int x , int y) wyświetla tekst s począwszy od punktu (x, y)
drawLine(int x1, int y1, int x2, int y2) – rysuje odcinek
o końcach w punktach
(x1, y1) i (x2, y2), używając bieżącego koloruMetodę tę można wykorzystać do rysowania punktu, gdy przyjmiemy x1=x2 i y1=y2 fillRect(int x, int y, int width, int height) – wypełnia bieżącym kolorem prostokąt, którego lewy górny
wierzchołek ma współrzędne (x, y);width - szerokość, height wysokość
drawRect(int x, int y, int width, int height) – rysuje bieżącym kolorem prostokąt (łamaną, którą tworzą boki prostokąta); znaczenie parametrów – jak w metodzie fillRect()
clearRect(int x, int y, int width, int height) – wypełnia prostokąt kolorem tła; znaczenie parametrów – jak w metodzie fillRect()
drawOval(int x, int y, int width, int height) – rysuje bieżącym kolorem elipsę wpisaną w prostokąt, którego lewy górny wierzchołek ma współrzędne (x, y);
width - szerokość, height wysokość
fillOval(int x, int y, int width, int height) –wypełnia bieżącym kolorem elipsę , znaczenie parametrów - jak w metodzie drawOval
drawArc(int x, int y, int width, int height, int a0, int a) –rysuje bieżącym kolorem łuk elipsy określonej przez parametry x, y, width, height;
a0 – kąt początkowy, a – kąt środkowy łuku (w stopniach); kąty rosną przeciwnie do ruchu wskazówek zegara, a kąt 0 jest na godzinie 3.
fillArc(int x, int y, int width, int height, int a0, int a) –wypełnia bieżącym kolorem wycinek elipsy, znaczenie parametrów jak w metodzie drawArc
drawPolygon(Polygon p) – rysuje bieżącym kolorem obiekt klasy Polygon (wielobok – łamaną zamkniętą)
drawPolygon(int[]x, int[]y, int n) – rysuje bieżącym kolorem wielobok o n wierzchołkach, współrzędne wierzchołków są zapisane w tablicach x i y
fillPolygon(Polygon p)–wypełnia bieżącym kolorem obiekt klasy Polygon
Laboratorium z informatyki sem. II/ćw. 8 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 22
fillPolygon(int[]x, int[]y, int n) – wypełnia bieżącym kolorem wielobok o n wierzchołkach
drawImage(Image img, int x, int y, ImageObserver observer) – wyświetla obraz img umieszczając jego lewy górny wierzchołek w punkcie (x, y); parametr observer umożliwia kontrolę stanu obrazu, może być „pustym” obiektem (null)
translate(int x, int y) – przesuwa rysowaną grafikę o (x, y)
Układ współrzędnych na kontekście graficznym
Początek układu współrzędnych kontekstu graficznego obiektu (0,0) znajduje się w jego lewym górnym rogu.
• Zwiększanie wartości współrzędnych następuje w miarę przesuwania się w prawo i w dół.
Maksymalne wartości współrzędnych można określić dziedziczonymi od klasy Component metodami getWidth(), getHeight() zwracającymi odpowiednio szerokość i wysokość okna komponentu.
Klasa Color
• Kolor jest obiektem klasy Color, która ma kilka konstruktorów. Instrukcja deklarująca i tworząca określony kolor może mieć na przykład postać:
Color nazwa = new Color(r, g, b); lub Color nazwa = new Color(r, g, b, p)
• Parametry r, g, b są liczbami całkowitymi z zakresu 0..255 i są składowymi reprezentacji RGB (R-red, G-green, B-blue) definiowanego koloru (teoretycznie można otrzymać w ten sposób ponad 16 milionów kolorów).. Parametr p to również liczba całkowita z zakresu 0..255 i określa stopień przezroczystości koloru..
• Klasa Color zawiera kilkanaście standardowych wartości kolorów. Są one zadeklarowane jako stałe klasowe, np.
public final static Color blue = new Color(0, 0, 255);
Zatem można je używać bez tworzenia nowych obiektów klasy Color, np. Color.BLUE, Color.orange itp.
• Nazwy stałych określających kolory można pisać małymi lub wielkimi literami dzięki dodatkowym deklaracjom, występującym w definicji klasy Color.
Przykład: Aby generować wartość pola k klasy Color o losowych składowych R, G, B z zakresu od 0 do 255
zastosowaliśmy instrukcję:
Color k = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
Klasa Font
• Czcionkę reprezentuje obiekt klasy Font, tworzony za pomocą konstruktora: Font(krój, styl, rozmiar);
gdzie: krój – to łańcuch tekstowy określający krój czcionki np.”Dialog”, ”SanSerif”, "Helvetica"
• styl - jest jedną ze stałych statycznych typu int z klasy Font: Font.BOLD, Font.ITALIC, Font.PLAIN
• rozmiar - to liczba całkowita określająca wielkość czcionki w punktach Klasa FontMetrics
• Aby dobrze rozplanować położenie tekstu, należy uzyskać charakterystyki pisma kontekstu graficznego. Umożliwia to metoda g.getFontMetrics(), która zwraca metrykę (obiekt klasy FontMetrics ) dla bieżącej czcionki kontekstu graficznego g. W klasie FontMetrics zdefiniowana jest z kolei metoda o sygnaturze int stringWidth(String s), która zwraca szerokość obszaru zajmowanego przez napis s. Złożenie metod g.getFontMetrics().stringWidth(s) zwróci szerokość napisu s wyświetlonego bieżącą czcionką.
Klasa Polygon
• Ta klasa reprezentuje obiekty geometryczne zwane wielokątami lub wielobokami. W ćwiczeniu wykorzystano jej pola (atrybuty) npoints, xpoints[] i ypoints[] oraz konstruktor, tworzący obiekt klasy Polygon:
int npoints – liczba wierzchołków wielokąta
int[] xpoints – tablica współrzędnych x wierzchołków wielokąta int[] ypoints – tablica współrzędnych y wierzchołków wielokąta
Konstruktor klasy, czyli metoda tworząca nowy obiekt klasy Polygon, ma sygnaturę:
public Polygon (int[] xpoints, int[] ypoints, int npoints)
Laboratorium z informatyki sem. II/ćw. 8 Wydział Transportu PW - 2020/21
Materiały do użytku wewnętrznego strona 33
Generowanie liczb losowych, klasa Random
Klasa Random
pakietu
java.util udostępnia metody generowania liczb losowych całkowitych i rzeczywistych dla kilku podstawowych rozkładów prawdopodobieństwa. Klasa ma dwa konstruktory:• Random() – tworzy nowy generator liczb losowych
• Random(long seed)
–
tworzy nowy generator liczb losowych i inicjuje go podaną wartością seed ; ten sposób umożliwia uzyskanie identycznych ciągów wartości liczb losowych w różnychprzebiegach programu.
Do generowania kolejnych wartości losowych służą metody:
• nextInt()
– zwraca całkowitą liczbę losową z przedziału <
0 , 232)
•
nextInt(int n)– zwraca całkowitą liczbę losową o rozkładzie równomiernym z przedziału <
0 , n) parametr n musi mieć wartość całkowitą dodatnią.•
nextDouble()– zwraca liczbę losową rzeczywistą o rozkładzie równomiernym w przedziale <0, 1), działa podobnie jak metoda
Math.random()klasy
Math.
Liczby losowe całkowite z przedziału domkniętego <K, L> można uzyskać stosując wzór:
K +r.nextInt( L + 1 - K )
Liczby losowe rzeczywiste z przedziału (A, B) można uzyskać stosując wzór
A +( B - A ) * r. nextDouble()
Obrazy
• Oprócz rysowania własnych obrazków istnieje możliwość wykreślania obrazów zawartych w plikach graficznych typu GIF, JPEG lub PNG. Obrazy są obiektami klasy java.awt.Image, a właściwie jej podklas - ponieważ jest to klasa abstrakcyjna.
Pozyskiwanie obrazów
Odniesienie do obiektu reprezentującego obraz można uzyskać na przykład tworząc obiekt klasy javax.swing.ImageIconkonstruktorem:
ImageIcon(String fileName)
-
podając nazwę pliku lub,
ImageIcon(URL url)-
podając jego lokalizację i wydając mu polecenieImage getImage().
Tak jak to miało miejsce w przykładzie naszego ćwiczeniaImage tło;
tło = new ImageIcon("tło.jpg").getImage();
Po utworzeniu obiektuImageIconobrazek będzie znajdował się w pamięci operacyjnej
. Wykreślenie obrazka
może być wykonane na przykład przeciążonymi metodami drawImage()z klasyGraphics
,
które wykreślają załadowany fragment obrazka w całości lub podaną jego część, ewentualnie skalując go.
drawImage(Image img, int x,int y,ImageObserver observer)
drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer)
Wszystkie metodydrawImage()wymagają podania jako jednego z argumentów odniesienia do obiektu typu ImageObserver