9 Appletter og grafik

Indhold:



Kapitlet forudsættes af kapitel 10, Grafiske brugergrænseflader og 11, Interfaces.

Forudsætter kapitel 3, Objekter (4, Definition af klasser og 5, Nedarvning er en fordel).



En applet er et javaprogram i en hjemmeside. Når siden vises, vil browseren (fremviseren af HTML-dokumentet) hente javaprogrammet og udføre det på brugerens maskine. Ordet applet giver mange associationer til "en lille applikation".


9.1 HTML-dokumentet

Hjemmesider skrives i et sprog, der hedder HTML. En hjemmeside med en applet vil have en HTML-kode, der henviser til, hvor browseren skal finde programkoden. Det ser sådan her ud:


  <applet code="MinApplet.class" width=400 height=300> </applet>


Her blev angivet, at appletten hedder MinApplet, og den skal være 400 punkter bred og 300 høj. MinApplet.class, den binære kode fra MinApplet.java, skal ligge i samme katalog som hjemmesiden.


HTML-koder er skrevet mellem < og >. Et helt HTML-dokument med en applet kunne se sådan her ud:


<HTML>
<HEAD>
        <TITLE>Min applet</TITLE>
</HEAD>

<BODY>
        Velkommen til min første applet!<BR>

        <APPLET
          CODEBASE = "."
          CODE     = "MinApplet.class"
          WIDTH    = 400
          HEIGHT   = 300>
        </APPLET>

        Slut herfra!
</BODY>
</HTML>


For mere viden om HTML henvises til de mange introduktioner til, hvordan man laver hjemmesider. CODE og CODEBASE forklares nærmere i afsnit 9.6.5.


9.2 Javakoden

Selve javaprogrammet er en klasse, der arver fra Applet. Her skal paint()-metoden, som kaldes når appletten skal tegnes på skærmen, defineres. Til dette formål får paint() et Graphics-objekt (beskrevet i 9.5.3) overført, som vi kan tegne med.


I eksemplet nedenfor tegner vi en linie, en fyldt oval og noget tekst med grøn skrift.


import java.awt.*;
import java.applet.*;

public class MinApplet extends Applet
{
  public void paint(Graphics g)
  {
    // Herunder referer g til et Graphics-objekt man kan tegne med.
    g.drawLine(10,10,50,70);

    g.fillOval(5,5,300,50);

    g.setColor(Color.green);

    g.drawString("Hej grafiske verden!",100,30);
  }
}


Her ses, hvordan HTML-koden med appletten ser ud i en browser (Netscape under Linux).


Man ser, at først kommer HTML-teksten "Velkommen til ...", derunder appletten og nederst igen noget tekst fra HTML-koden.

9.2.1 Metoder i appletter, som du kan kalde

Den vigtigste metode er repaint(), som forårsager, at appletten bliver gentegnet (ved, at systemet kalder paint()).

Andre rare metoder er getImage(), der giver dig mulighed for at indlæse grafik, og getSize(), der giver applettens størrelse. De er beskrevet i appendiks senere i kapitlet (afsnit 9.5.1).

9.2.2 Metoder i appletter, som systemet kalder

En applet skal spille sammen med HTML-koden og fremvisningen. Der ligger faktisk et stort maskineri bagved, der sørger for, at den bliver vist korrekt og får relevante oplysninger om, hvad brugeren gør. Derfor har appletter en række metoder, som kan tilsidesættes efter behov.


Den vigtigste er paint(), som systemet kalder, hver gang der er behov for at tegne appletten, f.eks. hvis den har været dækket af et andet vindue.


En anden er init(), der kaldes, når appletten indlæses som en del af HTML-dokumentet. Metoden bliver kun kaldt én gang, så det er en god ide at placere programkode, der opretter objekter og initialiserer programmet, i init(). Da appletten er et objekt, kan man selvfølgelig også gøre det i konstruktøren, men da skal man være opmærksom på, at de metoder du kan kalde (f.eks. repaint() og getSize()), ikke har nogen virkning, da applettens omgivelser ikke er blevet initialiseret endnu.


