Korištenje nastave Grafika

Razni čimbenici nadahnjuju ljude da pišu softverske programe. Vjerujem da za mnoge motivacija izvire iz želje za stvaranjem grafike, manipulacijom slikama ili animiranjem. Bez obzira žele li stvoriti arkadne igre, simulatore leta ili CAD pakete, programeri često započinju s učenjem crtanja.

Grafički okvir alata u programu Abstract Windowing Toolkit (ili AWT) omogućuje Java programeru da crta jednostavne geometrijske oblike, ispisuje tekst i postavlja slike unutar granica komponente, poput okvira, ploče ili platna.

Ova je kolumna moja prva na temu grafike. Usredotočit će se na Graphicsrazred i njegove metode za crtanje jednostavnih geometrijskih oblika i predstavit će postupak kojim se događa slikanje (i prebojavanje).

Počnimo od središnje pozornice - Graphicsrazreda.

Predavanje grafike

Bitno je da programeri razumiju Graphicsklasu prije nego što pokušaju crtati slike putem Jave. GraphicsKlasa pruža okvir za sve grafičke operacije unutar AWT. Igra dvije različite, ali povezane uloge. Prvo, to je grafički kontekst. Grafički kontekst su informacije koje će utjecati na operacije crtanja. To uključuje boje pozadine i prednjeg plana, font, te mjesto i dimenzije pravokutnika za isjecanje (područje komponente u kojoj se može crtati grafika). Uključuje čak i informacije o eventualnom odredištu samih grafičkih operacija (zaslon ili slika). Drugo,Graphicsklasa pruža metode za crtanje jednostavnih geometrijskih oblika, teksta i slika do grafičkog odredišta. Sav izlaz na grafičko odredište događa se pozivanjem jedne od ovih metoda.

Da bi crtao, program zahtijeva valjani grafički kontekst (predstavljen primjerom Graphicsklase). Budući da je Graphicsklasa apstraktna osnovna klasa, ne može se izravno instancirati. Instancu tipično stvara komponenta i predaje je programu kao argument metodama update () i paint () komponente . Ove dvije metode, zajedno s metodom repaint () , razmatraju se u sljedećem odjeljku.

Metode

Sljedeće su tri metode uključene u prikaz grafike. Zadane verzije svake pruža klasa Component. Ažuriranje metoda () i paint () trebalo bi redefinirati kako bi se izvršile željene grafičke operacije.

prefarbati()

javna ponovna boja () javna praznina (dugo tm) javna praznina (int x, int y, int w, int h) javna ponovna boja (long tm, int x, int y, int w, int h)

Metoda repaint () zahtijeva da se komponenta preboji. Pozivatelj može zatražiti da se ponovno bojanje dogodi što je prije moguće ili može odrediti vremensko razdoblje u milisekundama. Ako je određeno vremensko razdoblje, postupak farbanja dogodit će se prije isteka vremenskog razdoblja. Pozivatelj također može odrediti da se samo dio komponente prefarba. Ova je tehnika korisna ako je postupak bojenja dugotrajan, a samo dio zaslona treba ponovno bojiti. Kôd u Popisu 1 ilustrira kako se metoda repaint () može koristiti u programu.

boolean mouseDown (Događaj e, int x, int y) {selected_object.move (x, y); prefarbati(); }

Popis 1: Rukovatelj događajima pomicanjem miša

Kôd u obrađivaču događaja mouseDown () preračunava položaj objekta na zaslonu na temelju položaja miša i poziva metodu repaint () kako bi naznačio da zaslon treba što prije prebojati .

ažuriranje()

javno prazno ažuriranje (grafika g)

Metoda update () poziva se kao odgovor na zahtjev za ponovnim bojanjem () ili kao odgovor na dio komponente koji se prvi put otkriva ili prikazuje. Jedini argument metode je instanca Graphicsklase. GraphicsPrimjer vrijedi samo u kontekstu update () metodi (i sve metode naziva), ali se odlaže ubrzo nakon update () metoda vraća. Zadana implementacija koju nudi Componentklasa briše pozadinu i poziva metodu paint () (ispod).

