Programování

Kreslení textu je snadné pomocí tří tříd Java

Kromě metod pro kreslení primitivních geometrických typů, jako jsou čáry a kruhy, Grafika třída poskytuje metody pro kreslení textu. V kombinaci s Písmo a FontMetrics tříd, výsledkem je sada nástrojů, díky nimž je práce s přitažlivým textem mnohem jednodušší, než by jinak mohla být. Tento sloupec postupně pokryje každou z těchto tříd a ukáže vám, jak je používat společně. Než však začnu, krátký přehled role Grafika třída je v pořádku.

Přezkoumání

Aby bylo možné použít textové metody Grafika třídy, pochopení role Grafika samotná třída je vyžadována. V této části je uveden stručný přehled funkcí a provozu systému Grafika třída. Čtenáři, kteří hledají důkladné pokrytí, by si měli přečíst můj říjnový sloupec, který je k dispozici zde.

The Grafika třída hraje v rámci sady nástrojů pro abstraktní okna (AWT) dvě různé, ale související role. Nejprve udržuje grafický kontext, který se skládá ze všech informací, které ovlivní výsledek grafické operace. To zahrnuje barvu výkresu, písmo a umístění a rozměry ořezového obdélníku (oblast, ve které lze kreslit grafiku). Ještě důležitější je, že grafický kontext definuje cíl grafických operací, o nichž se bude diskutovat (cíle zahrnují komponenty a obrázky).

Kromě své role jako grafického kontextu, Grafika třída poskytuje metody pro kreslení jednoduchých geometrických tvarů, textu a obrázků na grafické místo určení. Všechny operace související s grafikou na komponentě nebo obrázku probíhají pomocí jedné z těchto metod.

Aby bylo možné kreslit, program vyžaduje platný grafický kontext (představovaný instancí Grafika třída). Protože Grafika třída je abstraktní základní třída, nelze ji vytvořit přímo. Instanci obvykle vytvoří komponenta a poté ji předá programu jako argument komponentě Aktualizace() a malovat() metody. Tyto dvě metody se nazývají jako součást normálního cyklu kreslení zahájeného v rámci AWT.

The Grafika třída pracuje společně s Písmo a FontMetrics třídy, které poskytují nástroje potřebné k vykreslení textu do obrázku nebo komponenty. Začněme zkoumáním Grafika metody třídy pro kreslení textu.

Grafika třídy

The Grafika třída poskytuje tři metody, které kreslí text na komponentu nebo obrázek.

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

The drawString () níže uvedená metoda bere jako parametry instanci Tětiva třída obsahující text, který má být nakreslen, a dvě celočíselné hodnoty určující souřadnice, kde má text začínat.

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

Kód v seznamu výše ukazuje drawString () metoda používaná v rámci komponenty malovat() metoda. Kód v tomto příkladu nakreslí slovo „abc“ na komponentu, která ho obsahuje malovat() metoda. The X a y souřadnice určují umístění dole vlevo rohu přiloženého textového pole. Obrázek 1 ukazuje, jak by vypadal výsledek, kdyby byl tento kód součástí vhodného objektu komponenty AWT.

Obrázek 1: Demonstrace drawString ()

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

The drawChars () níže uvedená metoda bere jako parametry pole znaků obsahující text, který má být vykreslen, celočíselnou hodnotu označující posun do pole, od kterého má začít, celočíselnou hodnotu označující počet znaků, které mají být nakresleny, a dvě celočíselné hodnoty určující souřadnice, kde je text by mělo začít.

public void paint (Grafika 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); }

Výše uvedený kód ukazuje drawChars () metoda používaná v rámci komponenty malovat() metoda. Pole znaků je nakresleno ve dvou částech. V prvním ze dvou hovorů na drawChars ()offset parametr označuje, že kresba by měla začínat prvním znakem v poli a znakem délka parametr označuje, že na prvním řádku by mělo být nakresleno celkem pět znaků. Druhý ze dvou hovorů funguje podobným způsobem, ale kreslí posledních pět znaků v poli znaků začínajících na pozici 25 pixelů pod prvním. Obrázek 2 ukazuje, jak by vypadal výsledek, kdyby byl tento kód součástí vhodného objektu komponenty AWT.

Obrázek 2: Demonstrace drawChars ()

void drawBytes (byte [] data, int offset, int length, int x, int y)

Jak je uvedeno níže, drawBytes () metoda bere jako parametry bajtové pole obsahující text, který má být vykreslen, celočíselnou hodnotu označující posunutí do pole, od kterého má začít, celočíselnou hodnotu označující počet bajtů k vykreslení a dvě celočíselné hodnoty určující souřadnice, kde má text Start.

