Crtanje teksta jednostavno je s tri Java klase

Pored metoda za crtanje primitivnih geometrijskih tipova poput linija i krugova, Graphicsklasa nudi metode za crtanje teksta. U kombinaciji s Fontte FontMetricsklase, rezultat je skup alata koji čini posao crtanja privlačan tekst mnogo lakše nego što bi inače bio. Ovaj će stupac redom pokrivati ​​svaku od ovih klasa i pokazat će vam kako ih zajedno koristiti. Prije nego što započnem, Graphicsred je kratki osvrt na ulogu razreda.

Recenzija

Da bi se koristile tekstualne metode Graphicsrazreda, potrebno je razumijevanje uloge samog Graphicsrazreda. Ovaj odjeljak predstavlja kratki pregled funkcije i rada Graphicsklase. Čitatelji koji traže temeljito izvještavanje trebali bi pročitati moju listopadsku kolumnu dostupnu ovdje.

Predavanje Graphicsigra dvije različite, ali povezane uloge u okviru alata za apstraktno otvaranje prozora (AWT). Prvo, održava grafički kontekst, koji se sastoji od svih informacija koje će utjecati na ishod grafičke operacije. To uključuje boju crteža, font i mjesto i dimenzije pravokutnika za isjecanje (područje u kojem se može crtati grafika). Još važnije, grafički kontekst definira odredište za grafičke operacije o kojima će se raspravljati (odredišta uključuju komponente i slike).

Pored uloge grafičkog konteksta, Graphicsklasa nudi metode za crtanje jednostavnih geometrijskih oblika, teksta i slika do grafičkog odredišta. Sve operacije povezane s grafikom na komponenti ili slici odvijaju se putem jedne od ovih metoda.

Da bi crtao, program zahtijeva valjani grafički kontekst (predstavljen primjerom Graphicsklase). Budući da je Graphicsklasa apstraktna osnovna klasa, ne može se izravno instancirati. Primjerak obično kreira komponenta, a zatim se predaje programu kao argument komponenti update()i paint()metodama. Ove dvije metode pozivaju se kao dio normalnog ciklusa crtanja pokrenutog unutar AWT-a.

GraphicsKlasa radi zajedno s Fontte FontMetricsklase pružiti alate potrebne za crtanje teksta unutar slike ili komponente. Počnimo s ispitivanjem Graphicsmetoda razreda za crtanje teksta.

Razredna grafika

Predavanje Graphicsnudi tri metode koje crtaju tekst na komponenti ili slici.

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

drawString()Metoda, što je prikazano dolje, uzima kao parametri instanca Stringklase koja sadrži tekst koji će biti izvučeni, a dvije cjelobrojne vrijednosti navode koordinate gdje tekst treba početi.

javna boja za praznine (grafika g) {g.drawString ("abc", 25, 25); }

Kôd u gornjem popisu prikazuje drawString()metodu koja se koristi unutar paint()metode komponente . Kôd u ovom primjeru crta riječ "abc" na komponenti koja sadrži ovu paint()metodu. X i y koordinate odrediti položaj donjem lijevom uglu je ograđena tekstualni okvir. Slika 1 prikazuje kako bi izgledao rezultat da je ovaj kôd dio prikladnog objekta komponente AWT.

Slika 1: Demonstracija drawString ()

void drawChars (podaci char [], pomak int, dužina int, int x, int y)

Dolje drawChars()navedena metoda uzima kao parametre niz znakova koji sadrži tekst koji treba nacrtati, cjelobrojnu vrijednost koja označava pomak u nizu u kojem započinje, cjelobrojnu vrijednost koja označava broj znakova za crtanje i dvije cjelobrojne vrijednosti koje određuju koordinate na kojima se tekst bi trebao početi.

javna boja za praznine (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); }

Gornji kod prikazuje drawChars()metodu koja se koristi unutar paint()metode komponente . Niz znakova crta se u dva dijela. U prvom od dva poziva na drawChars(), parametar offset označava da crtanje treba započeti s prvim znakom u nizu, a parametar length označava da bi u prvom retku trebalo biti nacrtano ukupno pet znakova. Drugi od dva poziva djeluje na sličan način, ali crta posljednjih pet znakova u nizu znakova koji počinju na položaju 25 piksela ispod prvog. Slika 2 prikazuje kako bi izgledao rezultat da je ovaj kod dio odgovarajućeg objekta AWT komponente.

Slika 2: Demonstracija drawChars ()

void drawBytes (bajt [] podaci, pomak int, dužina int, int x, int y)

