Programmering

Det er enkelt å tegne tekst med tre Java-klasser

I tillegg til metoder for tegning av primitive geometriske typer som linjer og sirkler, er Grafikk klasse gir metoder for tegning av tekst. Når det kombineres med Font og FontMetrics klasser, er resultatet et sett med verktøy som gjør jobben med å tegne tiltalende tekst mye enklere enn den ellers kan være. Denne kolonnen vil dekke hver av disse klassene etter tur og vise deg hvordan du bruker dem sammen. Før jeg begynner, får jeg imidlertid en kort gjennomgang av rollen til Grafikk klassen er i orden.

En anmeldelse

For å bruke tekstmetodene til Grafikk klasse, en forståelse av rollen til Grafikk klassen selv er påkrevd. Denne delen presenterer en kort oversikt over funksjonen og driften av Grafikk klasse. Lesere som ser etter grundig dekning, bør lese oktober-spalten min, tilgjengelig her.

De Grafikk klassen spiller to forskjellige, men relaterte roller i det abstrakte vindusverktøyet (AWT). For det første opprettholder den grafikkonteksten, som består av all informasjonen som vil påvirke resultatet av en grafikkoperasjon. Dette inkluderer tegningsfargen, skrifttypen og plasseringen og dimensjonene til utklippsrektangelet (regionen der grafikk kan tegnes). Enda viktigere, grafikkonteksten definerer destinasjonen for grafikkoperasjonene som skal diskuteres (destinasjoner inkluderer komponenter og bilder).

I tillegg til sin rolle som grafisk sammenheng, har Grafikk klasse gir metoder for å tegne enkle geometriske former, tekst og bilder til grafikkdestinasjonen. Alle grafikkrelaterte operasjoner på en komponent eller et bilde skjer via en av disse metodene.

For å tegne krever et program en gyldig grafikkontekst (representert av en forekomst av Grafikk klasse). Fordi det Grafikk klasse er en abstrakt basisklasse, den kan ikke instantiseres direkte. En forekomst blir vanligvis opprettet av en komponent, og deretter overlevert til programmet som et argument til en komponent Oppdater() og maling() metoder. Disse to metodene kalles som en del av den normale tegnesyklusen som er initiert i AWT.

De Grafikk klassen jobber sammen med Font og FontMetrics klasser for å gi verktøyene som er nødvendige for å tegne tekst i et bilde eller komponent. La oss begynne med å undersøke Grafikk klassens metoder for tegning av tekst.

Klassegrafikk

De Grafikk klasse gir tre metoder som tegner tekst på en komponent eller et bilde.

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

De drawString () metoden, vist nedenfor, tar som parameter en forekomst av String klasse som inneholder teksten som skal tegnes, og to heltallverdier som angir koordinatene der teksten skal starte.

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

Koden i oppføringen ovenfor viser drawString () metoden som brukes i en komponent maling() metode. Koden i dette eksemplet tegner ordet "abc" på komponenten som inneholder dette maling() metode. De x og y koordinatene angir plasseringen til Nedre venstre hjørnet av den vedlagte tekstboksen. Figur 1 viser hvordan resultatet ville se ut hvis denne koden var en del av et passende AWT-komponentobjekt.

Figur 1: En drawString () demonstrasjon

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

De drawChars () Metoden nedenfor tar som parametere et tegnrute som inneholder teksten som skal tegnes, en heltallverdi som indikerer forskyvningen i matrisen der du skal begynne, en heltallsverdi som indikerer antall tegn som skal tegnes, og to heltalsverdier som spesifiserer koordinatene der teksten skal starte.

offentlig tomrom (grafikk 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 () metoden som brukes i en komponent maling() metode. Tegnfeltet er tegnet i to deler. I den første av de to samtalene til drawChars (), den forskyvning parameter indikerer at tegningen skal begynne med det første tegnet i matrisen, og lengde parameter indikerer at totalt fem tegn skal tegnes på første linje. Den andre av de to samtalene fungerer på en lignende måte, men tegner de siste fem tegnene i tegnoppstillingen som begynner på en posisjon 25 piksler under den første. Figur 2 viser hvordan resultatet ville se ut hvis denne koden var en del av et passende AWT-komponentobjekt.

Figur 2: En drawChars () demonstrasjon

ugyldige drawBytes (byte [] data, int offset, int lengde, int x, int y)

Som vist nedenfor, drawBytes () metoden tar som parametere en byte-matrise som inneholder teksten som skal tegnes, en heltallverdi som indikerer forskyvningen i matrisen der du skal begynne, en heltallverdi som indikerer antall byte som skal tegnes, og to heltallverdier som spesifiserer koordinatene der teksten skal start.

offentlig tomrom (grafikk 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); }

