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. DetGrafik
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 afKomponent
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 klassenKomponent
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.
Figur 1: Genmaler browserenApplet 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.
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. DetPolygon
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.
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.