Programmering

Brug af klassen Grafik

En række faktorer inspirerer folk til at skrive softwareprogrammer. Jeg tror, ​​at motivationen for mange kommer fra et ønske om at skabe grafik, manipulere billeder eller animere. Uanset om de vil oprette arkadespil, flysimulatorer eller CAD-pakker, begynder udviklere ofte med at lære at tegne.

Grafikværktøjskassen i Abstract Windowing Toolkit (eller AWT) gør det muligt for en Java-programmør at tegne enkle geometriske former, udskrive tekst og placere billeder inden for rammerne af en komponent, såsom en ramme, et panel eller et lærred.

Denne kolonne er min første om emnet grafik. Det vil fokusere på Grafik klasse og dens metoder til tegning af enkle geometriske former og vil introducere den proces, hvormed maling (og ommaling) sker.

Lad os begynde i centrum - the Grafik klasse.

Klassen Grafik

Det er vigtigt, at programmører forstår Grafik klasse, før de forsøger at tegne billeder via Java. Det Grafik klasse giver rammen for alle grafikoperationer inden for AWT. Det spiller to forskellige, men beslægtede roller. For det første er det den grafiske kontekst. Grafikkonteksten er information, der påvirker tegneoperationer. Dette inkluderer baggrunds- og forgrundsfarverne, skrifttypen og placeringen og dimensionerne for klipningsrektanglet (regionen for en komponent, hvor grafik kan tegnes). Det indeholder endda oplysninger om den endelige destination for selve grafikoperationerne (skærm eller billede). For det andet, den Grafik klasse giver metoder til at tegne enkle geometriske former, tekst og billeder til grafikdestinationen. Al output til den grafiske destination sker via en påkaldelse af en af ​​disse metoder.

For at tegne kræver et program en gyldig grafisk kontekst (repræsenteret af en forekomst af Grafik klasse). Fordi Grafik klasse er en abstrakt basisklasse, den kan ikke instantieres direkte. En instans oprettes typisk af en komponent og afleveres til programmet som et argument for en komponents opdater () og maling() metoder. Disse to metoder sammen med genmaling () metode, diskuteres i det næste afsnit.

Metoderne

Følgende tre metoder er involveret i visning af grafik. Standardversioner af hver leveres efter klasse Komponent. Metoder opdater () og maling() skal omdefineres for at udføre de ønskede grafiske operationer.

genmaling ()

offentlig ugyldig maling () offentlig ugyldig maling (lang tm) offentlig ugyldig maling (int x, int y, int w, int h) offentlig ugyldig maling (lang tm, int x, int y, int w, int h)

Det genmaling () metode anmoder om, at en komponent males igen. Den, der ringer op, kan anmode om, at ommaling sker hurtigst muligt, eller kan angive et tidsrum i millisekunder. Hvis der er angivet en tidsperiode, vil malingen foregå inden tidsperioden forløber. Den, der ringer op, kan også specificere, at kun en del af en komponent males igen. Denne teknik er nyttig, hvis malingen er tidskrævende, og kun en del af skærmen skal males igen. Koden i liste 1 illustrerer, hvordan genmaling () metode kan bruges i et program.

boolsk mouseDown (begivenhed e, int x, int y) {valgt_objekt.move (x, y); genmaling (); }

Liste 1: Håndtering af mus ned

Koden i mouseDown () begivenhedshåndterer genberegner placeringen af ​​et objekt i et display baseret på musens position og kalder genmaling () metode til at indikere, at skærmen skal males igen så hurtigt som muligt.

opdater ()

offentlig tomrumsopdatering (grafik g)

Det opdater () metode kaldes som svar på en genmaling () anmodning eller som svar på en del af komponenten, der afsløres eller vises for første gang. Metodens eneste argument er en forekomst af Grafik klasse. Det Grafik forekomst er kun gyldig inden for rammerne af opdater () metode (og alle metoder, den kalder), men bortskaffes kort efter opdater () metoden vender tilbage. Standardimplementeringen leveret af Komponent klasse sletter baggrunden og kalder maling() metode (nedenfor).

maling()

