Ohjelmointi

Java 2D: n käytön aloittaminen

Java 2D -sovellusliittymä on Java 1.2 -alustan ydinsovellusliittymä (katso lisätietoja resursseista ja sen toteutuksista kohdasta Resurssit). API: n toteutukset ovat saatavana osana Java Foundation Classes (JFC) -sarjaa Sun JDK: n nykyisissä beeta-julkaisuissa Windows NT / 95: lle ja Solarisille. Kun Java 1.2 on viimeistelty, Java 2D: n pitäisi tulla saataville useammalle alustalle.

Huomaa, että vaikka Java 2D on kehitetty jonkin verran itsenäisesti JFC: n muista osista, se on kuitenkin 1.2 AWT: n ydinosa. Teemme eron ja huomautamme 2D-kohtaisista ominaisuuksista keskusteluun, mutta muista, että tämä toiminto on yhtä keskeinen 1.2-grafiikoissa kuin vanha 1.0- ja 1.1 AWT-tuki.

Java 2D laajentaa aiempia AWT-mekanismeja 2D-grafiikan piirtämiseen, tekstin ja kirjasinten käsittelyyn, kuvien lataamiseen ja käyttämiseen sekä värien ja väriavaruuksien määrittelemiseen ja käsittelemiseen. Tutkimme näitä uusia mekanismeja tässä ja tulevissa sarakkeissa.

Huomautus nimikkeistöstä ja käytänteistä

Tässä sarakkeessa ensisijainen kehitysalusta on tietokone, jossa on Windows 95 tai Windows NT. Toivon voivani tarjota muita alustakohtaisia ​​vinkkejä mahdollisuuksien mukaan, mutta keskityn Windowsiin, koska siellä vietän suurimman osan ajastani.

Kun kirjoitan menetelmän nimen, sen on aina oltava muodoltaan metodin nimi (). Viimeisten sulkeiden on tarkoitus erottaa tämä menetelmä. Menetelmä voi ottaa parametreja tai olla ottamatta niitä. Käytännössä asiayhteyden tulisi aina tehdä tämä selväksi.

Lähdekoodiluettelot annetaan rivinumeroineen. Aion käyttää rivinumeroilla ristiviittausta artikkelin tekstiin ja tarvittaessa koodiluetteloihin. Tämän pitäisi myös helpottaa sarakkeen merkitsemistä, jos päätät tulostaa kopion. Huomaa kuitenkin, että sarakkeesta linkitetyt lähdetiedostot ovat tavallisia * .java-tiedostoja (ilman rivinumeroita), jotta voit ladata ja kehittää niitä.

Koska kirjoitan monista Media and Communications -sovellusliittymistä tulevina kuukausina, haluan varmistaa, että kaikella esimerkkikoodilla on järkeä kokonaisuutena ja sen yksittäisissä osissa. Yritän nimetä esimerkkini johdonmukaisesti ja sijoittaa ne aistillisiin paketteihin.

Pakettihierarkian yläreuna on:

com.javaworld.media 

Jokaisella API: lla tai aiheella, josta kirjoitan, on vähintään yksi alipaketti tämän ylimmän tason alla. Esimerkiksi tämän Java 2D -artikkelin koko koodi on:

com.javaworld.media.j2d 

Joten, jos haluat käynnistää ensimmäisen esimerkkisovelluksen Java 2D: ssä, lataat koodin, laitat sen luokkatielle ja käytät sitten:

java com.javaworld.media.j2d.Example01 

(Jos nimitila on liian pitkä mieltymyksesi vuoksi tai jostain muusta syystä haluat käyttää esimerkkikoodia tarvitsematta käyttää täysin määriteltyä nimeä, yksinkertaisesti kommentoi pakettirivi kunkin lähdekooditiedoston alussa.)

Luon Java Archive (jar) -tiedoston jokaisen artikkelin esimerkkikoodille ja luokkatiedostoille. Tämä arkisto asetetaan saataville kunkin sarakkeen Resursseihin, jos haluat ladata sen ja suorittaa esimerkkejä arkistosta.

Pidän myös ajantasaista jar-tiedostoa, joka sisältää kaikki nykyisen ja edellisen koodin ja luokat Median ohjelmointi sarakkeita. Tämä kattava jar-tiedosto on saatavilla henkilökohtaisella verkkosivustollani.