Ovennevnte kode viser drawBytes () metoden i bruk innenfor en komponents maling() metode. Figur 3 viser hvordan resultatet ville se ut hvis denne koden var en del av et passende AWT-komponentobjekt.

Figur 3: En drawBytes () demonstrasjon

Unicode-støtte

En av Java mest fremhevede funksjoner er støtten til internasjonale skript via Unicode. Det er uheldig at Java-klassebiblioteket som ble levert med versjon 1.0 av Java-programmeringsspråket ikke fullt ut støttet denne fasetten av språket. Imidlertid ser det ut til at gode nyheter er rett rundt hjørnet. Den foreløpige internasjonaliserings-API (se Resources), tilgjengelig fra SunSoft, har dette å si:

JDK 1.0 var begrenset til å bare vise tegnene i Latin-1-delmengden av Unicode. Denne begrensningen fjernes i JDK 1.1. Java-programmer vil nå kunne vise hvilket som helst Unicode-tegn som kan gjengis med en vertfont. Java tilbyr et lite antall forhåndsdefinerte "virtuelle" skriftnavn og tilordner dem til ekte skrifttyper som er tilgjengelige på verten. I JDK 1.0 ble hvert Java-fontnavn tilordnet til nøyaktig en vertsfont. I JDK 1.1 kan et Java-fontnavn tilordnes til en serie vertsskrifter. Serien med vertsfonter kan velges for å dekke så mye av Unicode-tegnsettet som ønsket.

Tekstplassering

Fordi tekst bare er en annen type figur til AWT, kan en tekstlinje plasseres hvor som helst - selv oppå en annen tekstlinje. Effekten av tilfeldig plassering vil imidlertid ikke nødvendigvis være behagelig for øyet. For å hjelpe programmereren med å produsere estetisk tiltalende tekst, inneholder en fontdefinisjon retningslinjer for plassering av linje og tegn. Disse retningslinjene, hvis de følges, vil bidra til å gi behagelige resultater.

Figur 4 inneholder en tekstlinje som er merket opp for å indikere egenskapene vi skal diskutere.

Figur 4: En tekstlinje

De y koordinatparameter i metodene i forrige avsnitt spesifiserer plasseringen av grunnlinje av en tekstlinje. De grunnlinje er linjen som de fleste tegnene i en tekstlinje hviler på (unntaket er tegn med nedstigninger som "g" og "y"). Basislinjen er egentlig ikke en egenskap for en skrift, men er referansepunktet som alle de andre egenskapene refererer til.

De stigning er avstanden fra grunnlinjen til toppen av de fleste tegnene i en skrift. Dette er vanligvis høyden på store bokstaver i skrifttypen og tegn som "f" og "h". Denne figuren er imidlertid bare en retningslinje. Noen tegn i fonten kan faktisk strekke seg over denne avstanden.

De avstamning er avstanden fra grunnlinjen til bunnen av tegnene i en skrift som har nedstigninger - tegn som "p", "g" og "y". Som med oppstigning er denne figuren bare en retningslinje. Noen tegn i skrifttypen kan faktisk strekke seg under denne avstanden.

De ledende (uttalt "ledding") er mengden mellomrom mellom nedstigningen av en tekstlinje og oppstigningen av linjen under den. Høyden på en tekstlinje (avstanden fra grunnlinjen til en tekstlinje til grunnlinjen til en tekstlinje over eller under den) inkluderer denne ekstra plassen.

I tillegg til egenskapene som styrer en skrift som helhet, har hvert tegn i en skrift en avansere. Forskuddet spesifiserer hvor mange piksler som skiller begynnelsen av tegnet fra begynnelsen av et tegn til høyre; kort sagt, det er tegnets bredde. Nok en gang kan noen tegn i en skrift faktisk strekke seg utover denne avstanden.

Ved å legge sammen bredden på alle tegnene i en tekstlinje, kan lengden på hele tekstlinjen beregnes. De FontMetrics klasse nedenfor gir en metode som gjør nettopp dette og mer.

Class FontMetrics

De FontMetrics klasse gir en enkel måte å komme seg til egenskapene som er diskutert ovenfor. Her er getFontMetrics metode i aksjon:

offentlig tomrom (Grafikk g) {FontMetrics fm = g.getFontMetrics (); . . . } 

Koden ovenfor viser hvordan man kan få tak i informasjon om skriftverdier som beskriver gjeldende skrift. De getFontMetrics () metoden returnerer en forekomst av FontMetrics klasse. De FontMetrics klasse gir følgende metoder:

int getAscent ()

  • Returnerer stigningen av skriften.

int getDescent ()

  • Returnerer nedstigningen av skriften.