public void paint (Grafika 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); }

Výše uvedený kód ukazuje drawBytes () metoda používaná v rámci komponenty malovat() metoda. Obrázek 3 ukazuje, jak by vypadal výsledek, pokud by tento kód byl součástí vhodného objektu komponenty AWT.

Obrázek 3: Demonstrace drawBytes ()

Podpora Unicode

Jednou z nejoblíbenějších funkcí Javy je podpora mezinárodních skriptů pomocí Unicode. Je politováníhodné, že knihovna tříd Java dodávaná s verzí 1.0 programovacího jazyka Java plně nepodporovala tento aspekt jazyka. Zdá se však, že dobré zprávy jsou za rohem. Předběžné API pro internacionalizaci (viz Zdroje), dostupné od společnosti SunSoft, má toto:

JDK 1.0 byl omezen na zobrazování pouze znaků v podmnožině Latin-1 Unicode. Toto omezení je v JDK 1.1 odstraněno. Programy Java nyní budou moci zobrazit libovolný znak Unicode, který lze vykreslit hostitelským písmem. Java poskytuje malý počet předdefinovaných „virtuálních“ názvů písem a mapuje je na skutečná písma dostupná na hostiteli. V JDK 1.0 je každý název písma Java mapován přesně na jedno hostitelské písmo. V JDK 1.1 lze název písma Java mapovat na řadu hostitelských písem. Řadu hostitelských písem lze zvolit tak, aby pokryla tolik znakové sady Unicode, kolik je požadováno.

Umístění textu

Protože text je pro AWT jen dalším druhem obrázku, lze řádek textu umístit kdekoli - dokonce i na jiný řádek textu. Účinek náhodného umístění však nemusí být nutně příjemný pro oko. Aby programátor pomohl při vytváření esteticky příjemného textu, obsahuje definice písma pokyny pro umístění řádků a znaků. Pokud budou tyto pokyny dodrženy, pomohou vytvořit příjemný výstup.

Obrázek 4 obsahuje řádek textu, který byl označen k označení charakteristik, o kterých se chystáme diskutovat.

Obrázek 4: Řádek textu

The y parametr souřadnic v metodách v předchozí části určuje umístění souboru základní linie řádku textu. The základní linie je řádek, na kterém spočívá většina znaků v řádku textu (výjimkou jsou znaky s podřízenými znaky, například „g“ a „y“). Základní linie není ve skutečnosti charakteristikou písma, ale je referenčním bodem, ke kterému se vztahují všechny ostatní charakteristiky.

The výstup je vzdálenost od základní čáry k horní části většiny znaků v písmu. Obvykle se jedná o výšku velkých písmen v písmu a znaků jako „f“ a „h“. Tento údaj je však pouze orientační. Některé znaky v písmu se mohou ve skutečnosti prodloužit nad tuto vzdálenost.

The klesání je vzdálenost od základní čáry ke spodní části znaků v písmu, které má následníky - znaky jako „p“, „g“ a „y“. Stejně jako u výstupu je tento údaj pouze vodítkem. Některé znaky v písmu se mohou ve skutečnosti prodloužit pod tuto vzdálenost.

The vedoucí (vyslovuje se „ledding“) je velikost mezery mezi sestupem jednoho řádku textu a výstupem na řádek pod ním. Výška řádku textu (vzdálenost od účaří jednoho řádku textu k účaří řádku textu nad nebo pod ním) zahrnuje tento prostor navíc.

Kromě charakteristik, kterými se řídí písmo jako celek, má každý znak v písmu znak záloha. Záloha určuje, kolik pixelů odděluje začátek znaku od začátku znaku vpravo; zkrátka jde o šířku postavy. Některé znaky v písmu mohou opět překročit tuto vzdálenost.

Sečtením šířek všech znaků v řádku textu lze vypočítat délku celého řádku textu. The FontMetrics třída níže poskytuje metodu, která dělá právě toto a další.

Třída FontMetrics

The FontMetrics třída poskytuje jednoduchý způsob, jak se dostat k výše popsaným charakteristikám. Zde je getFontMetrics metoda v akci:

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

Výše uvedený kód ukazuje, jak lze získat informace o metrikách písma popisující aktuální písmo. The getFontMetrics () metoda vrací instanci FontMetrics třída. The FontMetrics třída poskytuje následující metody:

int getAscent ()

  • Vrátí výstup písma.

int getDescent ()

  • Vrátí sestup písma.

