Ohjelmointi

Tekstin piirtäminen on helppoa kolmen Java-luokan avulla

Alkeellisten geometristen tyyppien, kuten viivojen ja ympyröiden, piirtämismenetelmien lisäksi Grafiikka luokka tarjoaa menetelmiä tekstin piirtämiseen. Yhdistettynä Fontti ja FontMetrics luokissa tulos on joukko työkaluja, jotka tekevät houkuttelevan tekstin piirtämisestä paljon helpompaa kuin muuten voisi olla. Tämä sarake kattaa kaikki nämä luokat vuorotellen ja näyttää, miten niitä käytetään yhdessä. Ennen kuin aloitan, lyhyt katsaus Grafiikka luokka on kunnossa.

Arvostelu

Jotta voit käyttää Grafiikka luokan ymmärtäminen Grafiikka luokka itse vaaditaan. Tässä osassa on lyhyt kuvaus laitteen toiminnasta ja toiminnasta Grafiikka luokassa. Lukijoiden, jotka etsivät kattavaa kattavuutta, tulisi lukea lokakuun sarake, joka on saatavilla täältä.

Grafiikka luokassa on kaksi erilaista mutta toisiinsa liittyvää roolia abstraktissa ikkunointityökalussa (AWT). Ensinnäkin se ylläpitää grafiikkakontekstia, joka koostuu kaikista tiedoista, jotka vaikuttavat grafiikkaoperaation tulokseen. Tämä sisältää piirustuksen värin, kirjasimen ja leikkaavan suorakulmion sijainnin ja mitat (alue, johon grafiikkaa voidaan piirtää). Vielä tärkeämpää on, että grafiikkakonteksti määrittelee keskustelun kohteena olevien grafiikkaoperaatioiden kohteen (kohteet sisältävät komponentit ja kuvat).

Sen lisäksi, että rooli graafisena kontekstina, Grafiikka luokka tarjoaa menetelmiä yksinkertaisten geometristen muotojen, tekstin ja kuvien piirtämiseen että grafiikan kohde. Kaikki komponentin tai kuvan grafiikkaan liittyvät toiminnot suoritetaan jollakin näistä menetelmistä.

Piirrettäväksi ohjelma vaatii kelvollisen grafiikkakontekstin (jota edustaa Grafiikka luokka). Koska Grafiikka luokka on abstrakti perusluokka, sitä ei voida suoraviivoittaa. Esimerkki luodaan tyypillisesti komponentilla ja luovutetaan sitten ohjelmalle argumenttina komponentille päivittää() ja maali() menetelmiä. Näitä kahta menetelmää kutsutaan osana AWT: ssä aloitettua normaalia piirtosykliä.

Grafiikka luokka toimii yhdessä Fontti ja FontMetrics luokat tarjoamaan tarvittavat työkalut tekstin piirtämiseen kuvan tai komponentin sisällä. Aloitetaan tutkimalla Grafiikka luokan menetelmät tekstin piirtämiseen.

Luokan grafiikka

Grafiikka luokka tarjoaa kolme tapaa piirtää tekstiä komponenttiin tai kuvaan.

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

drawString () alla esitetty menetelmä ottaa parametreina esimerkin Merkkijono luokka, joka sisältää piirrettävän tekstin, ja kaksi kokonaislukua, jotka määrittelevät koordinaatit, joista tekstin tulisi alkaa.

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

Yllä olevan luettelon koodi näyttää drawString () komponentin sisällä käytetty menetelmä maali() menetelmä. Tämän esimerkin koodi piirtää sanan "abc" komponentin, joka sisältää tämän maali() menetelmä. x ja y koordinaatit määrittävät sijainnin ala vasen mukana olevan tekstiruudun kulma. Kuva 1 näyttää, miltä tulos näyttäisi, jos tämä koodi olisi osa sopivaa AWT-komponenttiobjektia.

Kuva 1: DrawString () -esittely

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