Viimeinen huomautus esimerkeistä: Olen päättänyt tehdä jokaisesta esimerkistä erillisen sovelluksen tai sovelman, ellei toisin mainita toisin. Tämä johtaa koodin toistamiseen ajoittain, mutta mielestäni se säilyttää parhaiten kunkin yksittäisen esimerkin eheyden.

Tarpeeksi konventioista. Aloitetaan ohjelmointi Java 2D: llä!

Graphics2D: parempi grafiikkaluokka

Java 2D -sovellusliittymän keskusluokka on java.awt.Grafiikka2D abstrakti luokka, joka alaluokat java.awt.Grafiikka 2D-renderoinnin laajentamiseksi. Grafiikka2D lisää yhtenäisemmän tuen erilaisten muotojen manipuloinnille, mikä tekee tekstistä, viivoista ja kaikenlaisista muista kaksiulotteisista muodoista vertailukelpoisia ominaisuuksiltaan ja hyödyllisyydeltään.

Aloitetaan yksinkertaisella esimerkillä, joka osoittaa, miten saat ja käytät a Grafiikka2d viite.

001-paketti com.javaworld.media.j2d; 002 003 tuo java.awt. *; 004 tuo java.awt.event. *; 005 006 julkisen luokan esimerkki01 laajentaa kehystä {007 / ** 008 * välittää esimerkki01-objektin. 009 ** / 010 public static void main (String args []) {011 uusi esimerkki01 (); 012} 013 014 / ** 015 * Esimerkki01-konstruktorimme asettaa kehyksen koon, lisää 016 * visuaaliset komponentit ja tekee niistä sitten käyttäjän näkyviin. 017 * Se käyttää sovitinluokkaa käsittelemään käyttäjää, joka sulkee kehyksen 018 *. 019 ** / 020 julkinen esimerkki01 () {021 // Nimeä kehyksemme. 022 super ("Java 2D -esimerkki01"); 023 024 // Aseta kehyksen koko. 025 setSize (400,300); 026 027 // Meidän on kytkettävä kehyksemme 028 // näkyvyys päälle asettamalla Visible-parametriksi true. 029 setVisible (tosi); 030 031 // Haluamme nyt olla varma siitä, että hävitämme resurssit 032 //, joita tämä kehys käyttää, kun ikkuna suljetaan. Käytämme tähän 033 // anonyymia sisäisen luokan sovitinta. 034 addWindowListener (uusi WindowAdapter () 035 {public void windowClosing (WindowEvent e) 036 {hävitä (); System.exit (0);} 037} 038); 039} 040 041 / ** 042 * Maalimenetelmä tarjoaa todellisen taikuuden. Täällä me 043 * heitimme Graphics-objektin Graphics2D-sovellukseen havainnollistaaksemme 044 *, että voimme käyttää 045 * Graphics2D: llä samoja vanhoja grafiikkaominaisuuksia, joita olemme tottuneet käyttämään Graphics-sovelluksessa. 046 ** / 047 public void paint (Grafiikka g) {048 // Näin piirtimme neliön, jonka leveys 049 // on 200, korkeus 200 ja alkaa kohdasta x = 50, y = 50. 050 g setColor (väri punainen); 051 g. DrawRect (50,50,200,200); 052 053 // Määritetään Väri siniseksi ja piirretään sitten Graphics2D 054 // -objektilla suorakulmio, joka on siirretty neliöstä. 055 // Tähän mennessä emme ole tehneet mitään Graphics2D: n avulla, mitä 056 // emme voineet tehdä myös Graphicsilla. (Olemme itse asiassa 057 // käyttämällä Graphics2D-menetelmiä, jotka on peritty Graphicsista.) 058 Graphics2D g2d = (Graphics2D) g; 059 g2d.setColor (väri.sininen); 060 g2drawdect (75,75,300,200); 061} 062} 

Kun suoritat esimerkin01, sinun pitäisi nähdä punainen neliö ja sininen suorakaide, kuten alla olevassa kuvassa on esitetty. Huomaa, että JDK 1.2 Beta 3: n Windows NT / 95 -versiossa (tämän sarakkeen uusin 1.2-julkaisu) on tunnettu suorituskykyongelma. Jos tämä esimerkki on tuskallisen hidas järjestelmässäsi, saatat joutua kiertämään virheen, kuten dokumentoitu JavaWorldJava-vinkki 55 (katso tämän vihjeen alla olevat resurssit).

Huomaa, että aivan kuten et suoranaisesti suorita a Grafiikka esine, et suorita a Grafiikka2D joko esine. Pikemminkin Java-ajonaikainen rakentaa renderointiobjektin ja välittää sen maali() (rivi 047 esimerkki01 -koodiluettelossa) ja Java 1.2 -alustoilla ja sen ulkopuolella tämä objekti toteuttaa Grafiikka2D abstrakti luokka samoin.

Toistaiseksi emme ole tehneet mitään erityisen erikoista 2D-grafiikan ominaisuuksillamme. Lisätään koodia edellisen esimerkkimme loppuun maali() menetelmä ja tuo useita ominaisuuksia, jotka ovat uusia Java 2D: ssä (esimerkki 02):

001 / ** 002 * Tässä käytämme uusia Java 2D -sovellusliittymän ominaisuuksia, kuten affiiniset 003 * -muunnokset ja Shape-objektit (tässä tapauksessa yleinen 004 * yksi, GeneralPath). 005 ** / 006 public void paint (Grafiikka g) {007 g.setColor (Väri.punainen); 008 g. DrawRect (50,50,200,200); 009010 Graphics2D g2d = (Graphics2D) g; 011 g2d.setColor (väri.sininen); 012 g2d.drawRect (75,75,300,200); 013 014 // Piirretään nyt toinen suorakulmio, mutta tällä kertaa 015 // määritetään segmentillä segmentillä GeneralPath-toiminnolla. 016 // Lisäksi aiomme kääntää ja kiertää tämän 017 // suorakulmion laitetilaan (ja siten 018 // kahteen ensimmäiseen nelikulmioon) suhteessa AffineTransform. 019 // Muutamme myös sen väriä. 020 GeneralPath-polku = uusi GeneralPath (GeneralPath.EVEN_ODD); 021 polku.moveTo (0,0f, 0,0f); 022 polku.linjaTo (0,0f, 125,0f); 023 path.lineTo (225,0f, 125,0f); 024 polku.linja (225,0f, 0,0f); 025 polku.closePath (); 026 027 AffineTransform at = uusi AffineTransform (); 028 at setToRotation (-Math.PI / 8.0); 029 g2d. Muunnos (at); 030 at setToTranslation (50,0f, 200,0f); 031 g2d. Muunnos (at); 032 033 g2d.setColor (väri.vihreä); 034 g2d. Täyttö (polku); 035} 

Huomaa, että koska Yleinen polku sijaitsee java.awt.geom paketin, meidän on oltava varmoja, että lisäämme myös tuontirivin:

tuo java.awt.geom. *; 

Esimerkin 02 tulos on esitetty seuraavassa kuvassa.

Java 2D mahdollistaa mielivaltaisten muotojen määrittelyn java.awt.Muoto käyttöliittymä. Erilaiset oletusmuodot, kuten suorakulmiot, polygonit, 2D-viivat jne., Toteuttavat tämän käyttöliittymän. Yksi mielenkiintoisimmista näistä joustavuuden kannalta on java.awt.geom.GeneralPath.

Yleinen polkus antaa sinun kuvata polkua, jolla on mielivaltainen määrä reunoja ja mahdollisesti erittäin monimutkainen muoto. Esimerkissä 02 olemme luoneet suorakulmion (viivat 020-025), mutta aivan yhtä helposti olisimme voineet lisätä toisen sivun tai sivut viisikulmion, seiskan tai jonkin muun monipuolisen monikulmion muodostamiseksi. Huomaa myös, että toisin kuin tavallinen Grafiikka koodi, Java 2D antaa meille mahdollisuuden määrittää koordinaatit käyttämällä liukulukuja kokonaislukujen sijaan. Maailman CAD-toimittajat, iloitse! Itse asiassa Java 2D tukee kokonaisluku, kaksinkertainenja kelluva aritmeettinen monissa paikoissa.

Luultavasti huomasit myös, että kun loimme polun, ohitimme parametrin, GeneralPath.EVEN_ODD, konstruktoriin (linja 020). Tämä parametri edustaa a käämityssääntö joka kertoo renderöijälle kuinka määrittää polkumme määrittelemän muodon sisäpuoli. Katso lisätietoja Java 2D: n käämityssäännöistä Resurssit-osiossa viitatusta Java 2D javadoc -dokumentaatiosta.

Esimerkki 02: n toinen merkittävä innovaatio pyörii a: n käytön ympärillä java.awt.geom.AffineTransforms (rivit 027-031). Jätän tällaisten muunnosten yksityiskohdat lukijalle (katso artikkelien lähteet, joissa käsitellään tätä yksityiskohtaisemmin), mutta riittää, kun sanon, että AffineTransformNiiden avulla voit käyttää mitä tahansa Java 2D -kuvaa sen kääntämiseen (siirtämiseen), kiertämiseen, skaalaamiseen, leikkaamiseen tai näiden manipulaatioiden yhdistelmiin.

Avain AffineTransform piilee käsitteessä Laitetila ja Käyttäjätila. Laitetila on alue, jolle grafiikka näytetään näytöllä. Tämä on analoginen koordinaattien kanssa, joita käytetään, kun luodaan säännöllinen AWT-tyyli Grafiikka-pohjainen 2D-grafiikka. Käyttäjätila on kuitenkin käännettävä, käännettävä koordinaattijärjestelmä, jota yksi tai useampi voi käyttää AffineTransforms.

Laiteavaruus- ja Käyttäjätila-koordinaatistojärjestelmät ovat aluksi päällekkäisiä, ja alkuperä on renderöintipinnan vasemmassa yläkulmassa (tässä kehys). Positiivinen x-akseli liikkuu suoraan alkuperäasemasta, kun taas positiivinen y-akseli liikkuu alaspäin.

Ensimmäisen muunnoksen jälkeen esimerkissä 02 (rivit 028 ja 029) User Space -koordinaattijärjestelmää on kierretty 22,5 astetta vastapäivään laitetilaan nähden. Molemmilla on edelleen sama alkuperä. (Huomaa, että kierrot määritetään radiaaneina, joiden -PI / 8 radiaania on -22,5 astetta tai 22,5 astetta vastapäivää.) Jos pysähtyisimme tähän ja piirrettäisimme suorakulmion, se käännettäisiin enimmäkseen näkökentästä sovellus Kehys.

Seuraavaksi sovellamme toisen muunnoksen (rivit 030 ja 031), tämän käännöksen, kun kierto on valmis. Tämä siirtää User Space -koordinaatistojärjestelmää laitetilaan nähden siirtämällä sen alaspäin 200,0 (kelluva) ja oikealle 50,0 (kelluva) yksikköä.

Kun täytämme vihreän suorakulmion, se käännetään ja käännetään laitetilaan nähden.

Bezierin ja korkeamman asteen käyrät

Nyt kun olemme tutkineet, kuinka muunnoksia voidaan käyttää graafisten objektien manipulointiin, tarkastellaan uudelleen, kuinka rakennamme monimutkaisia ​​ja mielenkiintoisia mielivaltaisia ​​muotoja.

Käyriä käytetään koko matematiikassa ja tietokonegrafiikassa arvioimaan monimutkaisia ​​muotoja käyttäen rajallista, hyvin määriteltyä (ja ihanteellisesti pientä) määrää matemaattisia pisteitä. Vaikka AWT-standardi ei aiemmin tue suoraan mielivaltaisilla käyrillä piirtämistä (Java 1.0- tai 1.1 -alustat), Java 2D lisää sisäänrakennettua tukea ensimmäisen, toisen ja kolmannen asteen käyrille. Voit piirtää käyriä kahdella päätepisteet ja nolla, yksi tai kaksi ohjauspisteet. Java 2D laskee ensimmäisen ja toisen asteen käyrät lineaarisilla ja toissijaisilla kaavoilla ja kuutio- tai kolmannen asteen käyrillä Bezier-käyrillä.

(Bezier-käyrät ovat eräänlainen parametrinen polynomikäyrä, jolla on joitain erittäin toivottuja ominaisuuksia, jotka liittyvät suljettujen käyrien ja pintojen laskemiseen. Niitä käytetään lukuisissa grafiikkasovelluksissa. Katso lisätietoja parametristen polynomien ja Bezier-käyrien käytöstä lähteistä. tietokonegrafiikassa.) Yleinen polku nämä käyrät piirtävät menetelmät ovat:

  • lineTo () suorille segmenteille (määritä vain päätepisteet)
  • quadTo () toisen asteen käyrille (määritä yksi ohjauspiste)
  • käyräTo () kolmannen asteen käyrille (määritä kaksi kontrollipistettä, piirretty kuutiomaisella Bezier-käyrällä)