int getLeading ()

  • Vrátí začátek písma.

int getHeight ()

  • Vrátí výšku písma. Výška je součtem stoupání, klesání a vedení písma.

int charWidth (int ch)

  • Vrátí šířku zadaného znaku.

int charWidth (char ch)

  • Vrátí šířku zadaného znaku.

int [] getWidths ()

  • Vrátí celé číslo obsahující šířku prvních 256 znaků písma.

Jak bylo uvedeno výše, znaky, které tvoří písmo, mohou někdy přesahovat výstup, sestup a šířku hlášené výše uvedenými metodami. V případech, kdy jsou požadovány přesné hodnoty, jsou k dispozici následující metody.

int getMaxAscent ()

  • Vrátí maximální výstup písma.

int getMaxDescent ()

  • Vrátí maximální sestup písma.

int getMaxAdvance ()

  • Vrátí šířku nejširšího znaku v písmu.

Následující metody poskytují informace o šířce zachycené posloupností znaků.

int stringWidth (String str)

  • Vrátí šířku posloupnosti znaků.

int bytesWidth (byte [] rgb, int offset, int délka)

  • Vrátí šířku délka dlouhá sekvence bajtů začínající na offset.

int charsWidth (char [] rgc, int offset, int délka)

  • Vrátí šířku délka dlouhá řada znaků začínající na offset.

Písmo třídy

The Písmo třída zapouzdřuje informace o písmu. Nové písmo se vytvoří vytvořením instance souboru Písmo třída se jménem, ​​stylem a velikostí bodu.

Písmo f = nové písmo ("Dialog", Font.PLAIN, 12); 

Po vytvoření lze font přiřadit instanci souboru Grafika objekt.

g.setFont (f); 

The Grafika objekt poté použije písmo pro všechny následující grafické operace související s textem.

The Písmo třída poskytuje metody pro získání informací o písmu, jakmile je vytvořeno.

Řetězec getName ()

  • Vrátí název písma.

Řetězec getFamily ()

  • Vrátí název písma pro konkrétní platformu.

int getSize ()

  • Vrátí velikost bodu písma.

int getStyle ()

  • Vrátí styl písma.

boolean isBold ()

  • Vrací se skutečný pokud je písmo tučně.

boolean isItalic ()

  • Vrací se skutečný pokud je písmo kurzívou.

boolean isPlain ()

  • Vrací se skutečný pokud je písmo prosté.

Řetězec getName ()

  • Vrátí název písma.

Demonstrace

Applet na obrázku 5 zobrazuje řádek textu se značkami dostatečnými k označení hodnot souvisejících metrik z výše uvedené části. Na základní linii sedí silná černá čára. Dva další řádky označují výstup a sestup dotyčného písma. Menší svislé čáry označují šířku znaků. Tři rozevírací nabídky umožňují vybrat písmo, jeho styl a velikost bodu.

K prohlížení tohoto appletu potřebujete prohlížeč s podporou Java.Obrázek 5: Interaktivní prohlížeč metrických písem

Applet používá Grafika, Písmo, a FontMetrics třídy značně. Jeho zdroj je k dispozici zde.

Závěr

Zdá se, že Grafika třídy se ukázalo být velmi úrodnou půdou pro průzkum. A expedice ještě není dokončena. Příští měsíc ukončím svoji exkurzi do Grafika třída se sloupcem na svých metodách podpory obrázků a tento sloupec zahájí malou sérii o dalších tématech souvisejících s obrázky a AWT, včetně producentů obrázků a spotřebitelů obrázků.

Rád bych poděkoval vám všem, kteří jste si našli čas a napsali mi vaše připomínky, nápady a návrhy. Pokračuj v dobré práci.

Todd Sundsted píše programy od doby, kdy byly počítače dostupné v modelech pro stolní počítače. Ačkoli se Todd původně zajímal o vytváření aplikací distribuovaných objektů v C ++, přešel na programovací jazyk Java, když se Java stala jasnou volbou pro tento druh věcí. Todd je spoluautorem Java Language API SuperBible, nyní v knihkupectvích všude. Kromě psaní Todd poskytuje internetové a webové poradenské služby společnostem v jihovýchodních Spojených státech.

Další informace o tomto tématu

  • Třída Grafika API:

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

  • Třída Písmo API:

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

  • Třída FontMetrics API:

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

  • Za použití Grafika třída:

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

  • Internacionalizace API:

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

  • Výukový program Java Mary Campione a Kathy Walrath:

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

Tento příběh „Kreslení textu je snadné pomocí tří tříd Java“ původně publikoval JavaWorld.