drawChars () alla oleva menetelmä ottaa parametreiksi merkkijonon, joka sisältää piirrettävän tekstin, kokonaisluvun arvon, joka osoittaa siirtymän taulukkoon, josta aloitetaan, kokonaislukuarvoon, joka osoittaa piirrettävien merkkien lukumäärän, ja kahteen kokonaislukuarvoon, jotka määrittelevät koordinaatit, joissa teksti pitäisi alkaa.

julkinen tyhjä maali (grafiikka 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); }

Yllä oleva koodi näyttää drawChars () komponentin sisällä käytetty menetelmä maali() menetelmä. Merkistö on piirretty kahteen osaan. Ensimmäisessä kahdesta puhelusta drawChars (), offset -parametri osoittaa, että piirustuksen tulisi alkaa taulukon ensimmäisellä merkillä ja pituus parametri osoittaa, että ensimmäiselle riville tulisi piirtää yhteensä viisi merkkiä. Toinen kahdesta puhelusta toimii samalla tavalla, mutta piirtää merkkiryhmän viisi viimeistä merkkiä aloittaen 25 pikselin kohdasta ensimmäisen. Kuva 2 näyttää miltä tulos näyttäisi, jos tämä koodi olisi osa sopivaa AWT-komponenttiobjektia.

Kuva 2: DrawChars () -esittely

void drawBytes (tavu [] data, int-offset, int-pituus, int x, int y)

Kuten alla on esitetty, drawBytes () menetelmä ottaa parametreina tavutaulukon, joka sisältää piirrettävän tekstin, kokonaislukuarvon, joka osoittaa siirtymän taulukkoon, josta aloittaa, kokonaislukuarvoon, joka osoittaa piirtettävien tavujen lukumäärän, ja kahteen kokonaislukuarvoon, jotka määrittelevät koordinaatit, joissa tekstin tulisi olla alkaa.

julkinen tyhjä maali (grafiikka g) {tavu [] 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); }

Yllä oleva koodi näyttää drawBytes () komponentin sisällä käytetty menetelmä maali() menetelmä. Kuva 3 näyttää miltä tulos näyttäisi, jos tämä koodi olisi osa sopivaa AWT-komponenttiobjektia.

Kuva 3: DrawBytes () -esittely

Unicode-tuki

Yksi Javain mainituimmista ominaisuuksista on sen tuki kansainvälisille komentosarjoille Unicoden kautta. On valitettavaa, että Java-ohjelmointikielen version 1.0 mukana toimitettu Java-luokan kirjasto ei tue täysin kielen tätä puolta. Vaikuttaa kuitenkin siltä, ​​että hyvät uutiset ovat aivan kulman takana. SunSoftilta saatavalla alustavalla kansainvälistymissovellusliittymällä (katso Resurssit) on sanottava:

JDK 1.0 rajoittui vain merkkien näyttämiseen Unicoden Latin-1-osajoukossa. Tämä rajoitus poistetaan JDK 1.1: stä. Java-ohjelmat pystyvät nyt näyttämään kaikki Unicode-merkit, jotka voidaan renderoida isäntäfontilla. Java tarjoaa pienen määrän ennalta määritettyjä "virtuaalisia" fonttien nimiä ja yhdistää ne todellisiin isäntäkirjasimiin. JDK 1.0: ssa kukin Java-fontin nimi yhdistettiin tarkalleen yhteen isäntäkirjasimeen. JDK 1.1: ssä Java-fontin nimi voi kartoittaa sarjan isäntäkirjasimia. Isäntäfonttisarja voidaan valita kattamaan niin suuri osa Unicode-merkistöstä kuin haluat.

Tekstin sijoittelu

Koska teksti on vain eräänlainen kuva AWT: lle, tekstirivi voidaan sijoittaa mihin tahansa - jopa toisen tekstirivin päälle. Satunnaisen sijoittamisen vaikutus ei kuitenkaan välttämättä ole silmille miellyttävä. Kirjasimen määrittely sisältää ohjeet viivan ja merkin sijoitteluun, jotta ohjelmoijaa voidaan auttaa luomaan esteettisesti miellyttävä teksti. Jos näitä ohjeita noudatetaan, ne auttavat tuottamaan miellyttävää lopputulosta.

Kuva 4 sisältää rivin tekstiä, joka on merkitty osoittamaan ominaisuuksia, joista aiomme keskustella.

