Programmering

Bruke Grafikk-klassen

En rekke faktorer inspirerer folk til å skrive programvare. Jeg tror at motivasjon for mange kommer fra et ønske om å lage grafikk, å manipulere bilder eller å animere. Enten de vil lage arkadespill, flysimulatorer eller CAD-pakker, begynner utviklere ofte med å lære å tegne.

Grafikkverktøykassen i Abstract Windowing Toolkit (eller AWT) gjør det mulig for en Java-programmerer å tegne enkle geometriske former, skrive ut tekst og plassere bilder innenfor grensene til en komponent, for eksempel en ramme, et panel eller et lerret.

Denne kolonnen er min første om temaet grafikk. Det vil fokusere på Grafikk klasse og dens metoder for å tegne enkle geometriske former, og vil introdusere prosessen der maling (og maling) skjer.

La oss begynne på midtstadiet - Grafikk klasse.

Grafikk-klassen

Det er viktig at programmerere forstår Grafikk klasse før de prøver å tegne bilder via Java. De Grafikk klasse gir rammeverket for alle grafikkoperasjoner innen AWT. Det spiller to forskjellige, men beslektede roller. For det første er det grafisk sammenheng. Grafikkonteksten er informasjon som vil påvirke tegneoperasjoner. Dette inkluderer bakgrunns- og forgrunnsfargene, skrifttypen, og plasseringen og dimensjonene til utklippsrektangelet (regionen til en komponent der grafikk kan tegnes). Det inkluderer til og med informasjon om det endelige målet for selve grafikkoperasjonene (skjerm eller bilde). For det andre, Grafikk klasse gir metoder for å tegne enkle geometriske former, tekst og bilder til grafikkdestinasjonen. All utdata til grafikkdestinasjonen skjer via en påkalling av en av disse metodene.

For å tegne krever et program en gyldig grafikkontekst (representert av en forekomst av Grafikk klasse). Fordi det Grafikk klasse er en abstrakt basisklasse, den kan ikke instantiseres direkte. En forekomst blir vanligvis opprettet av en komponent, og overlevert til programmet som et argument til komponentens Oppdater() og maling() metoder. Disse to metodene, sammen med male på nytt () metode, blir diskutert i neste avsnitt.

Metodene

Følgende tre metoder er involvert i visning av grafikk. Standardversjoner av hver er gitt etter klasse Komponent. Metoder Oppdater() og maling() skal omdefineres for å utføre de ønskede grafikkoperasjonene.

male på nytt ()

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)

De male på nytt () metoden ber om at en komponent skal males på nytt. Innringeren kan be om at malingen skjer så snart som mulig, eller kan angi en tidsperiode i millisekunder. Hvis en tidsperiode er spesifisert, vil malingsoperasjonen skje før tidsperioden går. Innringeren kan også spesifisere at bare en del av en komponent skal males på nytt. Denne teknikken er nyttig hvis maling er tidkrevende, og bare en del av skjermen må males på nytt. Koden i liste 1 illustrerer hvordan male på nytt () metoden kan brukes i et program.

boolsk mouseDown (hendelse e, int x, int y) {valgt_objekt.move (x, y); male på nytt (); }

Listing 1: Hendelsehåndterer med mus ned

Koden i mouseDown () hendelsesbehandler beregner posisjonen til et objekt på nytt i displayet basert på musens posisjon og kaller male på nytt () metode for å indikere at skjermen skal males på nytt så snart som mulig.

Oppdater()

offentlig tomromoppdatering (grafikk g)

De Oppdater() metoden kalles som svar på en male på nytt () forespørsel, eller som svar på at en del av komponenten blir avdekket eller vist for første gang. Metodens eneste argument er en forekomst av Grafikk klasse. De Grafikk forekomst er bare gyldig i sammenheng med Oppdater() metoden (og eventuelle metoder den kaller), men kastes kort tid etter Oppdater() metoden returnerer. Standard implementering gitt av Komponent klasse sletter bakgrunnen og kaller maling() metoden (nedenfor).

maling()

