Rysowanie tekstu jest łatwe dzięki trzem klasom Java

Oprócz metod rysowania prymitywnych typów geometrycznych, takich jak linie i okręgi, Graphicsklasa udostępnia metody do rysowania tekstu. W połączeniu z klasami Fonti FontMetricswynikiem jest zestaw narzędzi, które sprawiają, że rysowanie atrakcyjnego tekstu jest znacznie łatwiejsze, niż mogłoby być w innym przypadku. Ta kolumna po kolei omówi każdą z tych klas i pokaże, jak używać ich razem. Zanim jednak zacznę, potrzebna jest krótka powtórka z roli Graphicsklasy.

Recenzja

Aby skorzystać z metod tekstowych Graphicsklasy, Graphicswymagane jest zrozumienie roli samej klasy. Ta sekcja zawiera krótkie omówienie funkcji i działania Graphicsklasy. Czytelnicy szukający dokładnych informacji powinni przeczytać moją październikową kolumnę, dostępną tutaj.

GraphicsKlasa odgrywa dwóch różnych, ale powiązanych ról w ramach abstrakcyjnej okienkowym Toolkit (AWT). Po pierwsze, zachowuje kontekst grafiki, na który składają się wszystkie informacje, które będą miały wpływ na wynik operacji graficznej. Obejmuje to kolor rysunku, czcionkę oraz położenie i wymiary prostokąta przycinającego (regionu, w którym można rysować grafikę). Co ważniejsze, kontekst graficzny definiuje miejsce docelowe operacji graficznych, które mają być omówione (miejsca docelowe obejmują komponenty i obrazy).

Oprócz roli kontekstu grafiki Graphicsklasa zapewnia metody rysowania prostych kształtów geometrycznych, tekstu i obrazów do miejsca docelowego grafiki. Wszystkie operacje związane z grafiką na komponencie lub obrazie są wykonywane jedną z tych metod.

Aby móc rysować, program wymaga prawidłowego kontekstu graficznego (reprezentowanego przez instancję Graphicsklasy). Ponieważ Graphicsklasa jest abstrakcyjną klasą bazową, nie można jej utworzyć bezpośrednio. Instancja jest zwykle tworzona przez komponent, a następnie przekazywana do programu jako argument komponentu update()i paint()metod. Te dwie metody są wywoływane jako część normalnego cyklu ciągnienia zainicjowanego w ramach AWT.

GraphicsKlasa współpracuje z Fonti FontMetricsklas dostarczenie narzędzi niezbędnych do rysowania tekstu w obrazie lub komponentu. Zacznijmy od zbadania Graphicsmetod rysowania tekstu w klasie.

Grafika klasowa

GraphicsKlasa udostępnia trzy metody rysowania tekstu na części lub obrazu.

void drawString (String str, int x, int y)

Przedstawiona drawString()poniżej metoda przyjmuje jako parametry instancję Stringklasy zawierającej tekst do narysowania oraz dwie liczby całkowite określające współrzędne, od których powinien zaczynać się tekst.

public void paint (Graphics g) {g.drawString ("abc", 25, 25); }

Kod na powyższej liście przedstawia drawString()metodę używaną w ramach paint()metody składnika . Kod w tym przykładzie rysuje słowo „abc” w składniku zawierającym tę paint()metodę. X i y współrzędne określają położenie lewego dolnego rogu pola tekstowego zakrywające. Rysunek 1 pokazuje, jak wyglądałby wynik, gdyby ten kod był częścią odpowiedniego obiektu komponentu AWT.

Rysunek 1: Demonstracja funkcji drawString ()

void drawChars (char [] data, int offset, int length, int x, int y)

Poniższa drawChars()metoda przyjmuje jako parametry tablicę znaków zawierającą tekst do narysowania, wartość całkowitą wskazującą przesunięcie tablicy, od której ma się rozpocząć, wartość całkowitą wskazującą liczbę znaków do narysowania oraz dwie wartości całkowite określające współrzędne, gdzie tekst powinien się rozpocząć.

