Programmering

Det er let at tegne tekst med tre Java-klasser

Ud over metoder til tegning af primitive geometriske typer som linjer og cirkler, er Grafik klasse giver metoder til tegning af tekst. Når det kombineres med Skrifttype og FontMetrics klasser, er resultatet et sæt værktøjer, der gør jobbet med at tegne tiltalende tekst meget lettere, end det ellers kunne være. Denne kolonne dækker hver af disse klasser igen og viser dig, hvordan du bruger dem sammen. Før jeg begynder, dog en kort gennemgang af rollen som Grafik klasse er i orden.

En anmeldelse

For at bruge tekstmetoderne i Grafik klasse, en forståelse af rolle Grafik klasse selv er påkrævet. Dette afsnit præsenterer en kort oversigt over funktion og funktion af Grafik klasse. Læsere, der søger grundig dækning, bør læse min oktober-kolonne, der er tilgængelig her.

Det Grafik klasse spiller to forskellige, men beslægtede roller i det abstrakte vinduesværktøjssæt (AWT). For det første opretholder den grafiske kontekst, som består af alle de oplysninger, der vil påvirke resultatet af en grafikoperation. Dette inkluderer tegningsfarven, skrifttypen og placeringen og dimensionerne på klipningsrektanglet (det område, hvor grafik kan tegnes). Mere vigtigt er det, at grafikkonteksten definerer destinationen for de grafiske operationer, der skal diskuteres (destinationer inkluderer komponenter og billeder).

Ud over sin rolle som grafisk sammenhæng, har Grafik klasse giver metoder til at tegne enkle geometriske former, tekst og billeder til den grafiske destination. Alle grafikrelaterede operationer på en komponent eller et billede sker via en af ​​disse metoder.

For at tegne kræver et program en gyldig grafisk kontekst (repræsenteret af en forekomst af Grafik klasse). Fordi Grafik klasse er en abstrakt basisklasse, den kan ikke instantieres direkte. En forekomst oprettes typisk af en komponent og overføres derefter til programmet som et argument til en komponents opdater () og maling() metoder. Disse to metoder kaldes som en del af den normale tegningscyklus, der initieres inden for AWT.

Det Grafik klasse arbejder sammen med Skrifttype og FontMetrics klasser for at give de nødvendige værktøjer til at tegne tekst i et billede eller en komponent. Lad os begynde med at undersøge Grafik klassens metoder til tegning af tekst.

Klassegrafik

Det Grafik klasse giver tre metoder, der tegner tekst på en komponent eller et billede.

ugyldig drawString (streng str, int x, int y)

Det drawString () Metoden, vist nedenfor, tager som parameter en forekomst af Snor klasse, der indeholder teksten, der skal tegnes, og to heltalværdier, der angiver koordinaterne, hvor teksten skal starte.

offentlig tom maling (grafik g) {g.drawString ("abc", 25, 25); } 

Koden i ovenstående liste viser drawString () metode, der bruges inden for en komponents maling() metode. Koden i dette eksempel trækker ordet "abc" på den komponent, der indeholder denne maling() metode. Det x og y koordinater angiver placeringen af nederst til venstre hjørne af det vedlagte tekstfelt. Figur 1 viser, hvordan resultatet ville se ud, hvis denne kode var en del af et passende AWT-komponentobjekt.

Figur 1: En drawString () demonstration

ugyldige drawChars (char [] data, int offset, int længde, int x, int y)

Det drawChars () Metoden nedenfor tager som parametre et tegnarray, der indeholder teksten, der skal tegnes, en heltalværdi, der angiver forskydningen i det array, som skal begynde, en heltalværdi, der angiver antallet af tegn, der skal tegnes, og to heltalværdier, der specificerer koordinaterne, hvor teksten skulle starte.

offentlig ugyldig maling (grafik 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); }

Koden ovenfor viser drawChars () metode, der anvendes inden for en komponents maling() metode. Tegnopstillingen er tegnet i to dele. I den første af de to opkald til drawChars (), det forskudt parameter angiver, at tegningen skal begynde med det første tegn i arrayet og længde parameter angiver, at der i alt skal tegnes fem tegn på den første linje. Det andet af de to opkald fungerer på en lignende måde, men tegner de sidste fem tegn i tegnarrayet, der begynder med en position 25 pixels under den første. Figur 2 viser, hvordan resultatet ville se ud, hvis denne kode var en del af et passende AWT-komponentobjekt.

Figur 2: En drawChars () demonstration

ugyldige drawBytes (byte [] data, int offset, int længde, int x, int y)

Som vist nedenfor er drawBytes () Metoden tager som parametre en byte-array, der indeholder teksten, der skal tegnes, en heltalværdi, der angiver forskydningen i den array, som skal begynde, en heltalværdi, der angiver antallet af byte, der skal tegnes, og to heltalværdier, der specificerer koordinaterne, hvor teksten skal Start.

