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.
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.
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.
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 tekstlinjeDe 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 skrifttyperAppleten 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.