Kao što je prikazano dolje, drawBytes()metoda uzima kao parametre niz bajtova koji sadrži tekst za crtanje, cjelobrojnu vrijednost koja označava pomak u nizu od kojeg započinje, cjelobrojnu vrijednost koja označava broj bajtova za crtanje i dvije cjelobrojne vrijednosti koje specificiraju koordinate na kojima bi tekst trebao započeti.

javna boja za praznine (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); }

Gornji kod prikazuje drawBytes()metodu koja se koristi unutar paint()metode komponente . Slika 3 prikazuje kako bi rezultat mogao izgledati ako je ovaj kôd dio prikladne AWT komponente objekta.

Slika 3: Demonstracija drawBytes ()

Podrška za Unicode

Jedna od Java najpoznatijih značajki je podrška međunarodnim skriptama putem Unicodea. Žalosno je što knjižnica razreda Java koja se isporučuje s verzijom 1.0 programskog jezika Java nije u potpunosti podržala ovaj aspekt jezika. Međutim, čini se da su dobre vijesti pred vratima. Preliminarni API za internacionalizaciju (vidi Resurse), dostupan od SunSoft-a, ima za reći:

JDK 1.0 bio je ograničen na prikazivanje samo znakova u Latin-1 podskupini Unicode-a. Ovo je ograničenje uklonjeno u JDK 1.1. Java programi sada će moći prikazati bilo koji Unicode znak koji se može prikazati fontom hosta. Java nudi mali broj unaprijed definiranih "virtualnih" imena fontova i preslikava ih u stvarne fontove dostupne na hostu. U JDK 1.0, svaki naziv Java fonta preslikao se na točno jedan font hosta. U JDK 1.1, naziv Java fonta može se preslikati na niz fontova domaćina. Niz fontova domaćina može se odabrati da pokrije onoliko Unicode skupa znakova koliko želite.

Postavljanje teksta

Budući da je tekst samo druga vrsta figure za AWT, redak teksta može se postaviti bilo gdje - čak i na drugu liniju teksta. Učinak slučajnog smještaja, međutim, neće nužno biti oku ugodan. Kako bi se programeru pomoglo u stvaranju estetski ugodnog teksta, definicija fonta uključuje smjernice za postavljanje crta i znakova. Ako se slijede ove smjernice, pomoći će u stvaranju ugodnih rezultata.

Slika 4 sadrži redak teksta koji je označen kako bi ukazao na karakteristike o kojima ćemo razgovarati.

Slika 4: Redak teksta

Parametar y koordinate u metodama u prethodnom odjeljku određuje mjesto osnovne crte retka teksta. Osnovna linija je crta na kojoj počiva većina znakova u retku teksta (iznimka su oni znakovi s padajućim redoslijedom kao što su "g" i "y"). Osnovna linija zapravo nije karakteristika fonta, već je referentna točka na koju se odnose sve ostale karakteristike.

Uspon je udaljenost od početne vrijednosti do vrha većina likova u fontu. To je obično visina velikih slova u fontu i znakova poput "f" i "h". Međutim, ova je brojka samo smjernica. Neki se znakovi u fontu mogu stvarno protezati iznad ove udaljenosti.

Spust je udaljenost od početne vrijednosti do dna likova u fontu koji imaju descenders - znakove kao što su „p”, „g” i „y”. Kao i kod uspona, i ova brojka je samo smjernica. Neki znakovi u fontu mogu se zapravo protezati ispod ove udaljenosti.

Vodeći (izgovara se „ledding”) je količina prostora između silaska jednog retka teksta i uspona linije ispod nje. Visina retka teksta (udaljenost od osnovne linije jednog retka teksta do osnovne linije retka teksta iznad ili ispod njega) uključuje ovaj dodatni razmak.

Pored karakteristika koje upravljaju fontom u cjelini, svaki znak u fontu ima unaprijed . Napredak određuje koliko piksela odvaja početak znaka od početka znaka s njegove desne strane; ukratko, to je širina lika. Još jednom, neki znakovi u fontu mogu se stvarno proširiti izvan ove udaljenosti.

Zbrajanjem širine svih znakova u retku teksta može se izračunati duljina cijelog retka teksta. FontMetricsKlasa ispod pruža metodu koja radi upravo to, i još mnogo toga.

Predmet FontMetrics

Predavanje FontMetricspruža jednostavan način za postizanje gore opisanih karakteristika. Evo getFontMetricsmetode na djelu:

javna boja za praznine (grafika g) {FontMetrics fm = g.getFontMetrics (); . . . }

Gornji kod pokazuje kako se mogu dobiti podaci o mjernim podacima fonta koji opisuju trenutni font. getFontMetrics()Metoda vraća instancu FontMetricsklase. Predavanje FontMetricspruža sljedeće metode:

int getAscent()

  • Vraća uspon fonta.

int getDescent()

  • Vraća spuštanje fonta.

int getLeading()

  • Vraća početnu vrijednost fonta.

int getHeight()

  • Vraća visinu fonta. Visina je zbroj uspona, silaska i vođenja fonta.

int charWidth(int ch)

  • Vraća širinu navedenog znaka.

int charWidth(char ch)

  • Vraća širinu navedenog znaka.

int [] getWidths()

  • Vraća čitav niz koji sadrži širinu prvih 256 znakova fonta.

Kao što je gore spomenuto, znakovi koji čine font mogu se ponekad proširiti iznad uspona, spuštanja i širine prijavljene gornjim metodama. U slučajevima kada su potrebne točne vrijednosti, pružaju se sljedeće metode.

int getMaxAscent()

  • Vraća maksimalni uspon fonta.

int getMaxDescent()

  • Vraća maksimalno spuštanje fonta.

int getMaxAdvance()

  • Vraća širinu najšireg znaka u fontu.

Sljedeće metode pružaju informacije o širini koju zauzima niz znakova.

int stringWidth(String str)

  • Vraća širinu niza znakova.

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

  • Vraća širinu duljine duge sekvence bajtova koja počinje s pomakom .

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

  • Vraća širinu dužinskog niza znakova koji počinju s pomakom .

Krstionica razreda

Predmet sadrži Fontinformacije o fontu. Novi font nastaje stvaranjem instance Fontklase s imenom, stilom i veličinom točke.

Font f = novi font ("Dijalog", Font.PLAIN, 12); 

Jednom stvoren, font se može dodijeliti instanci Graphicsobjekta.

g.setFont (f); 

Zatim Graphicsće objekt koristiti font za sve naredne grafičke operacije povezane s tekstom.

FontKlasa pruža metode za dobivanje na informacije o fontu nakon što je stvorio.

String getName()

  • Vraća naziv fonta.

String getFamily()

  • Vraća naziv fonta određenog za platformu.

int getSize()

  • Vraća veličinu fonta točke.

int getStyle()

  • Vraća stil fonta.

boolean isBold()

  • Vraća trueako je font podebljan.

boolean isItalic()

  • Vraća trueako je font kurziv.

boolean isPlain()

  • Vraća trueako je font običan.

String getName()

  • Vraća naziv fonta.

Demonstracija

Aplet na slici 5 prikazuje redak teksta s oznakama dovoljnim da naznači vrijednosti pridruženih mjernih podataka iz gornjeg odjeljka. Debela crna crta nalazi se na osnovnoj liniji. Dva dodatna retka označavaju uspon i spust predmetnog fonta. Manje okomite crte označavaju širinu znakova. Tri padajuća izbornika omogućuju vam odabir fonta, njegov stil i veličinu točke.

Za pregled ovog apleta potreban vam je preglednik s omogućenom Java. Slika 5: Interaktivni preglednik metričkih fontova

Aplet koristi Graphics, Fonti FontMetricsklase opsežno. Njegov izvor dostupan je ovdje.

Zaključak

Čini se da Graphicsse pokazalo da je klasa vrlo plodno tlo za istraživanje. A ekspedicija još nije gotova. Sljedeći mjesec završit ću svoj izlet u Graphicsrazred sa stupcem o metodama podrške za slike, a taj će stupac započeti mali niz o drugim temama povezanim sa slikama i AWT-om, uključujući proizvođače slika i potrošače slika.

Želim zahvaliti svima vama koji ste uzeli vremena da mi pišete sa svojim komentarima, idejama i prijedlozima. Nastavi s dobrim radom.

Todd Sundsted piše programe otkad su računala postala dostupna u modelima stolnih računala. Iako je izvorno bio zainteresiran za izgradnju distribuiranih objektnih aplikacija na C ++, Todd je prešao na programski jezik Java kad je Java postala očit izbor za takve stvari. Todd je koautor Java Language API SuperBible, sada u knjižarama svugdje. Osim pisanja, Todd pruža usluge internetskog i web savjetovanja tvrtkama na jugoistoku SAD-a.

Saznajte više o ovoj temi

  • GraphicsAPI klase :

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

  • FontAPI klase :

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

  • FontMetricsAPI klase :

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

  • Korištenje Graphicspredavanja:

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

  • API za internacionalizaciju:

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

  • Vodič za Java Mary Campione i Kathy Walrath:

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

Ovu priču "Crtanje teksta lako je s tri Java klase" izvorno je objavio JavaWorld.