12.3. Eksempler med interfacet Tegnbar

Lad os udvide (arve fra) Terning til at implementere Tegnbar-interfacet. For at gøre koden kort har metoden tegn() en hjælpemetode ci(), der tegner en cirkel for et øje.


import java.awt.*;
public class GrafiskTerning extends Terning implements Tegnbar
{
  int x, y;

  public void sætPosition(int x, int y)
  {
    this.x = x;
    this.y = y;
  }

  private void ci(Graphics g, int i, int j)
  {
    g.fillOval(x+1+10*i,y+1+10*j,8,8);             // Tegn fyldt cirkel
  }

  public void tegn(Graphics g)
  {
    int ø = værdi;
    g.drawRect(x,y,30,30);                         // Tegn kant

    if (ø==1) ci(g,1,1);                           // Tegn 1-6 øjne
    else if (ø==2) { ci(g,0,0); ci(g,2,2); }
    else if (ø==3) { ci(g,0,0); ci(g,1,1); ci(g,2,2); }
    else if (ø==4) { ci(g,0,0); ci(g,0,2); ci(g,2,0); ci(g,2,2); }
    else if (ø==5) { ci(g,0,0); ci(g,0,2); ci(g,1,1); ci(g,2,0); ci(g,2,2); }
    else { ci(g,0,0); ci(g,0,1); ci(g,0,2); ci(g,2,0); ci(g,2,1); ci(g,2,2); }
  }
}

Bemærk:

Lad os gøre det samme med et raflebæger. For variationens skyld lader vi bægeret altid have den samme position, ved at lade sætPosition()'s krop være tom.


import java.awt.*;
public class GrafiskRaflebaeger extends Raflebaeger implements Tegnbar
{
  public GrafiskRaflebaeger()
  {
    super(0);
  }

  public void sætPosition(int x, int y) {  } // tom metodekrop

  public void tegn(Graphics g)
  {
    g.drawOval(80,20,90,54);
    g.drawLine(150,115,170,50);
    g.drawLine(100,115,80,50);
    g.drawArc(100,100,50,30,180,180);
  }
}

Kunne vi have udeladt sætPosition()-metoden, der alligevel ikke gør noget? Nej, vi har lovet at implementere begge metoder, om det så blot er med en tom krop, idet vi skrev "implements Tegnbar".

En hvilken som helst klasse kan gøres til at være Tegnbar. Her er et tegnbart rektangel:


import java.awt.*;
public class Rektangel extends Rectangle implements Tegnbar
{
  public Rektangel(int x1, int y1, int width1, int height1)
  {
    super(y1,x1,width1,height1);
  }

  public void sætPosition(int x1, int y1)
  {
    x = x1;
    y = y1;
  }

  public void tegn(Graphics g)
  {
    g.drawRect(x,y,width,height);
  }
}

12.3.1. En applet af Tegnbare objekter

Lad os nu lave en applet, der viser nogle tegnbare objekter:


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

public class TegnbareObjekter extends Applet
{
  Vector tegnbare = new Vector();
  GrafiskRaflebaeger bæger = new GrafiskRaflebaeger();

  public void paint(Graphics g)
  {
    super.paint(g);
    for (int n=0; n<tegnbare.size(); n++) {
      Tegnbar t = (Tegnbar) tegnbare.elementAt(n);
      t.tegn(g);
    }
  }

  public void sætPositioner()
  {
    for (int n=0; n<tegnbare.size(); n++) {
      Tegnbar t = (Tegnbar) tegnbare.elementAt(n);
      int x = (int) (Math.random()*200);
      int y = (int) (Math.random()*200);
      t.sætPosition(x,y);
    }
  }

  public void init() {
    Stjerne s = new Stjerne();
    tegnbare.addElement(s);
    
    tegnbare.addElement( new Rektangel(10,10,30,30) );

    tegnbare.addElement( new Rektangel(15,15,20,20) );

    GrafiskTerning t;

    t = new GrafiskTerning();
    bæger.tilføj(t);
    tegnbare.addElement(t);

    t = new GrafiskTerning();
    bæger.tilføj(t);
    tegnbare.addElement(t);

    tegnbare.addElement(bæger);

    sætPositioner();

    // mere kode her
    // ... 
  }

  // flere metoder her
  // ... 
}

Programmet holder styr på objekterne i tegnbare-vektoren. Da stjerner, rektangler, terningerne og raflebægeret alle er Tegnbare kan de behandles ens hvad angår tegning og positionering.