10.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 Afsnit 10.4.3) overført, som vi kan tegne med.

I eksemplet nedenfor tegner vi en linje, 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).

Figur 10-1. Java

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

10.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 10.4.1).

10.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 idé 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 idé at initialisere variabler og oprette objekter i init()-metoden, og kun have selve gentegningen i paint().

10.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);
    }
  }
}

Figur 10-2. Java