Kuva 4: Tekstirivi

y Koordinaattiparametri edellisen osan menetelmissä määrittää sijainnin lähtötaso tekstiriviltä. lähtötaso on rivi, jolla suurin osa tekstirivin merkeistä lepää (lukuun ottamatta merkkejä, joissa on jälkeläisiä, kuten "g" ja "y"). Lähtötaso ei oikeastaan ​​ole kirjasimen ominaisuus, mutta se on viitekohta, johon kaikki muut ominaisuudet viittaavat.

nousu on etäisyys perusviivasta useimpien fonttien merkkien yläosaan. Tämä on tyypillisesti fontin isojen kirjainten sekä merkkien, kuten "f" ja "h", korkeus. Tämä luku on kuitenkin vain ohjeellinen. Jotkut fontin merkit saattavat todella ulottua tämän etäisyyden yläpuolelle.

laskeutuminen on etäisyys perusviivasta niiden fonttien alareunaan, joilla on jälkeläisiä - merkkejä, kuten "p", "g" ja "y". Kuten nousun kohdalla, tämä luku on vain ohjeellinen. Jotkut fontin merkit saattavat todella ulottua tämän etäisyyden alapuolelle.

johtava (lausutaan "ledding") on tilan määrä yhden tekstirivin laskeutumisen ja sen alapuolella olevan rivin nousun välillä. Tekstirivin korkeus (etäisyys yhden tekstirivin perusviivasta sen ylä- tai alapuolella olevan tekstirivin perusviivaan) sisältää tämän ylimääräisen tilan.

Koko kirjasinta säätelevien ominaisuuksien lisäksi jokaisella kirjasimen merkillä on etukäteen. Edistyminen määrittää, kuinka monta pikseliä erottaa merkin alun oikealla olevan merkin alusta; Lyhyesti sanottuna se on hahmon leveys. Jälleen kerran jotkut fontin merkit voivat todella ylittää tämän etäisyyden.

Laskemalla yhteen tekstirivin kaikkien merkkien leveydet voidaan laskea koko tekstirivin pituus. FontMetrics Seuraavassa luokassa on menetelmä, joka tekee juuri tämän ja paljon muuta.

Luokan FontMetrics

FontMetrics luokka tarjoaa yksinkertaisen tavan päästä käsittelemään yllä käsiteltyjä ominaisuuksia. Tässä on getFontMetrics menetelmä toiminnassa:

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

Yllä oleva koodi osoittaa, kuinka nykyistä kirjasinta kuvaavat kirjasimetiedot voidaan saada. getFontMetrics () method palauttaa FontMetrics luokassa. FontMetrics luokka tarjoaa seuraavat menetelmät:

int getAscent ()

  • Palauttaa fontin nousun.

int getDescent ()

  • Palauttaa fontin laskeutumisen.

int getLeading ()

  • Palauttaa fontin etusivun.

int getHeight ()

  • Palauttaa fontin korkeuden. Korkeus on fontin nousun, laskeutumisen ja etenemisen summa.

int charWidth (int ch)

  • Palauttaa määritetyn merkin leveyden.

int charWidth (char ch)

  • Palauttaa määritetyn merkin leveyden.

int [] getWidths ()

  • Palauttaa kokonaislukumatriisin, joka sisältää fontin ensimmäisten 256 merkin leveydet.

Kuten edellä mainittiin, fontin muodostavat merkit voivat joskus ulottua edellä mainittujen menetelmien ilmoittaman nousun, laskeutumisen ja leveyden ulkopuolelle. Tapauksissa, joissa vaaditaan tarkkoja arvoja, annetaan seuraavat menetelmät.

int getMaxAscent ()

  • Palauttaa fontin suurimman nousun.

int getMaxDescent ()

  • Palauttaa fontin suurimman laskeutumisen.

int getMaxAdvance ()

  • Palauttaa fontin leveimmän merkin leveyden.

Seuraavat menetelmät tarjoavat tietoa merkkisarjan käyttämästä leveydestä.

int stringWidth (merkkijono str)

  • Palauttaa merkkijonon leveyden.