offentlig ugyldig maling (grafik 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); }

Ovenstående kode viser drawBytes () metode, der bruges inden for en komponents maling() metode. Figur 3 viser, hvordan resultatet ville se ud, hvis denne kode var en del af et passende AWT-komponentobjekt.

Figur 3: En drawBytes () demonstration

Unicode support

En af Java's mest udråbte funktioner er dens understøttelse af internationale scripts via Unicode. Det er uheldigt, at Java-klassebiblioteket, der blev leveret med version 1.0 af Java-programmeringssproget, ikke fuldt ud understøttede denne facet af sproget. Det ser imidlertid ud til, at gode nyheder er lige rundt om hjørnet. Den foreløbige internationaliserings-API (se ressourcer), der er tilgængelig fra SunSoft, siger dette:

JDK 1.0 var begrænset til kun at vise tegnene i Latin-1-undergruppen af ​​Unicode. Denne begrænsning fjernes i JDK 1.1. Java-programmer kan nu vise ethvert Unicode-tegn, der kan gengives med en værtsskrifttype. Java leverer et lille antal foruddefinerede "virtuelle" skrifttypenavne og kortlægger dem til ægte skrifttyper, der er tilgængelige på værten. I JDK 1.0 kortlægges hvert Java-skrifttypenavn til nøjagtigt en værtsskrifttype. I JDK 1.1 kan et Java-skrifttypenavn kortlægges til en række værtsskrifttyper. Serien af ​​værtsfonte kan vælges til at dække så meget af Unicode-tegnsættet som ønsket.

Tekstplacering

Da tekst bare er en anden slags figur til AWT, kan en tekstlinje placeres hvor som helst - selv oven på en anden tekstlinje. Effekten af ​​tilfældig placering vil dog ikke nødvendigvis være behagelig for øjet. For at hjælpe programmøren med at producere æstetisk tiltalende tekst inkluderer en fontdefinition retningslinjer for placering af linje og tegn. Disse retningslinjer hjælper, hvis de følges, med at producere en behagelig produktion.

Figur 4 indeholder en tekstlinje, der er markeret for at indikere de egenskaber, som vi er ved at diskutere.

Figur 4: En tekstlinje

Det y koordinatparameter i metoderne i det foregående afsnit angiver placeringen af basislinje af en tekstlinje. Det basislinje er den linje, hvor de fleste tegn i en tekstlinje hviler (undtagelsen er de tegn med nedstigninger som "g" og "y"). Basislinjen er ikke rigtig en egenskab ved en skrifttype, men er det referencepunkt, som alle de andre egenskaber henviser til.

Det opstigning er afstanden fra basislinjen til toppen af ​​de fleste tegn i en skrifttype. Dette er typisk højden af ​​store bogstaver i skrifttypen og af tegn som "f" og "h". Dette tal er dog kun en retningslinje. Nogle tegn i skrifttypen kan faktisk strække sig over denne afstand.

Det nedstigning er afstanden fra basislinjen til bunden af ​​tegnene i en skrifttype, der har nedstigninger - tegn som "p", "g" og "y". Som med opstigning er denne figur kun en retningslinje. Nogle tegn i skrifttypen kan faktisk strække sig under denne afstand.

Det førende (udtalt "ledding") er mængden af ​​mellemrum mellem nedstigningen af ​​en tekstlinje og opstigningen af ​​linjen under den. Højden på en tekstlinje (afstanden fra basislinjen for en tekstlinie til basislinjen for en tekstlinje over eller under den) inkluderer dette ekstra mellemrum.

Ud over de karakteristika, der styrer en skrifttype som helhed, har hvert tegn i en skrifttype en rykke. Forskuddet angiver, hvor mange pixels der adskiller begyndelsen af ​​tegnet fra starten af ​​et tegn til dets højre; kort sagt, det er en tegns bredde. Igen kan nogle tegn i en skrifttype faktisk strække sig ud over denne afstand.

Ved at tilføje bredderne på alle tegnene i en tekstlinje kan længden af ​​hele tekstlinjen beregnes. Det FontMetrics klasse nedenfor giver en metode, der gør netop dette og mere.

Klasse FontMetrics

Det FontMetrics klasse giver en enkel måde at komme til de egenskaber, der er diskuteret ovenfor. Her er getFontMetrics metode i aktion:

offentlig ugyldig maling (grafik g) {FontMetrics fm = g.getFontMetrics (); . . . } 

Koden ovenfor viser, hvordan man kan få fontoplysninger, der beskriver den aktuelle skrifttype. Det getFontMetrics () metoden returnerer en forekomst af FontMetrics klasse. Det FontMetrics klasse giver følgende metoder:

int getAscent ()

  • Returnerer stigningen af ​​skrifttypen.

int getDescent ()

  • Returnerer skrifttypens nedstigning.

int getLeading ()

  • Returnerer den forreste del af skrifttypen.