int getLeading ()

  • Returnerer ledelsen av skriften.

int getHeight ()

  • Returnerer høyden på skriften. Høyden er summen av skriftens stigning, nedstigning og fremføring.

int charWidth (int ch)

  • Returnerer bredden på det angitte tegnet.

int charWidth (char ch)

  • Returnerer bredden på det angitte tegnet.

int [] getWidths ()

  • Returnerer et heltall array som inneholder bredden på fontens første 256 tegn.

Som nevnt ovenfor, kan tegnene som utgjør en skrift noen ganger strekke seg utover stigningen, nedstigningen og bredden som er rapportert ved hjelp av metodene ovenfor. I tilfeller der det kreves eksakte verdier, er følgende metoder gitt.

int getMaxAscent ()

  • Returnerer maksimal stigning av skriften.

int getMaxDescent ()

  • Returnerer maksimal nedstigning for skrift.

int getMaxAdvance ()

  • Returnerer bredden på det bredeste tegnet i skriften.

Følgende metoder gir informasjon om bredden som er tatt opp av en sekvens av tegn.

int stringWidth (String str)

  • Returnerer bredden på tegnrekkefølgen.

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

  • Returnerer bredden på lengde lang rekkefølge av byte som begynner kl forskyvning.

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

  • Returnerer bredden på lengde lang sekvens av tegn som begynner kl forskyvning.

Klasseskrift

De Font klasse innkapsler informasjon om en skrift. En ny font produseres ved å opprette en forekomst av Font klasse med navn, stil og punktstørrelse.

Skrift f = ny skrift ("Dialog", Font.PLAIN, 12); 

Når den er opprettet, kan en skrift tildeles en forekomst av Grafikk gjenstand.

g.setFont (f); 

De Grafikk objektet vil da bruke skriften for alle påfølgende tekstrelaterte grafikkoperasjoner.

De Font klasse gir metoder for å få informasjon om en skrift når den er opprettet.

String getName ()

  • Returnerer navnet på skriften.

String getFamily ()

  • Returnerer det spesifikke navnet på skriften.

int getSize ()

  • Returnerer punktstørrelsen på skriften.

int getStyle ()

  • Returnerer stilen på fonten.

boolsk isBold ()

  • Returnerer ekte hvis skrifttypen er fet.

boolsk isItalic ()

  • Returnerer ekte hvis skrifttypen er kursiv.

boolsk isPlain ()

  • Returnerer ekte hvis skriften er ren.

String getName ()

  • Returnerer navnet på skriften.

En demonstrasjon

Appleten i figur 5 viser en tekstlinje med markering som er tilstrekkelig til å indikere verdiene til de tilknyttede beregningene fra seksjonen ovenfor. En tykk svart linje sitter ved baselinjen. To ytterligere linjer angir stigningen og nedstigningen av den aktuelle skrifttypen. Mindre vertikale linjer angir bredden på tegnene. De tre rullegardinmenyene lar deg velge en skrift, stil og punktstørrelse.

Du trenger en Java-aktivert nettleser for å se denne appleten.Figur 5: En interaktiv nettleser for metriske skrifttyper

Appleten bruker Grafikk, Font, og FontMetrics klasser omfattende. Kilden er tilgjengelig her.

Konklusjon

Det ser ut til at Grafikk klasse har vist seg å være svært fruktbar grunn for leting. Og ekspedisjonen er ennå ikke ferdig. Neste måned avslutter jeg utflukten til Grafikk klasse med en kolonne på bildestøttemetodene, og den kolonnen begynner en liten serie om andre emner relatert til bilder og AWT, inkludert bildeprodusenter og bildeforbrukere.

Jeg vil takke alle dere som har tatt deg tid til å skrive til meg med dine kommentarer, ideer og forslag. Fortsett det gode arbeidet.

Todd Sundsted har skrevet programmer siden datamaskiner ble tilgjengelige i stasjonære modeller. Selv om han opprinnelig var interessert i å bygge distribuerte objektapplikasjoner i C ++, flyttet Todd til Java-programmeringsspråket da Java ble det åpenbare valget for den slags ting. Todd er medforfatter av Java Language API SuperBible, nå i bokhandler overalt. I tillegg til å skrive, tilbyr Todd internett- og nettkonsulenttjenester til selskaper i det sørøstlige USA.

Lær mer om dette emnet

  • Klassen Grafikk API:

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

  • Klassen Font 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

  • Bruker Grafikk klasse:

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

  • Internasjonaliserings-API:

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

  • Java-veiledningen av Mary Campione og Kathy Walrath:

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

Denne historien, "Tegningstekst er enkelt med tre Java-klasser" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found