Ohjelmointi

Grafiikka-luokan käyttäminen

Useat tekijät innostavat ihmisiä kirjoittamaan ohjelmia. Uskon, että monille motivaatio syntyy halusta luoda grafiikkaa, manipuloida kuvia tai animoida. Halusivatpa he luoda pelihalleja, lentosimulaattoreita tai CAD-paketteja, kehittäjät alkavat usein oppia piirtämään.

Abstract Windowing Toolkitin (tai AWT) grafiikkatyökalupakki antaa Java-ohjelmoijalle mahdollisuuden piirtää yksinkertaisia ​​geometrisia muotoja, tulostaa tekstiä ja sijoittaa kuvia komponentin, kuten kehyksen, paneelin tai kankaan, rajoihin.

Tämä sarake on ensimmäinen grafiikan aihealueestani. Se keskittyy Grafiikka luokka ja sen menetelmät yksinkertaisten geometristen muotojen piirtämiseksi, ja esittelee prosessin, jolla maalaus (ja uudelleenmaalaus) tapahtuu.

Aloitetaan keskipisteestä - Grafiikka luokassa.

Grafiikka-luokka

On tärkeää, että ohjelmoijat ymmärtävät Grafiikka luokassa ennen kuin he yrittävät piirtää kuvia Java-sovelluksen kautta. Grafiikka luokka tarjoaa kehyksen kaikille AWT: n grafiikkaoperaatioille. Siinä on kaksi erilaista, mutta toisiinsa liittyvää roolia. Ensinnäkin se on grafiikan konteksti. Grafiikkakonteksti on tietoa, joka vaikuttaa piirustustoimintoihin. Tämä sisältää taustan ja etualan värit, fontin sekä leikkaavan suorakulmion sijainnin ja mitat (komponentin alue, johon grafiikkaa voidaan piirtää). Se sisältää jopa tietoja itse grafiikkaoperaatioiden lopullisesta määränpäästä (näyttö tai kuva). Toiseksi Grafiikka luokka tarjoaa menetelmiä yksinkertaisten geometristen muotojen, tekstin ja kuvien piirtämiseksi grafiikan kohteeseen. Kaikki tulosteet grafiikkakohteeseen tapahtuu kutsumalla yksi 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 ohjelmalle argumenttina komponentille päivittää() ja maali() menetelmiä. Nämä kaksi menetelmää yhdessä maalata uudelleen () menetelmää, käsitellään seuraavassa osassa.

Menetelmät

Seuraavat kolme menetelmää koskevat grafiikan näyttämistä. Jokaisen oletusversiot toimitetaan luokittain Komponentti. Menetelmät päivittää() ja maali() tulisi määritellä uudelleen haluttujen grafiikkaoperaatioiden suorittamiseksi.

maalata uudelleen ()

public void repaint () public void repaint (long tm) public void repaint (int x, int y, int w, int h) public void repaint (pitkä tm, int x, int y, int w, int h)

maalata uudelleen () method pyytää osan maalaamista. Soittaja voi pyytää, että maalaus tapahtuu mahdollisimman pian, tai voi määrittää ajanjakson millisekunteina. Jos ajanjakso on määritetty, maalaus tapahtuu ennen ajanjakson päättymistä. Soittaja voi myös määrittää, että vain osa komponentista maalataan uudelleen. Tämä tekniikka on hyödyllinen, jos maalaus on aikaa vievää ja vain osa näytöstä on maalattava uudelleen. Listing 1: n koodi kuvaa, miten maalata uudelleen () menetelmää voidaan käyttää ohjelmassa.

boolen mouseDown (Tapahtuma e, int x, int y) {valittu_objekti.move (x, y); maalata uudelleen (); }

Listaus 1: Hiirellä alas tapahtumankäsittelijä

Koodin mouseDown () tapahtumankäsittelijä laskee kohteen sijainnin näytössä uudelleen hiiren sijainnin perusteella ja kutsuu maalata uudelleen () menetelmä osoittaa, että näyttö tulisi maalata uudelleen mahdollisimman pian.

päivittää()

public void -päivitys (grafiikka g)

päivittää() menetelmä kutsutaan vastauksena a maalata uudelleen () pyynnöstä tai vastauksena osan komponenttiin, joka paljastetaan tai näytetään ensimmäistä kertaa. Menetelmän ainoa argumentti on Grafiikka luokassa. Grafiikka Esimerkki on kelvollinen vain päivittää() menetelmä (ja kaikki menetelmät, joita se kutsuu), mutta se hävitetään pian päivittää() method palaa. Oletustoteutus, jonka tarjoaa Komponentti luokka poistaa taustan ja kutsuu maali() menetelmä (alla).

maali()

public void maali (grafiikka g)
 maali() menetelmä kutsutaan päivittää() menetelmällä ja vastaa grafiikan tosiasiallisesta piirtämisestä. Menetelmän ainoa argumentti on Grafiikka luokassa. Luokan tarjoama oletusarvoinen toteutus Komponentti ei tee mitään. 