boja()

boja za javne praznine (grafika g)
Metoda paint () poziva se iz metode update () i odgovorna je za stvarno crtanje grafike. Jedini argument metode je instanca Graphicsklase. Zadana implementacija koju nudi klasa Componentne čini ništa.

Kako se komponente ponovno boje

Kako bi smanjio vrijeme potrebno za ponovno bojanje zaslona, ​​AWT koristi dvije prečace:

  • Prvo, AWT ponovno boji samo one dijelove koji trebaju ponovno bojanje, bilo zato što su otkriveni, bilo zato što su tražili ponovno bojanje.


    
  • Drugo, ako je komponenta pokrivena i otkrivena, AWT ponovno boji samo dio komponente koji je prethodno bio pokriven.

Aplet na slici 1 omogućuje vam promatranje ovog procesa kako se događa. Na trenutak zanemarite područje teksta na vrhu apleta i gledajte samo obojeni dio zaslona. Pomoću drugog prozora na trenutak prekrijte, a zatim otkrijte dio apleta. Primijetite da se prekriva samo dio apleta koji je prekriven. Nadalje, samo se one komponente koje su pokrivene prebojavaju, bez obzira na njihov položaj u hijerarhiji komponenata. Namjernim korištenjem različitih boja, aplet čini ovaj suptilni efekt uočljivim. Izvorni kod za ovu sliku dostupan je ovdje.

Slika 1: Ponovno obojite preglednik

Grafički koordinatni sustav

Metode opisane u sljedećem odjeljku uzimaju kao parametre vrijednosti koje specificiraju način crtanja oblika. Na primjer, metoda drawLine () očekuje četiri parametra. Prva dva parametra određuju mjesto početka retka, a zadnja dva parametra određuju mjesto kraja retka. Točne vrijednosti koje se prosljeđuju metodi drawLine () određuju se na temelju koordinatnog sustava koji je na snazi.

Koordinatni sustav metoda je za nedvosmisleno određivanje mjesta točaka u prostoru. U slučaju AWT-a, ovaj je prostor dvodimenzionalna površina koja se naziva ravnina. Svako mjesto u ravnini može se odrediti s dvije cijele brojke, koje se nazivaju x i y koordinate. Vrijednosti x i y koordinata izračunavaju se u smislu vodoravnog i okomitog pomicanja točke od ishodišta. U slučaju AWT, ishodište je uvijek točka u gornjem lijevom kutu ravnine. Ima vrijednosti koordinata 0 (za x ) i 0 (za y). Ilustracija na slici 2 prikazuje dvije točke - jednu koja se nalazi na ishodištu, a druga na položaju sedam preko i pet dolje od ishodišta.

Slika 2: Koordinatna ravnina

Grafički primitivi

Ovaj odjeljak uvodi metode za crtanje linija, pravokutnika, ovala i luka te poligona. Budući da ove metode djeluju samo kada su pozvane na važećoj Graphicsinstanci, mogu se koristiti samo u okviru metoda ažuriranja () i paint () komponente . Većina metoda koje slijede dolaze u parovima. Jedna metoda (metoda drawX () ) crta samo obrise određenog oblika, a druga metoda (metoda fillX () ) crta ispunjenu verziju navedenog oblika.

linijama

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

Ovo je najjednostavnija od svih grafičkih metoda. Crta ravnu crtu širine jednog piksela između navedenih početnih i završnih točaka. Rezultirajuća linija bit će isječena kako bi se uklopila u granice trenutne regije isjecanja. Crta će biti nacrtana u trenutnoj boji prednjeg plana.

Aplet na slici 3 prikazuje metodu drawLine () na djelu. Izvorni kod dostupan je ovdje. Ovaj aplet i apleti na slikama 4, 6 i 7 zahtijevaju usluge dviju klasa podrške: klase NewCanvas i sučelja Figure. Klasa NewCanvas proširuje klasu Canvas i pruža specijaliziranu površinu za crtanje figura. Izvorni kod za klasu NewCanvas dostupan je ovdje. Slikovno sučelje definira metode koje slika mora pružiti da bi se koristila s NewCanvasom. Izvorni kod za sučelje Figure dostupan je ovdje.