int bytesWidth (tavu [] rgb, int-offset, int-pituus)

  • Palauttaa pituus pitkä tavujärjestys alkaen offset.

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

  • Palauttaa pituus pitkä merkkijono alkaen offset.

Luokan fontti

Fontti luokka kiteyttää tietoja fontista. Uusi fontti tuotetaan luomalla Fontti luokan nimi, tyyli ja pistekoko.

Fontti f = uusi fontti ("Dialog", Font.PLAIN, 12); 

Kun se on luotu, se voidaan määrittää fontille Grafiikka esine.

g.setFont (f); 

Grafiikka object käyttää sitten fonttia kaikissa seuraavissa tekstiin liittyvissä grafiikkaoperaatioissa.

Fontti luokka tarjoaa menetelmät kirjasimen tietojen saamiseksi sen luomisen jälkeen.

Merkkijono getName ()

  • Palauttaa fontin nimen.

Merkkijono getFamily ()

  • Palauttaa fontin alustakohtaisen nimen.

int getSize ()

  • Palauttaa fontin pistekoon.

int getStyle ()

  • Palauttaa fontin tyylin.

totuusarvo onBold ()

  • Palauttaa totta jos kirjasin on lihavoitu.

totuusarvo on italia ()

  • Palauttaa totta jos kirjasin on kursivoitu.

looginen isPlain ()

  • Palauttaa totta jos kirjasin on tavallinen.

Merkkijono getName ()

  • Palauttaa fontin nimen.

Esittely

Kuvan 5 sovelma näyttää tekstirivin, jonka merkinnät ovat riittävät osoittamaan liittyvien muuttujien arvot yllä olevasta osiosta. Paksu musta viiva istuu perusviivalla. Kaksi ylimääräistä riviä ilmaisee kyseessä olevan fontin nousun ja laskeutumisen. Pienemmät pystyviivat osoittavat merkkien leveydet. Kolmen alasvetovalikon avulla voit valita fontin, sen tyylin ja pistekoon.

Tarvitset Java-yhteensopivan selaimen nähdäksesi tämän sovelman.Kuva 5: Interaktiivinen fonttimittari-selain

Appletti käyttää Grafiikka, Fonttija FontMetrics luokat laajasti. Sen lähde on saatavilla täältä.

Johtopäätös

Näyttää siltä Grafiikka luokka on osoittautunut erittäin hedelmälliseksi maaksi etsinnälle. Retkikunta ei ole vielä valmis. Ensi kuussa lopetan retkeni Grafiikka luokka sarakkeella kuvan tukimenetelmistään, ja sarake aloittaa pienen sarjan muista kuviin ja AWT: hen liittyvistä aiheista, mukaan lukien kuvantuottajat ja kuvan kuluttajat.

Haluan kiittää kaikkia teitä, jotka olette viettäneet aikaa kirjoittaa minulle kommentteinne, ideoitanne ja ehdotuksianne. Jatka samaan malliin.

Todd Sundsted on kirjoittanut ohjelmia siitä lähtien, kun tietokoneita oli saatavana työpöydän malleina. Vaikka Todd oli alun perin kiinnostunut hajautettujen objektisovellusten rakentamisesta C ++: ssa, Todd muutti Java-ohjelmointikielelle, kun Java tuli itsestään selväksi valinnaksi sellaiselle. Todd on Java Language API SuperBible -kirjoittaja, joka on nyt kirjakaupoissa kaikkialla. Kirjoittamisen lisäksi Todd tarjoaa Internet- ja verkkokonsultointipalveluja yrityksille Kaakkois-Yhdysvalloissa.

Lisätietoja tästä aiheesta

  • Luokka Grafiikka API:

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

  • Luokka Fontti API:

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

  • Luokka FontMetrics API:

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

  • Käyttämällä Grafiikka luokka:

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

  • Kansainvälistymisen sovellusliittymä:

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

  • Java-opetusohjelma kirjoittanut Mary Campione ja Kathy Walrath:

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

Tämän tarinan "Tekstin piirtäminen on helppoa kolmen Java-luokan avulla" julkaisi alun perin JavaWorld.

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