Det er en god ide at initialisere variabler og oprette objekter i init()-metoden, og kun have selve gentegningen i paint().

9.2.3 Eksempel

Her er et program, der tegner en kurve over sinus-funktionen.

Det definerer init()-metoden, hvor det udregner koordinater for alle punkterne, der skal tegnes (her bruger vi getSize() for at vide, hvor stor appletten er).

Vi tegner punkterne i paint(), der er gjort så lille og hurtig som muligt (den kaldes jo hver gang appletten bliver gentegnet).

Punkterne huskes i en vektor, der er defineret som objektvariabel, sådan at den er kendt, så længe Kurvetegning-objektet findes. På den måde får vi data fra init() over til paint().


import java.util.*;
import java.awt.*;
import java.applet.*;

public class Kurvetegning extends Applet 
{
  Vector punkter; // objektvariabel kendt i både init() og paint()

  public void init()  // Forbered punkterne
  {
    punkter = new Vector();
    int br = getSize().width;  // applettens bredde
    int hø = getSize().height; // applettens højde

    for (int i=0; i<br; i++)
    {
      double y = 0.5*hø - 0.4*hø*Math.sin((double) i*20 / br);
      punkter.addElement(new Point(i, (int) y ));
    }
  }

  public void paint(Graphics g) // tegn punkterne
  {
    for (int i=0; i<punkter.size(); i=i+1)
    {
      Point p = (Point) punkter.elementAt(i);
      g.drawRect(p.x, p.y, 5, 5);
    }
  }
}




9.3 Resumé (fjernet)

Dette afsnit findes i den trykte bog


9.4 Opgaver

  1. Lav en applet, der viser et digitalur som tekst (vink: Brug et Date-objekt).

  2. Lav en applet, der viser et analogt ur.


9.5 Appendiks

Appletter har nogle metoder, som det kan være nyttigt at kende. De er delt i to grupper, nemlig dem du kan kalde, og dem systemet kalder, og som du kan omdefinere for at få udført noget af din kode, når de kaldes.


9.5.1 Metoder i appletter, som du kan kalde

Disse metoder står til din rådighed, når du programmerer appletter. Det er kun de vigtigste af metoderne, der er gengivet (se Javadokumentationen for Applet og Component for en komplet liste).

Nogle af Applet-klassens metoder

repaint(int millisekunder)
forårsager at systemet kalder paint() på appletten lidt senere.

Dimension getSize()
returnerer applettens højde og bredde i et Dimension-objekt (der har variablerne width og height).

URL getCodeBase()
giver URL'en til CODEBASE, dvs. hvor .class-filen er.

URL getDocumentBase()
giver URL'en til der, hvor HTML-dokumentet ligger.

AudioClip getAudioClip(URL url, String filnavn)
returnerer et lydklip-objekt, typisk fra en .wav-fil.

Image getImage(URL url, String filnavn)
returnerer et billede-objekt, typisk fra en .jpg eller .gif-fil.

String getParameter(String parameternavn)
returnerer den pågældende parameterværdi, hvis den er defineret i HTML-koden, ellers null. En parameter sættes med <PARAM NAME="navn" VALUE="værdi"> før </APPLET>.


9.5.2 Metoder, som systemet kalder

Appletter har en række metoder, som du selv kan definere, og som systemet vil kalde.



  public void paint(Graphics g)

Her programmerer du, hvordan appletten skal se ud på skærmen ved at kalde metoder på Graphics-objektet g (dets metoder er forklaret i næste afsnit).

Metoden kaldes af systemet, hver gang der er behov for at gentegne en del eller hele appletten. Det kan være ret så ofte, så man bør have så lidt kode som muligt her, så metoden kan udføres hurtigt.



  public void init()

Kaldes, når fremviseren indlæser HTML-dokumentet og appletten. Her kan du lægge kode, der initialiserer programmet. init() bliver kun kaldt én gang.



  public void start()

