Programavimas

Naudojant grafikos klasę

Įvairūs veiksniai įkvepia žmones rašyti programinę įrangą. Manau, kad daugeliui motyvacija kyla iš noro kurti grafiką, manipuliuoti vaizdais ar pagyvinti. Nesvarbu, ar jie nori sukurti arkadinius žaidimus, skrydžio treniruoklius ar CAD paketus, kūrėjai dažnai pradeda mokytis piešti.

„Abstract Windowing Toolkit“ (arba AWT) grafikos įrankių dėžutė leidžia „Java“ programuotojui piešti paprastas geometrines figūras, spausdinti tekstą ir išdėstyti vaizdus komponento, pvz., Rėmo, skydo ar drobės, ribose.

Šis stulpelis yra pirmasis mano grafikos tema. Ji bus sutelkta į Grafika klasė ir jos metodai, kaip nupiešti paprastas geometrines figūras, ir supažindins su dažymo (ir perdažymo) procesu.

Pradėkime nuo pagrindinio etapo Grafika klasė.

Grafikos klasė

Labai svarbu, kad programuotojai suprastų Grafika klasės, kol jie bando piešti vaizdus per „Java“. Grafika klasė suteikia pagrindą visoms grafikos operacijoms AWT. Jis vaidina du skirtingus, tačiau susijusius vaidmenis. Pirma, tai grafikos kontekstas. Grafikos kontekstas yra informacija, kuri paveiks piešimo operacijas. Tai apima fono ir pirmojo plano spalvas, šriftą, iškarpomo stačiakampio vietą ir matmenis (komponento, kuriame galima piešti grafiką, sritį). Jame netgi pateikiama informacija apie galimą grafikos operacijų paskirtį (ekraną ar vaizdą). Antra, Grafika klasėje pateikiami paprastų geometrinių figūrų, teksto ir vaizdų piešimo grafikos paskirties metodai. Visa išvestis į grafikos paskirties vietą atliekama iškviečiant vieną iš šių metodų.

Norint piešti, programai reikalingas galiojantis grafikos kontekstas (kurį vaizduoja Grafika klasė). Nes Grafika klasė yra abstrakti pagrindinė klasė, jos negalima tiesiogiai ekspansuoti. Egzempliorių paprastai sukuria komponentas ir perduoda programai kaip argumentą komponentams atnaujinti () ir dažyti() metodai. Šie du metodai kartu su perdažyti () metodas, aptariami kitame skyriuje.

Metodai

Šie trys metodai yra naudojami vaizduojant grafiką. Numatytosios kiekvienos versijos pateikiamos pagal klases Komponentas. Metodai atnaujinti () ir dažyti() turėtų būti iš naujo apibrėžtas norint atlikti norimas grafikos operacijas.

perdažyti ()

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

perdažyti () metodas reikalauja perdažyti komponentą. Skambinantysis gali paprašyti, kad dažymas būtų atliekamas kuo greičiau, arba gali nurodyti laikotarpį milisekundėmis. Jei nurodomas tam tikras laikotarpis, dažymo operacija atliekama nepasibaigus tam laikotarpiui. Skambinantysis taip pat gali nurodyti, kad perdažoma tik dalis komponento. Ši technika yra naudinga, jei dažymo operacija užima daug laiko ir tik dalį ekrano reikia perdažyti. 1 sąrašo kodas parodo, kaip perdažyti () metodas gali būti naudojamas programoje.

boolean mouseDown (įvykis e, int x, int y) {selected_object.move (x, y); perdažyti (); }

1 sąrašas: pelės nuspaudimo įvykių tvarkytuvas

Kodą „mouseDown“ () įvykių tvarkytuvas perskaičiuoja objekto padėtį ekrane pagal pelės padėtį ir iškviečia perdažyti () metodas, nurodantis, kad ekranas turėtų būti kuo greičiau perdažytas.

atnaujinti ()

public void update (g grafika)

atnaujinti () metodas vadinamas atsakant į a perdažyti () užklausą arba atsakant į komponento dalį, kuri buvo atidengta arba rodoma pirmą kartą. Vienintelis metodo argumentas yra Grafika klasė. Grafika egzempliorius galioja tik atnaujinti () metodas (ir visi jo vadinami metodai), tačiau jis greitai pašalinamas atnaujinti () metodas grąžinamas. Numatytasis diegimas, kurį teikia Komponentas klasė ištrina foną ir paskambina dažyti() metodas (žemiau).

dažyti()

public void paint (grafika g)
 dažyti() metodas vadinamas iš atnaujinti () metodas ir yra atsakingas už faktinį grafikos piešimą. Vienintelis metodo argumentas yra Grafika klasė. Numatytasis įgyvendinimas, kurį teikia klasė Komponentas nieko nedaro. 