offentlig tom maling (grafikk g)
De maling() metoden kalles fra en Oppdater() metode, og er ansvarlig for å tegne grafikken. Metodens eneste argument er en forekomst av Grafikk klasse. Standard implementering gitt av klasse Komponent gjør ingenting. 

Hvordan komponenter blir malt på nytt

For å redusere tiden det tar å male på skjermen, tar AWT to snarveier:

  • For det første maler AWT bare de komponentene som må males på nytt, enten fordi de er avdekket, eller fordi de ba om å bli malt på nytt.

  • For det andre, hvis en komponent ble dekket og blir avdekket, maler AWT bare den delen av komponenten som tidligere var dekket.

Appleten i figur 1 lar deg observere denne prosessen mens den skjer. Ignorer tekstområdet øverst i appleten et øyeblikk, og se bare på den fargede delen av skjermen. Bruk et annet vindu til å kort dekke til og deretter avdekke en del av appleten. Legg merke til at bare den delen av appleten som ble dekket er malt på nytt. Videre er bare de komponentene som ble dekket malt på nytt, uansett hvilken posisjon de har i komponenthierarkiet. Ved bevisst å bruke forskjellige farger gjør appleten denne subtile effekten merkbar. Kildekoden for denne figuren er tilgjengelig her.

Figur 1: Mal nettleseren på nytt

Grafikkoordinatsystemet

Metodene beskrevet i det følgende avsnittet tar som parametere verdier som angir hvordan en figur skal tegnes. For eksempel drawLine () metoden forventer fire parametere. De to første parameterne angir plasseringen til begynnelsen av linjen, og de to siste parameterne angir plasseringen til slutten av linjen. De nøyaktige verdiene som skal overføres til drawLine () metoden bestemmes av det aktuelle koordinatsystemet.

Et koordinatsystem er en metode for entydig å spesifisere plasseringen av punkter i rommet. Når det gjelder AWT, er dette rommet en todimensjonal overflate som kalles et plan. Hvert sted i et plan kan spesifiseres med to heltall, kalt x og y koordinater. Verdiene til x og y koordinatene beregnes i forhold til punktets respektive horisontale og vertikale forskyvning fra opprinnelsen. Når det gjelder AWT, er opprinnelsen alltid punktet i øvre venstre hjørne av flyet. Den har koordinatverdiene 0 (for x) og 0 (for y). Illustrasjonen i figur 2 viser to punkter - en plassert ved opprinnelsen, og en annen plassert i en posisjon syv over og fem ned fra opprinnelsen.

Figur 2: Koordinatplanet

Grafikkens primitiver

Denne delen introduserer metoder for tegning av linjer, rektangler, ovaler og buer og polygoner. Siden disse metodene bare fungerer når de er påkalt på en gyldig Grafikk for eksempel kan de bare brukes innenfor omfanget av en komponent Oppdater() og maling() metoder. De fleste av metodene som følger kommer i par. En metode ( drawX () metode) tegner bare omrisset av den angitte formen, og den andre metoden ( fillX () metode) tegner en fylt versjon av den angitte formen.

linjer

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

Dette er den enkleste av alle grafikkmetoder. Den tegner en rett linje, en enkelt piksel bred, mellom de angitte start- og sluttpunktene. Den resulterende linjen vil bli klippet for å passe innenfor grensene til det nåværende klippeområdet. Linjen tegnes i gjeldende forgrunnsfarge.

Appleten i figur 3 viser drawLine () metode i aksjon. Kildekoden er tilgjengelig her. Denne appleten og applettene i figurene 4, 6 og 7 krever tjenestene til to støtteklasser: NewCanvas-klassen og Figur-grensesnittet. NewCanvas-klassen utvider klassen Canvas, og gir en spesialisert tegneoverflate for figurer. Kildekoden for NewCanvas-klassen er tilgjengelig her. Figurgrensesnittet definerer metodene en figur må gi for å kunne brukes med NewCanvas. Kildekoden for figurgrensesnittet er tilgjengelig her.

Figur 3: Demonstrasjon av linjetegning