public void paint (Graphics g) {char [] rgc = {'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j'};

g.drawChars (rgc, 0, 5, 25, 25); g.drawChars (rgc, 5, 5, 25, 50); }

Powyższy kod przedstawia drawChars()metodę używaną w ramach paint()metody składnika . Tablica znaków jest rysowana w dwóch częściach. W pierwszym z dwóch połączeń do drawChars()The przesunięcie parametr wskazuje, że rysunek powinien zaczynać się od pierwszego znaku w tablicy, a długość parametr wskazuje, że w sumie z pięciu znaków powinno być sporządzone na pierwszej linii. Drugie z dwóch wywołań działa w podobny sposób, ale rysuje pięć ostatnich znaków z tablicy znaków, zaczynając od pozycji 25 pikseli poniżej pierwszego. Rysunek 2 pokazuje, jak wyglądałby wynik, gdyby ten kod był częścią odpowiedniego obiektu komponentu AWT.

Rysunek 2: Demonstracja drawChars ()

void drawBytes (bajt [] dane, int offset, int length, int x, int y)

Jak pokazano poniżej, drawBytes()metoda przyjmuje jako parametry tablicę bajtów zawierającą tekst do narysowania, wartość całkowitą wskazującą przesunięcie tablicy, od której ma się rozpocząć, wartość całkowitą wskazującą liczbę bajtów do narysowania oraz dwie wartości całkowite określające współrzędne, od których powinien zaczynać się tekst.

public void paint (Graphics g) {byte [] rgb = {'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'};

g.drawBytes (rgb, 0, 5, 25, 25); g.drawBytes (rgb, 5, 5, 25, 50); }

Powyższy kod przedstawia drawBytes()metodę używaną w ramach paint()metody składnika . Rysunek 3 pokazuje, jak wyglądałby wynik, gdyby ten kod był częścią odpowiedniego obiektu komponentu AWT.

Rysunek 3: Demonstracja funkcji drawBytes ()

Obsługa Unicode

Jedną z najbardziej reklamowanych funkcji Javy jest obsługa międzynarodowych skryptów za pośrednictwem Unicode. Szkoda, że ​​biblioteka klas Java dostarczona z wersją 1.0 języka programowania Java nie obsługuje w pełni tego aspektu języka. Wygląda jednak na to, że dobre wieści są tuż za rogiem. Wstępny interfejs API do internacjonalizacji (patrz Zasoby), dostępny w SunSoft, ma do powiedzenia:

JDK 1.0 był ograniczony do wyświetlania tylko znaków z podzbioru Latin-1 Unicode. To ograniczenie zostało usunięte w JDK 1.1. Programy Java będą teraz mogły wyświetlać dowolny znak Unicode, który może być renderowany za pomocą czcionki hosta. Java udostępnia niewielką liczbę wstępnie zdefiniowanych „wirtualnych” nazw czcionek i odwzorowuje je na rzeczywiste czcionki dostępne na hoście. W JDK 1.0 każda nazwa czcionki Java była odwzorowywana dokładnie na jedną czcionkę hosta. W JDK 1.1 nazwa czcionki Java może być odwzorowywana na serię czcionek hosta. Można wybrać serię czcionek hosta, aby pokryć dowolną część zestawu znaków Unicode.

Umieszczenie tekstu

Ponieważ tekst jest po prostu innym rodzajem figury w AWT, wiersz tekstu można umieścić w dowolnym miejscu - nawet na wierzchu innego wiersza tekstu. Jednak efekt przypadkowego umieszczenia niekoniecznie będzie przyjemny dla oka. Aby pomóc programiście w tworzeniu estetycznego tekstu, definicja czcionki zawiera wskazówki dotyczące umieszczania linii i znaków. Przestrzeganie tych wskazówek pomoże uzyskać zadowalający wynik.

Rysunek 4 zawiera wiersz tekstu, który został oznaczony w celu wskazania cech, które zamierzamy omówić.

Rysunek 4: Linia tekstu