Kaip perdažomi komponentai

Kad sutrumpintumėte laiką, kurio reikia ekrano perdažymui, AWT naudoja du sparčiuosius klavišus:

  • Pirma, AWT perdažo tik tuos komponentus, kuriuos reikia perdažyti dėl to, kad jie buvo atidengti, arba dėl to, kad paprašė juos perdažyti.

  • Antra, jei komponentas buvo uždengtas ir neuždengtas, AWT perdažo tik tą komponento dalį, kuri buvo anksčiau padengta.

1 paveiksle esanti programėlė leidžia stebėti šį procesą, kai jis vyksta. Akimirkai nepaisykite teksto srities programėlės viršuje ir stebėkite tik spalvotą ekrano dalį. Naudodami kitą langą, trumpam uždenkite ir atidarykite programėlės dalį. Atkreipkite dėmesį, kad perdažoma tik ta apleto dalis, kuri buvo padengta. Be to, perdažomi tik tie komponentai, kurie buvo įtraukti, nesvarbu, kokia jų padėtis komponentų hierarchijoje. Sąmoningai naudojant skirtingas spalvas, programėlė daro šį subtilų efektą pastebimą. Šį paveikslą galite rasti čia.

1 paveikslas: Perdažykite naršyklę

Grafikos koordinačių sistema

Kitame skyriuje aprašyti metodai kaip parametrus imasi reikšmių, nurodančių, kaip turi būti braižoma figūra. Pavyzdžiui, drawLine () metodas tikisi keturių parametrų. Pirmieji du parametrai nurodo eilutės pradžios vietą, o paskutiniai du parametrai nurodo eilutės pabaigos vietą. Tikslios vertės, kurias reikia perduoti drawLine () metodą nustato veikianti koordinačių sistema.

Koordinačių sistema yra metodas vienareikšmiškai nurodyti taškų vietą erdvėje. AWT atveju ši erdvė yra dvimatis paviršius, vadinamas plokštuma. Kiekvieną vietą plokštumoje galima nurodyti dviem sveikaisiais skaičiais, vadinamais x ir y koordinatės. Vertybės x ir y koordinatės apskaičiuojamos pagal taško horizontalų ir vertikalų poslinkį nuo pradžios. AWT atveju pradžia visada yra taškas viršutiniame kairiajame plokštumos kampe. Jo koordinatės vertės yra 0 (už x) ir 0 (už y). 2 paveiksle pateiktoje iliustracijoje parodyti du taškai - vienas, esantis ties pradžia, o kitas - septynioje padėtyje, esančioje skersai ir penki žemyn nuo pradžios.

2 paveikslas: koordinačių plokštuma

Grafikos pradmenys

Šiame skyriuje pristatomi linijų, stačiakampių, ovalų ir lankų bei daugiakampių brėžimo metodai. Kadangi šie metodai veikia tik tada, kai jie yra pagrįsti tinkamu Grafika Pavyzdžiui, jie gali būti naudojami tik atsižvelgiant į komponentus atnaujinti () ir dažyti() metodai. Dauguma metodų taikomi poromis. Vienas metodas ( atkreiptiX () metodas) brėžia tik nurodytos formos kontūrus, o kitas metodas ( „fillX“ () metodas) piešia užpildytą nurodytos formos variantą.

linijos

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

Tai paprasčiausias iš visų grafikos metodų. Tarp nurodytų pradžios ir pabaigos taškų nubrėžta tiesi linija, pikselio pločio. Gauta linija bus nukirpta taip, kad tilptų dabartinio kirpimo regiono ribose. Linija bus nubrėžta dabartine priekinio plano spalva.

3 paveiksle esanti programėlė rodo drawLine () metodas veikiant. Šaltinio kodą galite rasti čia. Šiai programėlei ir 4, 6 ir 7 paveiksluose esančioms programėlėms reikia dviejų palaikymo klasių paslaugų: „NewCanvas“ klasės ir „Fig“ sąsajos. „NewCanvas“ klasė pratęsia „Canvas“ klasę ir suteikia specializuotą figūrų piešimo paviršių. „NewCanvas“ klasės šaltinio kodą galite rasti čia. Paveikslėlio sąsajoje apibrėžiami metodai, kuriuos turi pateikti paveikslas, kad būtų galima naudoti su „NewCanvas“. „Fig“ sąsajos šaltinio kodą galite rasti čia.

3 paveikslas: Linijos brėžinio demonstravimas

stačiakampiai
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 arcPlotis, 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, loginė pakelta) void fill3DRect (int x, int y, int w, int h, loginė pakelta)