Kaldes, når appletten bliver synlig. Normalt sker det lige efter init(), men hvis HTML-dokumentet er meget stort, og appletten er i bunden af dokumentet, kan det være, den ikke er synlig med det samme. Så kaldes start() først, når appletten bliver synlig for brugeren. start() kan godt blive kaldt flere gange, hvis appletten skjules og bliver synlig igen.



  public void stop()

Kaldes, når appletten bliver skjult. Det kan være, fordi vinduet bliver minimeret, eller fordi brugeren går til et andet dokument. Ligesom start() kan stop() godt blive kaldt flere gange.



  public void destroy()

Kaldes, når appletten smides væk af fremviseren, fordi brugeren er gået til et andet dokument eller har lukket vinduet. destroy() bliver kun kaldt én gang. Er der noget, der er vigtigt at få gjort inden programmet afsluttes, kan du lægge kode til at gøre det i destroy().


9.5.3 Klassen Graphics

Graphics er beregnet til at tegne grafik (på skærm eller printer). Man skal ikke selv oprette Graphics-objekter med new, i stedet får man givet et "i hånden", når styresystemet afgører, at vinduet skal tegnes op. Herunder gengives kun nogle af metoderne - se Javadokumentationen for en komplet liste.


java.awt.Graphics - todimensional grafiktegning

Metoder

void drawLine(int x1, int y1, int x2, int y2)

tegner en linie mellem punkterne (x1, y1) og (x2, y2).

void drawRect(int x, int y, int bredde, int højde)

tegner omridset af et rektangel.

void drawString(String tekst, int x, int y)

tegner tekst med øverste venstre hjørne i (x,y).

void drawOval(int x, int y, int bredde, int højde)

tegner en oval med øverste venstre hjørne i (x,y). Er bredde==højde, tegnes en cirkel.

void drawArc(int x, int y, int bredde, int højde, int startvinkel, int vinkel)

tegner en del af en oval, men kun buen fra startvinkel og vinkel grader rundt (mellem 0 og 360).



void fillRect(int x, int y, int bredde, int højde)

tegner et udfyldt rektangel.

void fillOval(int x, int y, int bredde, int højde)

tegner en udfyldt oval med øverste venstre hjørne i (x,y). Er bredde==højde, tegnes en cirkel.

void fillArc(int x, int y, int bredde, int højde, int startvinkel, int slutvinkel)

tegner en udfyldt del af en oval, men kun fra startvinkel til slutvinkel (mellem 0 og 2 pi).



Rectangle getClipBounds()

giver grafik-objektets klipnings-omrids. Kun punkter inden for dette omrids bliver faktisk tegnet, ting uden for omridset bliver beskåret til den del, der er inden for omridset.



void setColor(Color nyFarve)

sætter tegnefarven til nyFarve. Alt bliver herefter tegnet med denne farve.

Color getColor()

aflæser tegningsfarven.



void setFont(Font nySkrifttype)

sætter skrifttypen til nySkrifttype. Dette påvirker tekster skrevet med drawString() herefter.

Font getFont()

aflæser skrifttypen.



9.6 Avanceret (fjernet)

Dette afsnit findes i den trykte bog


1Dette illustreres bedst med Microsoft Internet Explorer (IE), der har et 7-cifret versionsnummer. Derudover er det forfatterens erfaring, at den samme udgave af IE kan opføre sig forskelligt på Windows 95, 98 og NT (og de mange underversioner, 'service packs'), og at opførslen afhænger af de øvrigt DLL-er installeret. IE findes også i en helt inkompatibel udgave til Mac.
Netscape er mindre knyttet til styresystemet, så f.eks. en Netscape 4.7 er med større sandsynlighed en Netscape 4.7, uanset om man kører Windows 95, NT, Linux, Mac eller noget andet.


Jacob Nordfalk - Objektorienteret programmering i Java - http://javabog.dk