Slika 3: Demonstracija crtanja crta

pravokutnici
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, logički podignut) void fill3DRect (int x, int y, int w, int h, povišen boolean)

Svaka od ovih grafičkih metoda zahtijeva kao parametre koordinate x i y na kojima započinje pravokutnik te širinu i visinu pravokutnika. I širina i visina moraju biti pozitivni cijeli brojevi. Rezultirajući pravokutnik presjeći će se kako bi se uklopio u granice trenutnog područja isjecanja. Pravokutnik će biti nacrtan trenutnom bojom u prvom planu. Pravokutnici dolaze u tri različita stila: jednostavan, sa zaobljenim kutovima i s blagim (ali često teško uočljivim) trodimenzionalnim efektom.

Grafičke metode zaobljenog pravokutnika zahtijevaju dva dodatna parametra, širinu luka i visinu luka, a oba kontroliraju zaokruživanje uglova. Trodimenzionalne metode pravokutnika zahtijevaju dodatni parametar koji pokazuje treba li pravokutnik potopiti ili podići.

Aplet na slici 4 prikazuje ove metode na djelu. Izvorni kod dostupan je ovdje.

Slika 4: Demonstracija crtanja pravokutnika

ovali i lukovi

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)

Svaka od ovih grafičkih metoda zahtijeva kao parametre koordinate x i y središta ovalnog luka ili luka te širinu i visinu ovalnog dijela ili luka. I širina i visina moraju biti pozitivni cijeli brojevi. Rezultirajući oblik isjeći će se kako bi se uklopio u granice trenutnog područja isječka. Oblik će biti nacrtan u trenutnoj boji prednjeg plana.

The arc graphics methods require two additional parameters, a start angle and an arc angle, to specify the beginning of the arc and the size of the arc in degrees (not radians). Figure 5 illustrates how angles are specified.

Figure 5: Angle specification

The applet in Figure 6 demonstrates these methods in action. The source code is available here.

Figure 6: Oval and arc drawing demonstration

polygons

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

Polygons are shapes formed from a sequence of line segments. Each of the polygon graphics methods require, as parameters, the coordinates of the endpoints of the line segments that make up the polygon. These endpoints can be specified in either one of two ways: as two parallel arrays of integers, one representing the successive x coordinates and the other representing the successive y coordinates; or with an instance of the Polygon class. The Polygon class provides the method addPoint(), which allows a polygon definition to be assembled point by point. The resulting shape will be clipped to fit within the boundaries of the current clipping region.

The applet in Figure 7 demonstrates these methods in action. The source code is available here.

Slika 7: Demonstracija crteža poligona

Zaključak

Vjerovali ili ne, ovih nekoliko jednostavnih grafičkih primitiva, u kombinaciji sa svime što smo pokrili u posljednjih nekoliko mjeseci (AWT, rukovanje događajima, promatrači itd.), Sve je što vam treba za pisanje hrpe korisnih aplikacija, u rasponu od igre na CAD sustave. Sljedeći mjesec složit ću sve te dijelove i pokazati vam na što mislim.

Pratite nas.

Todd Sundsted piše programe otkad su računala postala dostupna u modelima stolnih računala. Iako je izvorno bio zainteresiran za izgradnju distribuiranih objektnih aplikacija na C ++, Todd je prešao na programski jezik Java kad je Java postala očit izbor za takve stvari. Osim pisanja, Todd pruža usluge internetskog i web savjetovanja tvrtkama na jugoistoku SAD-a. : END_BIO

Saznajte više o ovoj temi

  • Java Class GraphicsAPI

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

  • Promatrač i uočljiv //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Učinkovito korisničko sučelje //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java i rukovanje događajima //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Uvod u AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Ovu priču, "Korištenje klase grafike" izvorno je objavio JavaWorld.