offentlig ugyldig maling (grafik g)
Det maling() metode kaldes fra en opdater () metode og er ansvarlig for faktisk tegning af grafikken. Metodens eneste argument er en forekomst af Grafik klasse. Standardimplementeringen leveret af klassen Komponent gør intet. 

Hvordan komponenter males igen

For at reducere den tid, det tager at male på displayet, tager AWT to genveje:

  • For det første maler AWT kun de komponenter, der skal males igen, enten fordi de er afdækket, eller fordi de bad om at blive malet igen.

  • For det andet, hvis en komponent var dækket og afdækket, maler AWT kun den del af komponenten, der tidligere var dækket.

Applet i figur 1 giver dig mulighed for at observere denne proces, når den sker. Ignorer tekstområdet øverst i applet et øjeblik, og se kun den farvede del af skærmen. Brug et andet vindue til kort at dække en del af appleten og derefter afdække den. Bemærk, at kun den del af den applet, der blev dækket, males igen. Desuden males kun de komponenter, der blev dækket, uanset deres position i komponenthierarkiet. Ved bevidst at bruge forskellige farver bemærker appleten denne subtile effekt. Kildekoden til dette tal er tilgængelig her.

Figur 1: Genmaler browseren

Grafikkoordinatsystemet

Metoderne beskrevet i det følgende afsnit tager som parametre værdier, der specificerer, hvordan en figur skal tegnes. F.eks drawLine () metoden forventer fire parametre. De første to parametre angiver placeringen af ​​begyndelsen af ​​linjen, og de sidste to parametre angiver placeringen for slutningen af ​​linjen. De nøjagtige værdier, der skal sendes til drawLine () metoden bestemmes af det gældende koordinatsystem.

Et koordinatsystem er en metode til entydigt at specificere placeringen af ​​punkter i rummet. I tilfælde af AWT er dette rum en todimensionel overflade kaldet et plan. Hver placering i et plan kan specificeres med to heltal, kaldet x og y koordinater. Værdierne for x og y koordinater beregnes som punktets respektive vandrette og lodrette forskydning fra oprindelsen. I tilfælde af AWT er oprindelsen altid punktet i øverste venstre hjørne af flyet. Den har koordinatværdierne 0 (for x) og 0 (for y). Illustrationen i figur 2 viser to punkter - en placeret ved oprindelsen og en anden placeret i en position syv på tværs og fem ned fra oprindelsen.

Figur 2: Koordinatplanet

Grafikens primitiver

Dette afsnit introducerer metoder til tegning af linjer, rektangler, ovaler og buer og polygoner. Da disse metoder kun fungerer, når de påberåbes på en gyldig Grafik F.eks. kan de kun bruges inden for omfanget af en komponents opdater () og maling() metoder. De fleste af de følgende metoder kommer i par. En metode ( drawX () metode) tegner kun omridset af den angivne form, og den anden metode ( fillX () metode) tegner en udfyldt version af den angivne form.

linjer

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

Dette er den enkleste af alle grafikmetoder. Den trækker en lige linje, en enkelt pixel bred, mellem de angivne start- og slutpunkter. Den resulterende linje klippes for at passe inden for grænserne for det nuværende klipningsområde. Linjen tegnes i den aktuelle forgrundsfarve.

Applet i figur 3 demonstrerer drawLine () metode i aktion. Kildekoden er tilgængelig her. Denne applet og applets i figur 4, 6 og 7 kræver tjenester fra to supportklasser: NewCanvas-klassen og Figur-grænsefladen. NewCanvas-klassen udvider klasse Canvas og giver en specialtegnet overflade til figurer. Kildekoden til NewCanvas-klassen er tilgængelig her. Figurgrænsefladen definerer de metoder, som en figur skal give for at kunne bruges sammen med NewCanvas. Kildekoden til Figur-grænsefladen er tilgængelig her.

Figur 3: demonstration af stregtegning

rektangler
ugyldig drawRect (int x, int y, int w, int h) ugyldig fillRect (int x, int y, int w, int h) ugyldig drawRoundRect (int x, int y, int w, int h, int bueBredde, int bueHøjde ) void fillRoundRect (int x, int y, int w, int h, int arcWidth, int arcHeight) void draw3DRect (int x, int y, int w, int h, boolean raised) void fill3DRect (int x, int y, int w, int h, boolsk hævet)