int getHeight ()

  • Returnerer skrifttypens højde. Højden er summen af ​​skrifttypens opstigning, nedstigning og førende.

int charWidth (int ch)

  • Returnerer bredden på det angivne tegn.

int charWidth (char ch)

  • Returnerer bredden på det angivne tegn.

int [] getWidths ()

  • Returnerer et heltal array, der indeholder bredden af ​​skrifttypens første 256 tegn.

Som nævnt ovenfor kan de tegn, der udgør en skrifttype undertiden strække sig ud over opstigningen, nedstigningen og bredden rapporteret ved ovenstående metoder. I tilfælde, hvor der kræves nøjagtige værdier, gives følgende metoder.

int getMaxAscent ()

  • Returnerer den maksimale stigning af skrifttypen.

int getMaxDescent ()

  • Returnerer skrifttypens maksimale nedstigning.

int getMaxAdvance ()

  • Returnerer bredden af ​​det bredeste tegn i skrifttypen.

Følgende metoder giver information om bredden optaget af en række af tegn.

int stringWidth (String str)

  • Returnerer bredden af ​​rækkefølgen af ​​tegn.

int bytesWidth (byte [] rgb, int offset, int længde)

  • Returnerer bredden på længde lang række af bytes, der begynder ved forskudt.

int charsWidth (char [] rgc, int offset, int længde)

  • Returnerer bredden på længde lang række af tegn, der begynder ved forskudt.

Klasseskrifttype

Det Skrifttype klasse indkapsler oplysninger om en skrifttype. En ny skrifttype produceres ved at oprette en forekomst af Skrifttype klasse med navn, stil og punktstørrelse.

Skrifttype f = ny skrifttype ("Dialog", Font.PLAIN, 12); 

Når den er oprettet, kan en skrifttype tildeles en forekomst af Grafik objekt.

g.setFont (f); 

Det Grafik objektet bruger derefter skrifttypen til alle efterfølgende tekstrelaterede grafikhandlinger.

Det Skrifttype klasse giver metoder til at få information om en skrifttype, når den er oprettet.

String getName ()

  • Returnerer navnet på skrifttypen.

String getFamily ()

  • Returnerer det platformspecifikke navn på skrifttypen.

int getSize ()

  • Returnerer skrifttypens punktstørrelse.

int getStyle ()

  • Returnerer skrifttypens stil.

boolsk isBold ()

  • Vender tilbage rigtigt hvis skrifttypen er fed.

boolsk istalsk ()

  • Vender tilbage rigtigt hvis skrifttypen er kursiv.

boolsk isPlain ()

  • Vender tilbage rigtigt hvis skrifttypen er almindelig.

String getName ()

  • Returnerer navnet på skrifttypen.

En demonstration

Appleten i figur 5 viser en tekstlinje med markering, der er tilstrækkelig til at indikere værdierne for de tilknyttede metrics fra afsnittet ovenfor. En tyk sort linje sidder ved basislinjen. To yderligere linjer angiver stigningen og nedstigningen af ​​den pågældende skrifttype. Mindre lodrette linjer angiver tegnernes bredde. De tre rullemenuer giver dig mulighed for at vælge en skrifttype, dens stil og dens punktstørrelse.

Du har brug for en Java-aktiveret browser for at se denne applet.Figur 5: En interaktiv font metrisk browser

Appleten bruger Grafik, Skrifttypeog FontMetrics klasser i vid udstrækning. Dens kilde er tilgængelig her.

Konklusion

Det ser ud til, at Grafik klasse har vist sig at være meget frugtbar grund til udforskning. Og ekspeditionen er endnu ikke afsluttet. Næste måned afslutter jeg min udflugt til Grafik klasse med en kolonne om dets billedstøttemetoder, og den kolonne begynder en lille serie om andre emner relateret til billeder og AWT, herunder billedproducenter og billedforbrugere.

Jeg vil gerne takke alle jer, der har taget tid til at skrive til mig med dine kommentarer, ideer og forslag. Fortsæt det gode arbejde.

Todd Sundsted har skrevet programmer, siden computere blev tilgængelige i stationære modeller. Selvom det oprindeligt var interesseret i at oprette distribuerede objektapplikationer i C ++, flyttede Todd til Java-programmeringssproget, da Java blev det oplagte valg for den slags ting. Todd er medforfatter af Java Language API SuperBible, nu i boghandlere overalt. Ud over at skrive, leverer Todd internet- og webkonsulenttjenester til virksomheder i det sydøstlige USA.

Lær mere om dette emne

  • Klassen Grafik API:

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

  • Klassen Skrifttype API:

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

  • Klassen FontMetrics API:

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

  • Bruger Grafik klasse:

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

  • Internationaliserings-API:

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

  • Java-vejledningen af Mary Campione og Kathy Walrath:

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

Denne historie, "Det er let at tegne tekst med tre Java-klasser" blev oprindeligt udgivet af JavaWorld.