Kuinka komponentit maalataan uudelleen

Näytön maalaamiseen tarvittavan ajan lyhentämiseksi AWT käyttää kahta pikavalintaa:

  • Ensinnäkin AWT maalaa uudelleen vain ne osat, jotka on maalattava uudelleen, joko siksi, että ne on paljastettu tai koska ne ovat pyytäneet maalaa.

  • Toiseksi, jos komponentti oli peitetty ja paljastui, AWT maalaa uudelleen vain osan aikaisemmin peitetystä komponentista.

Kuvan 1 sovelman avulla voit tarkkailla tätä prosessia sen tapahtuessa. Ohita pienoisohjelman yläosassa oleva teksti-alue hetkeksi ja katso vain näytön värillistä osaa. Peitä hetkeksi toista ikkunaa ja avaa osa sovelmasta. Huomaa, että vain peitetty appletin osa maalataan uudelleen. Lisäksi vain ne komponentit, jotka katettiin, maalataan uudelleen riippumatta siitä, mikä on niiden asema komponenttihierarkiassa. Käyttämällä tarkoituksella eri värejä appletti tekee tästä hienovaraisesta vaikutuksesta havaittavan. Tämän kuvan lähdekoodi on saatavilla täältä.

Kuva 1: Maalaa selain uudelleen

Graafinen koordinaattijärjestelmä

Seuraavassa osassa kuvatut menetelmät ottavat parametreina arvot, jotka määrittelevät muodon piirtämisen. Esimerkiksi drawLine () menetelmä odottaa neljä parametria. Kaksi ensimmäistä parametria määrittävät rivin alun sijainnin ja kaksi viimeistä parametria rivin lopun sijainnin. Tarkat arvot, jotka välitetään drawLine () menetelmä määritetään voimassa olevan koordinaattijärjestelmän avulla.

Koordinaattijärjestelmä on menetelmä, jolla voidaan yksiselitteisesti määrittää pisteiden sijainti avaruudessa. AWT: n tapauksessa tämä tila on kaksiulotteinen pinta, jota kutsutaan tasoksi. Jokainen sijainti tasossa voidaan määrittää kahdella kokonaisluvulla, joita kutsutaan x ja y koordinaatit. Arvot x ja y Koordinaatit lasketaan pisteiden vastaavien vaaka- ja pystysuuntaisten siirtymien perusteella origosta. AWT: n tapauksessa origo on aina tason vasemmassa yläkulmassa oleva piste. Sen koordinaattiarvot ovat 0 (for x) ja 0 ( y). Kuvan 2 kuvassa on kaksi pistettä - yksi sijaitsee alkupisteessä ja toinen seitsemässä kohdassa origon poikki ja viisi alaspäin.

Kuva 2: Koordinaattitaso

Grafiikan primitiivit

Tässä osassa esitellään menetelmiä viivojen, suorakulmioiden, soikioiden, kaarien ja monikulmioiden piirtämiseen. Koska nämä menetelmät toimivat vain, kun ne vedotaan kelvolliseen Grafiikka Esimerkiksi niitä voidaan käyttää vain komponenttien puitteissa päivittää() ja maali() menetelmiä. Suurin osa seuraavista menetelmistä tulee pareittain. Yksi menetelmä ( arvontaX () menetelmä) piirtää vain määritetyn muodon ääriviivat ja toinen menetelmä ( fillX () menetelmä) piirtää täytetyn version määritetystä muodosta.

linjat

void drawLine (int xBegin, int yBegin, int xEnd, int yEnd)

Tämä on yksinkertaisin kaikista grafiikkamenetelmistä. Se piirtää suoran, yhden pikselin leveän, määriteltyjen aloitus- ja loppupisteiden väliin. Tuloksena oleva viiva leikataan sopimaan nykyisen leikkausalueen rajoihin. Viiva piirretään nykyisellä etualan värillä.

Kuvan 3 sovelma osoittaa drawLine () menetelmä toiminnassa. Lähdekoodi on saatavilla täältä. Tämä sovelma ja kuvien 4, 6 ja 7 sovelmat edellyttävät kahden tukiluokan palveluita: NewCanvas-luokan ja Fig-käyttöliittymän. NewCanvas-luokka laajentaa Canvas-luokkaa ja tarjoaa erikoistuneen piirtopinnan hahmoille. NewCanvas-luokan lähdekoodi on saatavilla täältä. Kuva-rajapinta määrittelee menetelmät, jotka kuvan on tarjottava käytettäväksi NewCanvasin kanssa. Kuvaliitännän lähdekoodi on saatavilla täältä.

Kuva 3: Viivapiirroksen esittely

suorakulmiot
void drawRect (int x, int y, int w, int h) void fillRect (int x, int y, int w, int h) void drawRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight ) void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect (int x, int y, int w, int h, looginen korotus) void fill3DRect (int x, int y, int w, int h, looginen arvo korotettu)

