Rysowanie prostych obiektów graficznych przy użyciu biblioteki AWT (Abstract Window Toolkit)
Biblioteka Abstrakcyjnych Narzędzi Okienkowych AWT (Abstract Window Toolkit) jako historycznie pierwsza w JDK dostarcza szereg elementów wykorzystywanych do tworzenia interfejsów graficznych dla potrzeb komunikacji z użytkownikiem i obsługi jego danych. Component Container Button Canvas Checkbox Label Textfield Window Panel Frame Applet Elementy biblioteki AWT Do najbardziej istotnych elementów tego pakietu należy zaliczyć: Ważniejsze składniki biblioteki AWT to: Składnik (Component) może być etykietą (Label), polem tekstowym (TextField), przyciskiem (Button) itp.; Pojemnik (Container) jest składnikiem AWT, w którym mogą być umieszczane inne składniki; Panel (Panel) jest pojemnikiem, którego zawartość można wyświetlić na ekranie (aplet jest szczególnym przypadkiem panelu); Płótno (Canvas) jest miejscem na umieszczanie rysunków (na panelach też można rysować); Okno (Window) może zawierać ramki, paski przewijania itp.; Ramka (Frame) jest podstawowym składnikiem niezależnego okna. Pakiet AWT zarówno w wersjach wcześniejszych jak i w wersji 2 wyposażony jest w klasę Graphics, a od wersji 2 dodatkowo w klasę Graphics2D. Klasy te zawierają liczne metody umożliwiające tworzenie i zarządzanie grafiką w Javie. Podstawą pracy z grafiką jest tzw. kontekst graficzny, który jako obiekt posiada właściwości konkretnego systemu prezentacji np. panelu. W AWT kontekst graficzny jest dostarczany do komponentu poprzez następujące metody: paint paintall update print printall getgraphics Obiekt graficzny (kontekst) zawiera informacje o stanie grafiki potrzebne dla podstawowych operacji wykonywanych przez metody Javy. Zaliczyć tu należy następujące informacje: obiekt komponentu, który będzie obsługiwany, współrzędne obszaru rysowania oraz obcinania,
aktualny kolor, aktualne czcionki, aktualna funkcja operacji na pikselach logicznych (XOR lub Paint), aktualny kolor dla operacji XOR. Klasa Graphics umożliwia nam rysowanie prostych figur geometrycznych, przy czym można rysować tylko obrzeża figur, jak i figury wypełnione kolorem. Dostępne metody pozwalają na rysowanie: linii; kół i elips; prostokątów; wielokątów; Rysowanie figur geometrycznych (klasa Graphics). Aby coś narysować trzeba zdefiniować metodę paint() dostarczającą kontekstu graficznego: public void paint ( Graphics g ) { g.nazwametody ( parametry metody rysującej); Argumentem tej metody jest obiekt klasy Graphics, którą należy jawnie importować: import java.awt.graphics; Stosowany jest przy tym następujący układ współrzędnych: 0,0 X 20,20 60,80 Y Do rysowania figur służą nastepujace metody: Metoda drawline(int x p, int y p, int x k, int y k ) drawrect( int x p, int y p, int b, int h ) Przeznaczenie rysowanie prostej od punktu początkowego (x p, y p ) do punktu końcowego (x k, y k ) rysowanie prostokąta o wymiarach b h i współrzędnych lewego górnego
rogu (x p, y p ) drawpolygon(int[] x, int[] y, int n ) rysowanie wieloboku o współrzędnych n wierzchołków (x i, y i ) drawpolyline( int[] x, int[] y, int n ) rysowanie n odcinków linii łamanej o współrzędnych załomów (x i, y i ) drawoval( int x p, int y p, int b, int h ) drawarc( int x p, int y p, int b, int h, int φ p, int φ k ) rysowanie elipsy wpisanej w prostokąt rysowanie wycinka elipsy zawartego w sektorze kątowym (φ p, φ k ) Zastępując przedrostek draw w nazwie metody rysującej figury przedrostkiem fill można wypełniać figurę uprzednio zdefioniowanym kolorem np. filloval(...) Przykład 1 import java.awt.*; public class FiguryDEMO extends Frame { FiguryDEMO() { //konstruktor setsize(400,300); setvisible(true); settitle("użycie metod rysowania figur geometrycznych"); public void paint ( Graphics g ) { //przesuniecie układu wspolrzednych Insets b = getinsets(); g.translate (b.left, b.top); g.drawline( 20, 10, 70, 10 ); // prostokąt i zaokrąglony prostokąt g.fillrect( 50,50,100, 70 ); g.fillroundrect( 50, 130, 50, 50, 20, 20 ); int tabx [ ] = { 40, 60, 80,40 ;
int taby [ ] = { 40, 20, 40,40 ; int n = tabx.length; //trojkat g.fillpolygon( tabx, taby, n-1 ); g.translate(100,0); g.drawpolyline(tabx, taby, n); g.translate(-100,0); // elipsa, kolo, wycinek g.drawoval( 200, 50, 50, 50 ); g.filloval( 280, 50, 70, 50 ); g.fillarc( 200, 110, 50, 50, 0, 275 ); public static void main (String args[]) { new FiguryDEMO();
Kolory (klasa Color) Kolory w Javie są obiektami klasy Color. Klasa ta udostępnia metody setcolor(color), setbackground(color), setforeground(color), których argumentami są kolory. Można korzystać z zestawu standardowych predefiniowanych stałych kolorów ( Color.white, Color.black, Color.red itp.) lub tworzyć własne kolory jako dowolne kombinacje składowych RGB: Kolory podstawowe black darkgray lightgray pink blue gray magenta red yellow Przykład stworzenia obiektu klasy Color: cyan green orange white Color kolorek = new Color ( int R, int G, int B ); Wartości argumentów RGB muszą być w przedziale 0-255. Przykład 2 import java.awt.*; public class KolorDEMO extends Frame { KolorDEMO() { setsize(320,200); setvisible(true); settitle("uzycie kolorów + wypełnione figury - przykłady"); public void paint ( Graphics g ) { //przesuniecie układu wspolrzednych Insets b = getinsets(); g.translate (b.left, b.top); g.setcolor( new Color( 20, 20, 100)); g.fillrect( 10, 10, 50, 50 ); g.setcolor( Color.green ); g.filloval( 100, 50, 20, 20 ); public static void main (String args[]) { new KolorDEMO();
Metoda setcolor( ) ustala kolor, którym realizowane są kolejne operacje graficzne. Metody setbackground ( ) i setforeground ( ) ustalają, odpowiednio, kolor tła i kolor wszystkich elementów rysowanych na tym tle. Są jeszcze metody getcolor ( ), getbackground ( ), getforeground ( ) zwracające odpowiednio te kolory. Łańcuchy i czcionki (klasa Font) Czcionki są w Javie obiektami klasy Font. Aby wyświetlić tekst w trybie graficznym, należy: 1) utworzyć obiekt klasy Font zawierający krój, styl i rozmiar czcionki; 2) zadeklarować tę czcionkę jako aktualnie używaną w danym kontekście graficznym. 3) skorzystać z metody rysowania tekstu np. drawstring(). Dostęp do czcionek odbywa się poprzez trzy typy nazw: nazwy logiczne czcionek, nazwy czcionek systemowych, nazwy rodziny czcionek. Nazwy logiczne czcionek to nazwy zdefiniowane dla Javy. Możliwe są następujące nazwy logiczne czcionek w Javie: Dialog, DialogInput, Monospaced, Serif, SansSerif, Symbol. Nazwy logiczne są odwzorowywane na nazwy czcionek powiązane z czcionkami dla danego systemu. Wywołanie konstruktora klasy Font wymaga określenia nazwy lub nazwy logicznej czcionki, stylu, oraz rozmiaru czcionki (określony nie w pikselach lecz punktach typograficznych 1pt= 1/72 cala). Styl czcionki może być określony przez następujące pola klasy Font: Font.PLAIN tekst zwykły, Font.ITALIC tekst pochyły (kursywa), Font.BOLD tekst pogrubiony, Font.ITALIC + Font.BOLD tekst pogrubiony i pochyły. Do zgłaszania aktualnie używanej czcionki służy metoda setfont (Font). Łańcuch rysowany jest za pomocą metody drawstring( String str, int x, int y),gdzie (x,y) współrzędne rysowanego łańcucha.
Przykład 3 import java.awt.*; public class czcionkidemo extends Frame { czcionkidemo() { //konstruktor setsize(320,200); setvisible(true); settitle("użycie czcionek - przykłady"); public void paint ( Graphics g ) { //przesuniecie układu współrzędnych Insets b = getinsets(); // określa rozmiar ramek g.translate (b.left, b.top); // przesuwa początek //układu wsp. o ta wielkość Font f = new Font ( "TimesRoman", Font.PLAIN, 12 ); Font fb = new Font( "SansSerif", Font.BOLD, 12 ); g.setfont( f ); g.drawstring ("To jest normalna czcionka", 0, 50 ); g.setfont ( fb ); g.drawstring ("To jest gruba czcionka", 0, 100 ); public static void main (String args[]) { new czcionkidemo(); Własności poszczególnych czcionek można poznać dzięki obiektowi FontMetrics oraz metodzie getfontmetrics(). Obiekt ten ma kilkanaście metod, bardziej interesujące to: charwidth (char c) zwraca szerokość litery podanej jako parametr; getheight () zwraca typową wysokość wiersza tekstu zapisanego za pomocą fontu; getleading () zwraca odległość pomiędzy wierszami tekstu zapisanego za pomocą fontu; stringwidth (String s) zwraca długość wiersza tekstu zapisanego za pomocą fontu;