UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI Opracował: mgr inż. Przemysław Pardel, dr hab. Bogdan Kwolek v1.01 2010 Grafika i komunikacja człowiek komputer Laboratorium Część 3: Tekst, czcionki, kolory ZAGADNIENIA DO ZREALIZOWANIA (2H) 1. Tekst i czcionki... 2 1.1 Tworzenie obiektu Font... 2 1.2 Wyświetlanie znaków i łańcuchów tekstowych... 2 Przykład 1 do zrealizowania... 3 Przykład 2 do zrealizowania... 3 1.3 Odszukiwanie informacji dotyczących czcionek... 4 Przykład 3 do zrealizowania... 4 2. Kolory... 4 2.1 Zastosowanie obiektu Color... 5 2.2 Testowanie i ustawianie bieżącego koloru... 5 Przykład 4 do zrealizowania... 7 Przykład 5 do zrealizowania... 8
1. TEKST I CZCIONKI Obiekty klasy java.awt.font pozwalają na wywoływanie metody drawstring() z wykorzystaniem różnych czcionek. Obiekt Font reprezentuje nazwę, styl i rozmiar czcionki. Inna klasa, FontMetrics, udostępnia metody pozwalające na określenie rozmiarów znaków wyświetlanych przy użyciu określonej czcionki, co można wykorzystać przy takich operacjach jak formatowanie lub centrowanie tekstu. 1.1 TWORZENIE OBIEKTU FONT Obiekt Font można utworzyć, przekazując do jego konstruktora trzy parametry: nazwę czcionki, styl czcionki, rozmiar czcionki (w punktach). Nazwa czcionki może być podana wprost, jak np. Arial czy Garamond Old Style określona czcionka będzie użyta pod warunkiem, że czcionka o podanej nazwie jest zainstalowana w systemie, w którym uruchamiana jest aplikacja Java. W języku Java dostępnych jest również kilka czcionek wbudowanych. Są to TimesRoman, Helvetica, Courier, Dialog oraz DialogInput. W języku Java 2 nazwy czcionek TimesRoman, Helvetica i Courier powinny być zamienione odpowiednio na serif, sanserif oraz monospaced. Są to ogólne nazwy, które określają style czcionek bez podawania określonej rodziny czcionek je reprezentujących. Jest to rozwiązanie optymalne, ponieważ na niektórych platformach obsługujących język Java pewne rodziny czcionek mogą być nieobecne. W takim przypadku zostanie użyta czcionka, która jest najbardziej zbliżona do określonego stylu (np. serif). Trzy spośród dostępnych stylów czcionek mogą być wybrane przy użyciu predefiniowanych stałych: Font.PLAIN, Font.BOLD oraz Font.ITALIC. Odpowiadają im określone wartości całkowite, dzięki czemu można łączyć style uzyskując np. pochyloną czcionkę wytłuszczoną. Ostatnim parametrem konstruktora obiektu Font() jest rozmiar czcionki podawany w punktach. Poniższe polecenie tworzy obiekt Font reprezentujący 24-punktową, pochyloną i wytłuszczoną czcionkę Dialog: Font f = new Font( Dialog, Font.BOLD + Font.ITALIC,24); 1.2 WYŚWIETLANIE ZNAKÓW I ŁAŃCUCHÓW TEKSTOWYCH Do ustawiania bieżącej czcionki służy metoda setfont() wywoływana z obiektem Font jako parametrem na rzecz obiektu klasy Graphics. Poniższe polecenie ustawia bieżącą czcionkę reprezentowaną przez obiekt klasy Font o nazwie ft: screen.setfont(ft); Tekst w oknie apletu może być wyświetlany przy użyciu metody drawstring(). Metoda drawstring() używa bieżącej czcionki do wyświetlania tekstu. Jeżeli żadna czcionka nie została jawnie wybrana, to zostanie użyta czcionka domyślna. W dowolnej chwili można ustawić nową czcionkę, wywołując metodę setfont().
PRZYKŁAD 1 DO ZREALIZOWANIA public void paint(graphics comp){ Graphics2D comp2d = (Graphics2D) comp; Font f = new Font("TimesRoman", Font.PLAIN, 72); comp2d.setfont(f); comp2d.drawstring("przykładowy napis.", 10, 100); Jak łatwo się domyśleć, ostatnie dwa parametry wywołania metody drawstring() to współrzędne miejsca (x oraz y). W miejscu tym należy rozpocząć wyświetlanie tekstu. Współrzędna x określa lewą krawędź wyświetlanego tekstu, a współrzędna y definiuje położenie linii bazowej wyświetlanego tekstu. PRZYKŁAD 2 DO ZREALIZOWANIA import java.awt.font; import java.awt.graphics; public class ManyFonts extends java.applet.applet { public void paint(graphics g) { Font f = new Font("TimesRoman", Font.PLAIN, 18); Font fb = new Font("TimesRoman", Font.BOLD, 18); Font fi = new Font("TimesRoman", Font.ITALIC, 18); Font fbi = new Font("TimesRoman", Font.BOLD + Font.ITALIC, 18); g.setfont(f); g.drawstring("this is a plain font", 10, 25); g.setfont(fb); g.drawstring("this is a bold font", 10, 50); g.setfont(fi); g.drawstring("this is an italic font", 10, 75); g.setfont(fbi); g.drawstring("this is a bold italic font", 10, 100);
1.3 ODSZUKIWANIE INFORMACJI DOTYCZĄCYCH CZCIONEK Do wyszukiwania informacji dotyczących bieżącej czcionki (takich jak np. wysokość czy szerokość wyświetlanych znaków) można wykorzystać klasę FontMetrics. Aby skorzystać z jej metod, obiekt FontMetrics musi być utworzony przy użyciu metody getfontmetrics(), która pobiera tylko jeden parametr obiekt klasy Font. Poniższy przykład wyświetla wyśrodkowały test: PRZYKŁAD 3 DO ZREALIZOWANIA import java.awt.font; import java.awt.graphics; import java.awt.fontmetrics; public class Centered extends java.applet.applet { public void paint(graphics g) { Font f = new Font("TimesRoman", Font.PLAIN, 36); FontMetrics fm = getfontmetrics(f); g.setfont(f); String s = "Wysrodkowany tekst."; int xstart = (getsize().width - fm.stringwidth(s)) / 2; int ystart = getsize().height / 2; g.drawstring(s, xstart, ystart); 2. KOLORY Wyświetlanie elementów graficznych w apletach i aplikacjach przy użyciu pełnej gamy kolorów umożliwiają klasy Color oraz ColorSpace zawarte w pakiecie java.awt. Klasy te pozwalają na wybieranie koloru dla poszczególnych operacji graficznych, jak również na wybór koloru tła okna apletu czy aplikacji, a także na translację kolorów z jednego systemu opisu kolorów na inny. Domyślnie, w języku Java używany jest system opisu kolorów nazywany srgb. Zgodnie z jego definicją dany kolor jest opisywany poprzez trzy parametry określające zawartość tworzących go kolorów składowych RGB (z ang. R - red, B - blue, G - green). Zawartość poszczególnych składników jest reprezentowana przez liczbę z zakresu od 0 do 255. Przykładowo, kolorowi czarnemu odpowiadają wartości RGB 0, 0, 0, a kolorowi białemu wartości RGB 255, 255, 255 maksymalna zawartość poszczególnych kolorów składowych. System srgb umożliwia również opisywanie kolorów składowych za pomocą trzech liczb dziesiętnych z zakresu od 0 do 1. Obydwie konwencje zapisu srgb pozwalają na odzwierciedlenie w języku Java ponad 16 milionów kolorów.
System opisu kolorów może być również nazywany przestrzenią kolorów, a srgb jest tylko jedną z wielu istniejących przestrzeni kolorów. Inną przestrzenią kolorów jest np. CMYK system opisu kolorów stosowany w drukarkach, odzwierciedlający poszczególne kolory za pomocą zawartości kolorów składowych: C - cyan, M - magenta, Y - yellow oraz K - black. Wersja l.2 języka Java pozwala na stosowanie dowolnej przestrzeni kolorów pod warunkiem, że zostanie utworzony obiekt ColorSpace definiujący żądany system opisu kolorów. Java umożliwia również konwersję z dowolnej przestrzeni kolorów do systemu srgb i na odwrót. Wewnętrzna interpretacja kolorów w języku Java jest oparta na schemacie srgb jest to domyślna przestrzeń kolorów stosowana w programach. Urządzenia wyjściowe, jak np. monitory czy drukarki, używają zazwyczaj swoich własnych przestrzeni kolorów. Może się zdarzyć, że urządzenie wyjściowe nie obsługuje koloru zdefiniowanego w przestrzeni kolorów używanej przez aplikację. W ta-kim przypadku zostanie użyty kolor najbardziej zbliżony do żądanego, bądź zostanie zastosowana tzw. rasteryzacja (z ang. dithering), która umożliwi uzyskanie zbliżonego koloru poprzez raster złożony z kolorów dostępnych w przestrzeni kolorów danego urządzenia wyjściowego. Opisywana sytuacja najczęściej zdarza się w przeglądarkach sieci WWW, gdzie brakujący kolor jest uzyskiwany poprzez zastosowanie rastra złożonego z dwóch lub więcej kolorów składowych. Praktyka zarządzania kolorami uczy, że kolor zdefiniowany w przestrzeni srgb będzie niedostępny na zdecydowanej większości urządzeń wyjściowych. Jeżeli zadanie wymaga bardzo precyzyjnej kontroli kolorów, należy skorzystać z możliwości jakie daje ColorSpace i inne klasy z pakietu java.awt.color wprowadzonego w języku Java 2. Jednak dla większości aplikacji domyślny system opisu kolorów (srgb) będzie w zupełności wystarczający. 2.1 ZASTOSOWANIE OBIEKTU COLOR Aby ustawić bieżący kolor dla operacji graficznych, należy utworzyć obiekt klasy Color opisujący taki kolor albo skorzystać z jednego ze standardowych kolorów zdefiniowanych w klasie Color. W celu zdefiniowania żądanego koloru należy skorzystać z konstruktora klasy Color, wywołując go na jeden z dwóch sposobów: używając trzech liczb całkowitych reprezentujących składowe srgb definiowanego koloru, używając trzech liczb dziesiętnych reprezentujących składowe srgb definiowanego koloru. Składowe definiowanego koloru mogą być określone przy użyciu trzech wartości typu int lub typu float. Poniższe polecenia ilustrują takie dwa przypadki: Color c1 = new Color(255, 204, 102); Color c2 = new Color(0.807F, 1F, 0F); 2.2 TESTOWANIE I USTAWIANIE BIEŻĄCEGO KOLORU Bieżący kolor dla operacji graficznych jest określany poprzez wywołanie metody setcolor(). Metoda ta musi być wywoływana na rzecz obiektu klasy Graphics lub Graphics2D reprezentującego obszar rysowania. Jednym ze sposobów wyboru bieżącego koloru jest zastosowanie jednego ze standardowych kolorów zdefiniowanych jako zmienne klasy Color. Poniżej przedstawiono listę predefiniowanych kolorów reprezentowanych przez zmienne klasy Color (w nawiasach podano odpowiadające im wartości składowych srgb): black (0, 0, 0) magenta (255, 0, 255) blue (0, 0, 255)
orange (255, 200, 0) cyan (0, 255, 255) pink (255, 175, 175) darkgray(64, 64, 64) red (255, 0, 0) gray(128, 128, 128) white (255, 255, 255) green (0, 255, 0) yellow (255, 255, 0) lightgray (192, 192, 192) Poniższe polecenie wybiera jeden z predefiniowanych kolorów jako bieżący kolor dla obiektu comp2d: comp2d.setcolor(color.pink); Kolor tła dla składnika takiego jak okno apletu czy ramka, może zostać ustawiony poprzez wywołanie na rzecz takiego składnika metody setbackgroud() bądź setforeground(). Metoda setbackground() ustawia kolor tła danego składnika. Pobiera ona tylko jeden argument, którym jest obiekt klasy Color: setbackground(color.white); Java udostępnia dodatkowo metodę setforeground(), która jest wywoływana na rzecz danego składnika interfejsu użytkownika (zamiast na rzecz obiektu klasy Graphics). Działa ona w ten sam sposób jak metoda setcolor(), z tym, że zmienia kolor składnika interfejsu, takiego jak przycisk lub okno. Metoda setforegrounnd() może być wykorzystana w ciele metody init() do ustawiania koloru dla operacji graficznych. Raz ustawiony kolor jest używany dopóty, dopóki nie zostanie przy użyciu metody setforeground() lub setcolor() zastąpiony przez inny kolor. Jeżeli chcemy sprawdzić, jaki kolor jest ustawiony jako domyślny, powinniśmy skorzystać z metody getcolor() wywoływanej na rzecz obiektu klasy Graphics lub z metod getforeground() albo getbackground() wywoływanych na rzecz danego składnika. Poniższe polecenie ustawia bieżący kolor obiektu klasy Graphics2D o nazwie comp2d na taki sam kolor jak kolor tła składnika: comp2d.setcolor(getbackground());
PRZYKŁAD 4 DO ZREALIZOWANIA import java.awt.graphics; import java.awt.color; public class ColorBoxes extends java.applet.applet { public void paint(graphics g) { int rval, gval, bval; for (int j = 30; j < (size().height-25); j += 30) for (int i = 5; i < (size().width-25); i += 30) { rval = (int)math.floor(math.random()* 256); gval = (int)math.floor(math.random()* 256); bval = (int)math.floor(math.random()* 256); g.setcolor(new Color(rval,gval,bval)); g.fillrect(i, j, 25, 25); g.setcolor(color.black); g.drawrect(i-1, j-1, 25, 25); Rysunek 1: Przykład 4.
PRZYKŁAD 5 DO ZREALIZOWANIA Utworzyć aplet lub aplikację Java i narysować kształty przedstawione poniżej. Pod każdym z kształtów powinien pojawić się napis informujący o tym jaka funkcja posłużyła nam do narysowania kształtu Każdy kształt powinien posiadać inny kolor