Hvordan er EasyGraphics programmert?

NB! Denne siden er for spesielt interesserte, og tar for seg emner som ligger godt utenfor et grunnkurs i programmering. Beskrivelsen er i første rekke skrevet for faglærere som bruker boken i undervisning. Hensikten er å introdusere de viktigste ideene. Se også kommentarer i kildekoden.

Krav til løsningen

EasyGraphics blir brukt i de fire første kapitlene i boken, som tar for seg variabler, kontrollstrukturer og (statiske) metoder. Vi ønsket oss mulighet for å illustrere slike grunnleggende begrep med grafikkprogrammering, på en så enkel måte som mulig. Vi satt følgende krav til løsningen:

  1. Det skal være mulig å tegne enkle figurer (linjer, rektangel, sirkler m.fl.), samt skalere og flytte (animere) slike figurer.
  2. Det skal være mulig å lese inndata fra brukeren, helst via et tekstfelt integrert i tegnevinduet.
  3. Grafikkprogram (program som bruker EasyGraphics) skal være så enkle som mulig. Det skal bl.a. ikke være nødvendig å opprette objekt, eller å forholde seg til hendelser. Kall på grafikkmetoder skal være på formen met(...), altså uten behov for punktnotasjon.
  4. Grafikkprogram skal bygge på en rent sekvensiell tankegang. Hvis man f.eks. først ber om en animasjon og deretter gjør innlesing fra brukeren vha. EasyGraphics-metoder, skal innlesingen først skje når animasjonen er fullført.
  5. Grafikkprogram skal fritt kunne bruke variabler, kontrollstrukturer og metoder.
  6. Ett og samme brukerprogram skal kunne kjøres både som selvstendig applikasjon og som en applett i nettleseren.

Vi unngår punktnotasjon ved å kreve at brukerprogrammet subklasser EasyGraphics. Dette medfører riktignok at vi må godta en extends-besvergelse som kompliserer litt, men vi mener dette er til å leve med.

Løsningen legger opp til at all innlesing gjøres via et tekstfelt integrert i tegnevinduet, og utdata vises i selve tegnevinduet. I forbindelse med testing kan det være nyttig å skrive ut til konsollet. EasyGraphics tilbyr en metode println for dette formålet, slik at utskriften kommer på "forventet" tidspunkt (den venter på at eventuelle animasjoner blir fullført). Denne metoden bør altså brukes i stedet for System.out.println.

Oppbygging

Setningene i grafikkprogrammet blir utført på en egen tråd, vi kaller den for brukertråden. Tegne-operasjoner blir utført på event-tråden. Kall på tegne-metoder blir representert i en datastruktur (en kø) og deretter overført til event-tråden for utførelse.

De viktigste datastrukturene i EasyGraphics:

Event-tråden blir kontrollert av et Timer-objekt som kontinuerlig kaller opp en hendelsesmetode (actionPerformed i tegneflaten EGCanvas). For hver hendelse skjer følgende:

  1. Neste steg-objekt blir hentet fra køen og utført (alle steg-objekt har en metode execute). Effekten kan f.eks. være at et figur-objekt blir flyttet, reskalert, eller gjort usynlig. Lengre forflytninger/reskaleringer blir brutt ned i flere "mini-steg". Motsatt, vil flere små endringer (på ulike figurer) bli utført i én operasjon.
  2. Figur-listen blir gjennomløpt og oppdaterte figurer blir tegnet på nytt. Kun den delen av vinduet som er endret blir tegnet på nytt.

I visse situasjoner må det legges inn venting, blant annet i forbindelse med brukerkommunikasjon:

I forbindelse med oppstart av programmet er det nødvendig å opprette et objekt av klassen deklarert i grafikkprogrammet (programmet som brukeren skriver). Dette gjøres ved bruk av klassen ClassLoader.

EasyGraphics tilbyr en metode setSpeed for å styre farten på animasjoner. Denne er meget enkel, og sørger kun for å legge inn korte pauser mellom hvert steg. Farten på en forflytning vil variere med hvilken maskin man kjører på, og om man gjør lange eller (mange) korte forflytninger med moveXXX-metodene.

Klassene i EasyGraphics