rektangler
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 arcBidth, 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, boolean raised) void fill3DRect (int x, int y, int w, int h, boolsk hevet)

Hver av disse grafikkmetodene krever som parametere x- og y-koordinatene for å starte rektangelet, og bredden og høyden på rektangelet. Både bredden og høyden må være positive heltall. Det resulterende rektangelet blir klippet for å passe innenfor grensene til det nåværende klippeområdet. Rektangelet tegnes i gjeldende forgrunnsfarge. Rektangler kommer i tre forskjellige stiler: vanlig, med avrundede hjørner og med en liten (men ofte vanskelig å se) tredimensjonal effekt.

Grafikkmetodene med avrundet rektangel krever to tilleggsparametere, en buebredde og en buehøyde, som begge styrer avrundingen av hjørnene. De tredimensjonale rektangelmetodene krever en ekstra parameter som indikerer om rektangelet skal senkes eller heves.

Appleten i figur 4 viser disse metodene i aksjon. Kildekoden er tilgjengelig her.

Figur 4: Rektangel tegning demonstrasjon

ovaler og buer

ugyldig drawOval (int x, int y, int w, int h) tomrom 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 av disse grafiske metodene krever som parametere x- og y-koordinatene til midten av den ovale eller buen, og bredden og høyden på den ovale eller buen. Både bredden og høyden må være positive heltall. Den resulterende formen vil bli klippet for å passe innenfor grensene til det nåværende klippeområdet. Formen tegnes i gjeldende forgrunnsfarge.

Buegrafikkmetodene krever to ekstra parametere, en startvinkel og en buevinkel, for å spesifisere begynnelsen på buen og størrelsen på buen i grader (ikke radianer). Figur 5 illustrerer hvordan vinkler er spesifisert.

Figur 5: Vinkelspesifikasjon

Appleten i figur 6 demonstrerer disse metodene i aksjon. Kildekoden er tilgjengelig her.

Figur 6: Oval og buetegningsdemonstrasjon

polygoner

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

Polygoner er former dannet av en sekvens av linjesegmenter. Hver av polygongrafikkmetodene krever som parametere koordinatene til endepunktene til linjesegmentene som utgjør polygonet. Disse endepunktene kan spesifiseres på en av to måter: som to parallelle matriser med heltall, en som representerer den påfølgende x koordinater og den andre som representerer den påfølgende y koordinater; eller med en forekomst av Polygon klasse. De Polygon klasse gir metoden addPoint (), som gjør at en polygondefinisjon kan settes sammen punkt for punkt. Den resulterende formen blir klippet for å passe innenfor grensene til det nåværende klippeområdet.

Appleten i figur 7 demonstrerer disse metodene i aksjon. Kildekoden er tilgjengelig her.

Figur 7: Polygon tegning demonstrasjon

Konklusjon

Tro det eller ei, disse få enkle grafiske primitivene, kombinert med alt vi har dekket de siste månedene (AWT, håndtering av hendelser, observatører osv.) Er alt du trenger for å skrive en haug med nyttige applikasjoner, alt fra spill til CAD-systemer. Neste måned legger jeg alle disse bitene sammen og viser deg hva jeg mener.

Følg med.

Todd Sundsted har skrevet programmer siden datamaskiner ble tilgjengelige i stasjonære modeller. Selv om han opprinnelig var interessert i å bygge distribuerte objektapplikasjoner i C ++, flyttet Todd til Java-programmeringsspråket da Java ble det åpenbare valget for den slags ting. I tillegg til å skrive, tilbyr Todd internett- og nettkonsulenttjenester til selskaper i det sørøstlige USA. : END_BIO

Lær mer om dette emnet

  • Java-klassen Grafikk 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
  • Det effektive brukergrensesnittet //www.sun.com/javaworld/jw-09-1996/jw-09-userint.html
  • Java og håndtering av hendelser //www.sun.com/javaworld/jw-08-1996/jw-08-event.html
  • Introduksjon til AWT //www.sun.com/javaworld/jw-07-1996/jw-07-awt.html

Denne historien, "Using the Graphics class" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found