Figurarkiv.java [Last ned]

import java.awt.*;
import java.io.*;
import javax.swing.*;
 
 
/*
 * Arkivklasse for å representere en samling av figurer.
 *
 */
public class Figurarkiv {
 
  // Logisk tabell av Figur-objekt er representert
  // ved figurer[0]...figurer[nesteLedige-1].
  // Hvis merketPos>=0, er figurer[merketPos] merket.
  private Figur[] figurer;
  private int     nesteLedige;
  private int     merketPos;
 
 
  public Figurarkiv(int MAX) {
    figurer = new Figur[MAX];
    nesteLedige = 0;
    merketPos = -1;
  }
 
 
  public void settInn(Figur f) {
    if (nesteLedige < figurer.length)
      figurer[nesteLedige++] = f;
    else
      System.out.println("Ikk plass til flere figurer!");
 
    // Denne versjonen gir altså bare ut en feilmelding
    // når figurtabellen er full. Dette kan forbedres
    // enten ved å opprette en ny og større tabell, og
    // kopiere over innholdet. Eller ved å representere
    // figurene i en dynamisk datastruktur som f.eks.
    // ArrayList i java.util.
  }
 
 
  public void vis(Graphics g) {
    for (int i=0; i<nesteLedige; i++) {
      figurer[i].vis(g);
      if (i == merketPos)
        figurer[i].merk(g);
    }
  }
 
 
  public void merk(int x, int y) {
    boolean funnet = false;
    merketPos = nesteLedige-1;
    Punkt klikk = new Punkt(x, y);
 
    // Leter fra slutten av tabellen for først å få
    // undersøkt de objektene som er konstruert sist
    // (de ligger "øverst").
    while (merketPos>=0 && !funnet) {
      if (figurer[merketPos].på(klikk))
        funnet = true;
      else
        merketPos--;
    }
  }
 
 
  public String egenskaperMerket() {
    if (merketPos >= 0)
      return figurer[merketPos].egenskaper();
    else
      return "";
  }
 
 
  public void slett() {
    nesteLedige = 0;
  }
 
 
  public void slettMerket() {
    if (merketPos >= 0) {
      figurer[merketPos] = figurer[nesteLedige-1];
      merketPos = -1;
      nesteLedige--;
    }
  }
 
 
  public void endreFargePåMerket(Color f) {
    if (merketPos >= 0)
      figurer[merketPos].setFarge(f);
  }
 
 
  public void lesFraFil(String filnavn) {
    BufferedReader fil;
    try {
      slett(); // Nullstiller datastrukturen
      fil = new BufferedReader(
        new FileReader(filnavn));
      String linje = fil.readLine();
      while (linje != null) {
        Figur f = byggObjekt(linje);
        settInn(f);
        linje = fil.readLine();
      }
      fil.close();
    }
    catch (IOException e) {
      System.out.println("Feil ved lesing fra fil " + filnavn);
    }
  }
 
 
  public void skrivTilFil(String filnavn) {
    try {
      PrintWriter fil = new PrintWriter (
        new BufferedWriter(
          new FileWriter(filnavn, false )));
      for (int i=0; i<nesteLedige; i++)
        figurer[i].skrivTilFil(fil);
      fil.close();
    }
    catch (IOException e) {
      System.out.println("Feil ved skriving til fil " + filnavn);
    }
  }
 
 
  private Figur byggObjekt(String linje) {
    Figur fig = null;
    String[] deler = linje.split(Tegneprogram.SKILLETEGN);
    String objektType = deler[0];
    Color farge = new Color(Integer.parseInt(deler[1]));
    int x = Integer.parseInt(deler[2]);
    int y = Integer.parseInt(deler[3]);
 
    if (objektType.equals("P"))
      fig = new Punkt(farge, x, y);
    else if (objektType.equals("S")) {
      int r = Integer.parseInt(deler[4]);
      fig = new Sirkel(farge, x, y, r);
    }
    else if (objektType.equals("L")) {
      int x2 = Integer.parseInt(deler[4]);
      int y2 = Integer.parseInt(deler[5]);
      fig = new Linjestykke(farge, x, y, x2, y2);
    }
    else if (objektType.equals("R")) {
      int bredde= Integer.parseInt(deler[4]);
      int høyde = Integer.parseInt(deler[5]);
      fig = new Rektangel(farge, x, y, bredde, høyde);
    }
    else if (objektType.equals("T")) {
      int[] xTab = new int[3];
      int[] yTab = new int[3];
      xTab[0] = x;  yTab[0] = y;
      xTab[1]= Integer.parseInt(deler[4]);
      yTab[1] = Integer.parseInt(deler[5]);
      xTab[2]= Integer.parseInt(deler[6]);
      yTab[2] = Integer.parseInt(deler[7]);
      fig = new Trekant(farge, xTab, yTab);
    }
 
    return fig;
  }
 
}
Kildekode blir vist ved hjelp av GeSHi.