Kiekvienas iš šių grafikos metodų reikalauja kaip x ir y koordinatės, nuo kurių prasideda stačiakampis, ir stačiakampio plotis bei aukštis. Tiek plotis, tiek aukštis turi būti teigiami sveikieji skaičiai. Gautas stačiakampis bus apkarpytas, kad tilptų į dabartinio kirpimo regiono ribas. Stačiakampis bus nupieštas dabartine priekinio plano spalva. Stačiakampiai yra trijų skirtingų stilių: paprasti, suapvalintais kampais ir šiek tiek (bet dažnai sunkiai įžiūrimi) trimatis efektas.

Suapvalinto stačiakampio grafikos metodams reikalingi du papildomi parametrai: lanko plotis ir lanko aukštis, kurie abu valdo kampų suapvalinimą. Trimačiams stačiakampio metodams reikalingas papildomas parametras, nurodantis, ar stačiakampis turi būti nuskendęs, ar ne.

4 paveiksle rodoma programėlė demonstruoja šiuos metodus. Šaltinio kodą galite rasti čia.

4 paveikslas. Stačiakampio brėžinys

ovalai ir lankai

tuštuma drawOval (int x, int y, int w, int h) tuštuma užpildytiOval (int x, int y, int w, int h) tuštuma drawArc (int x, int y, int w, int h, int startAngle, int arcAng ) void fillArc (int x, int y, int w, int h, int startAngle, int arcAngle)

Kiekvienam iš šių grafikos metodų reikia nurodyti ovalo arba lanko centro x ir y koordinates bei ovalo ar lanko plotį ir aukštį. Tiek plotis, tiek aukštis turi būti teigiami sveikieji skaičiai. Gauta forma bus nukirpta taip, kad tilptų dabartinio kirpimo regiono ribose. Forma bus nupiešta pagal dabartinę priekinio plano spalvą.

Lanko grafikos metodams reikalingi du papildomi parametrai: pradžios kampas ir lanko kampas, kad būtų galima nurodyti lanko pradžią ir lanko dydį laipsniais (ne radianais). 5 paveiksle parodyta, kaip nurodomi kampai.

5 paveikslas: Kampo specifikacija

6 paveiksle rodoma programėlė demonstruoja šiuos metodus. Šaltinio kodą galite rasti čia.

6 paveikslas: ovalo ir lanko piešimo demonstravimas

daugiakampiai

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

Daugiakampiai yra formos, suformuotos iš linijų segmentų sekos. Kiekvienam daugiakampio grafikos metodui kaip parametrai reikalingos daugiakampį sudarančių linijų atkarpų taškų koordinatės. Šiuos galinius taškus galima nurodyti vienu iš dviejų būdų: kaip dvi lygiagrečios sveikųjų skaičių masyvos, iš kurių viena reiškia nuoseklias x koordinatės, o kitas - vienas po kito einantis y koordinatės; arba su Poligonas klasė. Poligonas klasė pateikia metodą „addPoint“ (), leidžiančią daugiakampio apibrėžimą surinkti po tašką. Gauta forma bus nukirpta taip, kad tilptų dabartinio kirpimo regiono ribose.

7 paveiksle rodoma programėlė demonstruoja šiuos metodus. Šaltinio kodą galite rasti čia.

7 paveikslas: Daugiakampio piešimo demonstravimas

Išvada

Patikėkite ar ne, bet šie keli paprasti grafikos primityviai kartu su viskuo, ką apžvelgėme per pastaruosius kelis mėnesius (AWT, renginių tvarkymas, stebėtojai ir kt.), Yra viskas, ko jums reikia, kad parašytumėte daugybę naudingų programų, pradedant nuo žaidimai į CAD sistemas. Kitą mėnesį visus šiuos gabalėlius sujungsiu ir parodysiu, ką turiu omenyje.

Sekite naujienas.

Toddas Sundstedas rašė programas nuo tada, kai kompiuteriai tapo prieinami darbalaukio modeliuose. Nors Toddas iš pradžių domėjosi paskirstytų objektų programų kūrimu C ++, Toddas persikėlė į „Java“ programavimo kalbą, kai „Java“ tapo akivaizdžiu pasirinkimu tokiems dalykams. Be rašymo, Toddas teikia interneto ir žiniatinklio konsultavimo paslaugas JAV pietryčių įmonėms. : END_BIO

Sužinokite daugiau apie šią temą

  • „Java“ klasė Grafika API

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

  • Stebėtojas ir stebimas //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Efektyvi vartotojo sąsaja //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • „Java“ ir įvykių tvarkymas //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • AWT įvadas //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Šią istoriją „Grafikos klasės naudojimas“ iš pradžių paskelbė „JavaWorld“.