Y współrzędnych parametrem w metodach z poprzedniego Określa przekroju lokalizacji wyjściowej linii tekstu. Linia bazowa to linia, na której spoczywa większość znaków w wierszu tekstu (wyjątek stanowią znaki z malejącymi kreskami, takie jak „g” i „y”). Linia bazowa nie jest tak naprawdę cechą czcionki, ale jest punktem odniesienia, do którego odnoszą się wszystkie inne cechy.

Wynurzania jest odległością od linii bazowej do górnej większość znaków w czcionce. Zwykle jest to wysokość wielkich liter czcionki oraz znaków takich jak „f” i „h”. Liczba ta jest jednak tylko wskazówką. Niektóre znaki czcionki mogą w rzeczywistości przekraczać tę odległość.

Opadanie jest odległością od linii do spodzie znaków czcionki które Indeksy dolne - postacie, takie jak „s”, „g” i „y”. Podobnie jak w przypadku wynurzania, ta liczba jest tylko wskazówką. Niektóre znaki czcionki mogą w rzeczywistości sięgać poniżej tej odległości.

Czołowym (wymawiane „ledding”), to ilość przestrzeni pomiędzy zejście jednego wiersza tekstu i wynurzania linii poniżej. Wysokość wiersza tekstu (odległość od linii bazowej jednego wiersza tekstu do linii bazowej wiersza tekstu powyżej lub poniżej) obejmuje tę dodatkową spację.

Oprócz cech rządzących całą czcionką, każdy znak w czcionce ma ulepszenie . Przesunięcie określa, ile pikseli dzieli początek znaku od początku znaku po jego prawej stronie; w skrócie jest to szerokość znaku. Ponownie, niektóre znaki czcionki mogą w rzeczywistości wykraczać poza tę odległość.

Dodając szerokości wszystkich znaków w wierszu tekstu, można obliczyć długość całego wiersza tekstu. Poniższa FontMetricsklasa zawiera metodę, która robi właśnie to i nie tylko.

Class FontMetrics

Ta FontMetricsklasa zapewnia prosty sposób na zapoznanie się z cechami omówionymi powyżej. Oto getFontMetricsmetoda w akcji:

public void paint (Graphics g) {FontMetrics fm = g.getFontMetrics (); . . . }

Powyższy kod ilustruje, w jaki sposób można uzyskać informacje o metrykach czcionek opisujące bieżącą czcionkę. getFontMetrics()Sposób powraca wystąpienie FontMetricsklasy. FontMetricsKlasa udostępnia następujące metody:

int getAscent()

  • Zwraca wzrost czcionki.

int getDescent()

  • Zwraca pochodzenie czcionki.

int getLeading()

  • Zwraca początek czcionki.

int getHeight()

  • Zwraca wysokość czcionki. Wysokość jest sumą wznoszenia się, obniżania i interlinii czcionki.

int charWidth(int ch)

  • Zwraca szerokość określonego znaku.

int charWidth(char ch)

  • Zwraca szerokość określonego znaku.

int [] getWidths()

  • Zwraca tablicę liczb całkowitych zawierającą szerokości pierwszych 256 znaków czcionki.

Jak wspomniano powyżej, znaki składające się na czcionkę mogą czasami wykraczać poza wzrost, spadek i szerokości podane w powyższych metodach. W przypadkach, gdy wymagane są dokładne wartości, dostępne są następujące metody.

int getMaxAscent()

  • Zwraca maksymalne wzniesienie czcionki.

int getMaxDescent()

  • Zwraca maksymalny spadek czcionki.

int getMaxAdvance()

  • Zwraca szerokość najszerszego znaku czcionki.

Poniższe metody dostarczają informacji o szerokości zajmowanej przez sekwencję znaków.

int stringWidth(String str)

  • Zwraca szerokość sekwencji znaków.

int bytesWidth(byte [] rgb, int offset, int length)

  • Zwraca szerokość długość dłuższej sekwencji bajtów począwszy na przesunięcie .