Kukin näistä grafiikkamenetelmistä vaatii parametreina x- ja y-koordinaatit, joiden avulla suorakulmio aloitetaan, sekä suorakulmion leveys ja korkeus. Sekä leveyden että korkeuden on oltava positiivisia kokonaislukuja. Tuloksena oleva suorakulmio leikataan sopimaan nykyisen leikkausalueen rajoihin. Suorakulmio piirretään nykyisellä etualan värillä. Suorakulmioita on kolmea eri tyyliä: tavalliset, pyöristetyt kulmat ja lievä (mutta usein vaikeasti havaittavissa) kolmiulotteinen vaikutus.

Pyöristetyn suorakulmion grafiikkamenetelmät edellyttävät kahta lisäparametriä, kaaren leveyttä ja kaaren korkeutta, jotka molemmat ohjaavat kulmien pyöristystä. Kolmiulotteiset suorakulmamenetelmät edellyttävät lisäparametria, joka osoittaa, pitäisikö suorakulmion upottaa vai ei.

Kuvan 4 sovelma osoittaa nämä menetelmät toiminnassa. Lähdekoodi on saatavilla täältä.

Kuva 4: Suorakulmion piirtämisen esittely

soikeat ja kaaret

void drawOval (int x, int y, int w, int h) void fillOval (int x, int y, int w, int h) void drawArc (int x, int y, int w, int h, int startAngle, int arcAngle ) void fillArc (int x, int y, int w, int h, int startAngle, int arcAngle)

Kukin näistä grafiikkamenetelmistä vaatii parametreina soikion tai kaaren keskipisteen x- ja y-koordinaatit sekä soikion tai kaaren leveyden ja korkeuden. Sekä leveyden että korkeuden on oltava positiivisia kokonaislukuja. Tuloksena oleva muoto leikataan sopimaan nykyisen leikkausalueen rajoihin. Muoto piirretään nykyisellä etualan värillä.

Kaarigrafiikkamenetelmät edellyttävät kahta lisäparametriä, alkukulman ja kaarikulman, jotta voidaan määrittää kaaren alku ja kaaren koko asteina (ei radiaaneina). Kuva 5 kuvaa kuinka kulmat määritetään.

Kuva 5: Kulmamäärittely

Kuvan 6 sovelma osoittaa nämä menetelmät toiminnassa. Lähdekoodi on saatavilla täältä.

Kuva 6: Soikea ja kaaripiirustus

monikulmioita

void drawPolygon (int xPoints [], int yPoints [], int nPoints) void drawPolygon (monikulmio p) void fillPolygon (int xPoints [], int yPoints [], int nPoints) void fillPolygon (monikulmio p)

Polygonit ovat muotoja, jotka on muodostettu viivasegmenttien sarjasta. Kukin polygonigrafiikkamenetelmä vaatii parametreina polygonin muodostavien viivasegmenttien päätepisteiden koordinaatit. Nämä päätepisteet voidaan määrittää jommallakummalla kahdesta tavasta: kahtena rinnakkaisena kokonaislukumallina, joista toinen edustaa peräkkäistä x koordinaatit ja toinen edustaa peräkkäistä y koordinaatit; tai esimerkiksi Monikulmio luokassa. Monikulmio luokka tarjoaa menetelmän addPoint (), joka sallii monikulmamäärityksen kokoamisen pisteittäin. Tuloksena oleva muoto leikataan sopimaan nykyisen leikkausalueen rajoihin.

Kuvan 7 sovelma osoittaa nämä menetelmät toiminnassa. Lähdekoodi on saatavilla täältä.

Kuva 7: Monikulmion piirustuksen esittely

Johtopäätös

Uskokaa tai älkää, nämä muutamat yksinkertaiset grafiikan primitiivit yhdistettynä kaikkeen, mitä olemme käsittäneet viime kuukausien aikana (AWT, tapahtumien käsittely, tarkkailijat jne.), Ovat kaikki mitä tarvitset kirjoittaa kasan hyödyllisiä sovelluksia, jotka vaihtelevat pelejä CAD-järjestelmiin. Ensi kuussa laitan kaikki nämä palat yhteen ja näytän sinulle mitä tarkoitan.

Pysy kanavalla.

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. Kirjoittamisen lisäksi Todd tarjoaa Internet- ja verkkokonsultointipalveluja yrityksille Kaakkois-Yhdysvalloissa. : END_BIO

Lisätietoja tästä aiheesta

  • Java-luokka Grafiikka API

    //java.sun.com/products/JDK/CurrentRelease/api/java.awt.Graphics.html

  • Tarkkailija ja havaittavissa //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Tehokas käyttöliittymä //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java ja tapahtumien käsittely //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Johdanto AWT: hen //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Tämän tarinan "Graphics-luokan käyttäminen" julkaisi alun perin JavaWorld.