Hver af disse grafiske metoder kræver som parametre x- og y-koordinaterne, hvor rektanglet skal begynde, og bredden og højden af ​​rektanglet. Både bredden og højden skal være positive heltal. Det resulterende rektangel klippes for at passe inden for grænserne for det aktuelle klipningsområde. Rektangelet tegnes i den aktuelle forgrundsfarve. Rektangler findes i tre forskellige stilarter: almindeligt med afrundede hjørner og med en let (men ofte svær at se) tredimensionel effekt.

Grafikmetoderne med afrundet rektangel kræver to yderligere parametre, en buebredde og en buehøjde, som begge styrer afrundingen af ​​hjørnerne. De tredimensionelle rektangelmetoder kræver en yderligere parameter, der angiver, om rektanglet skal sænkes eller hæves eller ej.

Applet'en i figur 4 demonstrerer disse metoder i aktion. Kildekoden er tilgængelig her.

Figur 4: demonstration af rektangeltegning

ovaler og buer

ugyldig drawOval (int x, int y, int w, int h) ugyldig fillOval (int x, int y, int w, int h) ugyldig 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)

Hver af disse grafiske metoder kræver som parametre x- og y-koordinaterne for midten af ​​den ovale eller buen og bredden og højden af ​​den ovale eller buen. Både bredden og højden skal være positive heltal. Den resulterende form klippes for at passe inden for grænserne for det nuværende klipningsområde. Formen tegnes i den aktuelle forgrundsfarve.

Buegrafikmetoderne kræver to yderligere parametre, en startvinkel og en buevinkel for at specificere begyndelsen af ​​buen og størrelsen af ​​buen i grader (ikke radianer). Figur 5 illustrerer, hvordan vinkler er specificeret.

Figur 5: Vinkelspecifikation

Applet i figur 6 demonstrerer disse metoder i aktion. Kildekoden er tilgængelig her.

Figur 6: Oval og buetegning demonstration

polygoner

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

Polygoner er former dannet af en sekvens af linjesegmenter. Hver af polygongrafikmetoderne kræver som parametre koordinaterne for slutpunkterne for de linjesegmenter, der udgør polygonen. Disse slutpunkter kan specificeres på en af ​​to måder: som to parallelle arrays af heltal, en repræsenterer den på hinanden følgende x koordinater og den anden repræsenterer den på hinanden følgende y koordinater eller med en forekomst af Polygon klasse. Det Polygon klasse giver metoden addPoint (), som gør det muligt at samle en polygondefinition punkt for punkt. Den resulterende form klippes for at passe inden for grænserne for det nuværende klipningsområde.

Applet i figur 7 demonstrerer disse metoder i aktion. Kildekoden er tilgængelig her.

Figur 7: demonstration af polygontegning

Konklusion

Tro det eller ej, disse få enkle grafiske primitiver kombineret med alt det, vi har dækket i de sidste par måneder (AWT, eventhåndtering, observatører osv.) Er alt hvad du behøver for at skrive en bunke nyttige applikationer lige fra spil til CAD-systemer. Næste måned lægger jeg alle disse stykker sammen og viser dig, hvad jeg mener.

Bliv hængende.

Todd Sundsted har skrevet programmer, siden computere blev tilgængelige i stationære modeller. Selvom det oprindeligt var interesseret i at oprette distribuerede objektapplikationer i C ++, flyttede Todd til Java-programmeringssproget, da Java blev det oplagte valg for den slags ting. Ud over at skrive, leverer Todd internet- og webkonsulenttjenester til virksomheder i det sydøstlige USA. : END_BIO

Lær mere om dette emne

  • Java-klassen Grafik API

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

  • Observer and Observable //www.sun.com/javaworld/jw-10-1996/jw-10-howto.html
  • Den effektive brugergrænseflade //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java og håndtering af begivenheder //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Introduktion til AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Denne historie, "Brug af grafikklassen" blev oprindeligt udgivet af JavaWorld.