int charsWidth(char [] rgc, int offset, int length)

  • Zwraca szerokość długość dłuższej sekwencji znaków rozpoczynające się zrównoważyć .

Class Font

FontKlasa obudowuje informacje o czcionce. Nowa czcionka jest tworzona przez utworzenie instancji Fontklasy z nazwą, stylem i wielkością w punktach.

Czcionka f = nowa Czcionka ("Okno dialogowe", Font.PLAIN, 12); 

Po utworzeniu czcionkę można przypisać do instancji Graphicsobiektu.

g.setFont (f); 

GraphicsObiekt będzie następnie użyj czcionki dla wszystkich operacji graficznych kolejny tekst pokrewnych.

FontKlasa dostarcza sposobów na uzyskanie informacji o czcionce raz został on utworzony.

String getName()

  • Zwraca nazwę czcionki.

String getFamily()

  • Zwraca nazwę czcionki specyficzną dla platformy.

int getSize()

  • Zwraca rozmiar czcionki w punktach.

int getStyle()

  • Zwraca styl czcionki.

boolean isBold()

  • Zwraca, truejeśli czcionka jest pogrubiona.

boolean isItalic()

  • Zwraca, truejeśli czcionka jest kursywą.

boolean isPlain()

  • Zwraca, truejeśli czcionka jest zwykła.

String getName()

  • Zwraca nazwę czcionki.

Demonstracja

Aplet na rysunku 5 wyświetla wiersz tekstu ze znacznikami wystarczającymi do wskazania wartości powiązanych metryk z powyższej sekcji. Na linii podstawowej znajduje się gruba czarna linia. Dwie dodatkowe linie wskazują wznoszenie i opuszczanie danej czcionki. Mniejsze pionowe linie wskazują szerokości znaków. Trzy menu rozwijane pozwalają wybrać czcionkę, jej styl i wielkość w punktach.

Aby wyświetlić ten aplet, potrzebujesz przeglądarki obsługującej język Java. Rysunek 5: Interaktywna przeglądarka metryczna czcionek

Aplet używa Graphics, Fontoraz FontMetricszajęcia w szerokim zakresie. Jego źródło jest dostępne tutaj.

Wniosek

Wygląda na to, że Graphicsklasa okazała się bardzo podatnym gruntem do eksploracji. A wyprawa jeszcze się nie zakończyła. W przyszłym miesiącu zakończę moją wycieczkę na Graphicszajęcia z kolumną na temat metod obsługi obrazów, a ta kolumna rozpocznie małą serię na inne tematy związane z obrazami i AWT, w tym producentów obrazów i konsumentów obrazów.

Chciałbym podziękować wszystkim, którzy poświęcili czas na napisanie do mnie swoich komentarzy, pomysłów i sugestii. Tak trzymaj.

Todd Sundsted pisze programy, odkąd komputery stały się dostępne w modelach stacjonarnych. Chociaż początkowo zainteresowany budowaniem aplikacji rozproszonych obiektów w C ++, Todd przeniósł się na język programowania Java, gdy Java stała się oczywistym wyborem do tego typu rzeczy. Todd jest współautorem Java Language API SuperBible, która jest teraz dostępna w księgarniach na całym świecie. Oprócz pisania, Todd świadczy usługi konsultingowe w Internecie i sieci dla firm w południowo-wschodnich Stanach Zjednoczonych.

Dowiedz się więcej na ten temat

  • Class GraphicsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Class FontAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Class FontMetricsAPI:

    //www.javasoft.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Korzystanie z Graphicszajęć:

    //www.javaworld.com/javaworld/jw-11-1996/jw-11-howto.html

  • Interfejs API do internacjonalizacji:

    //www.javasoft.com/products/JDK/1.1/docs/guide/intl/index.html

  • Samouczek Java autorstwa Mary Campione i Kathy Walrath:

    //www.javasoft.com/books/Series/Tutorial/index.html

Artykuł „Rysowanie tekstu jest łatwe dzięki trzem klasom języka Java” został pierwotnie opublikowany przez JavaWorld.