Tegneprogram.java [Last ned]

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
 
 
/*
 * Brukergrensesnitt for tegneprogrammet.
 *
 * Brukeren kan konstruere punkt, linjestykker,
 * rektangel, sirkler og trekanter, med mulighet
 * for å styre plassering, form og farge.
 *
 * Brukeren kan også merke geometriobjekt, få
 * skrevet ut egenskaper om objektene, og endre farge
 * på objektene.
 *
 * Programmet kan lagre/lese geometriobjekter
 * til/fra tekstfiler.
 *
 */
public class Tegneprogram extends JFrame
  implements ActionListener, MouseListener {
 
  // Størrelse på vinduet
  private static int BREDDE = 800;
  private static int HØYDE  = 800;
 
  // Maksimalt antall figurer
  private static int MAKS   = 1000;
 
 
  // Avstand i piksler på skjerm som kan tolereres for
  // å godta et "treff" ved merking av geometriobjekt.
  public static final int TOLERANSE = 5;
 
  //Skilletegn mellom verdier ved lagring til fil.
  public static final String SKILLETEGN = ";";
 
  // Fargen som blir brukt for å vise at et geometriobjekt er merket.
  public static final Color MERKEFARGE = Color.RED;
 
 
  // GUI-komponenter
  private JRadioButton btnPunkt, btnLinjestykke,
                       btnRektangel, btnSirkel,
                       btnTrekant, btnMerk, btnSlett;
  private JButton      btnFarge, btnNy, btnLes, btnLagre;
  private JTextField   txtInfo;
 
 
  private Tegneflate   flate;    // Viser geometriobjektene
  private Figurarkiv   arkiv;    // Datastrukturen
 
  private int          x1, y1;   // Musmarkørens posisjon
 
 
  public static void main(String[] args) {
    Tegneprogram GUI = new Tegneprogram();
    GUI.setVisible(true);
  }
 
 
  public Tegneprogram() {
    arkiv = new Figurarkiv(MAKS);
    initGUI();
  }
 
 
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == btnFarge) {
      Color f = new JColorChooser().
        showDialog(null, "Velg farge", Color.BLACK);
      btnFarge.setForeground(f);
      arkiv.endreFargePåMerket(f);
    }
    else if (e.getSource() == btnLes) {
      String filnavn = lesFilnavn(false);
      if (filnavn != null)
        arkiv.lesFraFil(filnavn);
    }
    else if (e.getSource() == btnLagre) {
      String filnavn = lesFilnavn(true);
      if (filnavn != null)
        arkiv.skrivTilFil(filnavn);
    }
    else if (e.getSource() == btnNy) {
      arkiv.slett();
      btnFarge.setForeground(Color.BLACK);
    }
    repaint();
  }
 
 
  public void mouseClicked(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
 
 
  public void mousePressed(MouseEvent e) {
 
    x1 = e.getX();
    y1 = e.getY();
 
    if (btnMerk.isSelected()) {
      arkiv.merk(x1, y1);
      txtInfo.setText(arkiv.egenskaperMerket());
    }
    else if (btnSlett.isSelected()) {
      arkiv.merk(x1, y1);
      arkiv.slettMerket();
    }
 
    repaint();
  }
 
 
  public void mouseReleased(MouseEvent e) {
 
    int x2 = e.getX();
    int y2 = e.getY();
 
    if (btnPunkt.isSelected()) {
      Punkt P = new Punkt(farge(), x2, y2);
      arkiv.settInn(P);
    }
    else if (btnLinjestykke.isSelected()) {
      Linjestykke L = new Linjestykke(farge(), x1, y1, x2, y2);
      arkiv.settInn(L);
    }
    else if (btnRektangel.isSelected()) {
      int venstre = Math.min(x1, x2);
      int topp = Math.min(y1, y2);
      int bredde = Math.abs(x1 - x2);
      int høyde = Math.abs(y1 - y2);
      Rektangel R = new Rektangel(farge(), venstre, topp, bredde, høyde);
      arkiv.settInn(R);
    }
    else if (btnSirkel.isSelected()) {
      int venstre = Math.min(x1, x2);
      int topp = Math.min(y1, y2);
      Punkt p1 = new Punkt(x1, y1);
      Punkt p2 = new Punkt(x2, y2);
      int radius = (int) (p1.avstand(p2) / 2);
 
      Sirkel S = new Sirkel(farge(), venstre, topp, radius);
      arkiv.settInn(S);
      // Starten på linjen (p1, p2) blir øvre, venstre hjørne i
      // den omsluttende boksen til sirkelen, og lengden
      // på linjen bestemmer diameteren. Brukeren kan
      // altså lage en sirkel f.eks. ved å trekke en
      // linje rett nedover.
    }
    else if (btnTrekant.isSelected()) {
      int[] xTab = new int[3];
      int[] yTab = new int[3];
      xTab[0] = x1;  yTab[0] = y1;
      Punkt p1 = new Punkt(x1, y1);
      Punkt p2 = new Punkt(x2, y2);
      int g = 1 + (int) (p1.avstand(p2) / 2);
      Punkt v = new Punkt(-(y2 - y1), x2 - x1);
      v.x = v.x/g;   v.y = v.y/g;
      xTab[1] = x2+g*v.x;  yTab[1] = y2+g*v.y;
      xTab[2] = x2-g*v.x;  yTab[2] = y2-g*v.y;
 
      Trekant T = new Trekant(farge(), xTab, yTab);
      arkiv.settInn(T);
      // Starten på linjen blir toppunkt i trekanten, og lengden
      // på linjen bestemmer høyden. Lager en 'slags' likesidet
      // trekant der grunnlinjen blir like lang som høyden.
    }
 
    repaint();
  }
 
 
 
  /*  P R I V A T E   H J E L P E M E T O D E R  */
 
 
  private void initGUI() {
    this.setTitle("Tegneprogram");
    this.setDefaultCloseOperation(
      JFrame.EXIT_ON_CLOSE);
    this.setSize(BREDDE, HØYDE);
 
    flate = new Tegneflate(arkiv);
 
    JPanel venstre = new JPanel();
    JPanel knapper = new JPanel();
 
    btnPunkt = new JRadioButton("Punkt");
    btnLinjestykke = new JRadioButton("Linjestykke");
    btnRektangel = new JRadioButton("Rektangel");
    btnSirkel = new JRadioButton("Sirkel");
    btnTrekant = new JRadioButton("Trekant");
    btnMerk = new JRadioButton("Merk");
    btnSlett = new JRadioButton("Slett");
 
    btnFarge = new JButton("Farge...");
    btnNy = new JButton("Ny");
    btnLes = new JButton("Les");
    btnLagre = new JButton("Lagre");
 
    txtInfo = new JTextField( 80 );
 
    this.getContentPane().setLayout(
      new BorderLayout());
    venstre.setLayout(new BorderLayout());
    knapper.setLayout(new GridLayout(11, 1));
 
    knapper.add(btnPunkt);
    knapper.add(btnLinjestykke);
    knapper.add(btnRektangel);
    knapper.add(btnSirkel);
    knapper.add(btnTrekant);
    knapper.add(btnFarge);
    knapper.add(btnMerk);
    knapper.add(btnSlett);
    knapper.add(btnNy);
    knapper.add(btnLes);
    knapper.add(btnLagre);
 
    venstre.add(knapper, BorderLayout.NORTH);
    this.getContentPane().
      add(venstre, BorderLayout.WEST);
    this.getContentPane().
      add(flate, BorderLayout.CENTER);
    this.getContentPane().
      add(txtInfo, BorderLayout.SOUTH);
 
    ButtonGroup grpFigurer = new ButtonGroup();
    grpFigurer.add(btnPunkt);
    grpFigurer.add(btnLinjestykke);
    grpFigurer.add(btnRektangel);
    grpFigurer.add(btnSirkel);
    grpFigurer.add(btnTrekant);
    grpFigurer.add(btnMerk);
    grpFigurer.add(btnSlett);
 
    btnPunkt.addActionListener(this);
    btnLinjestykke.addActionListener(this);
    btnRektangel.addActionListener(this);
    btnSirkel.addActionListener(this);
    btnTrekant.addActionListener(this);
    btnFarge.addActionListener(this);
    btnMerk.addActionListener(this);
    btnSlett.addActionListener(this);
    btnNy.addActionListener(this);
    btnLes.addActionListener(this);
    btnLagre.addActionListener(this);
 
    flate.addMouseListener(this);
 
    txtInfo.setEditable(true);
    btnPunkt.setSelected(true);
  }
 
 
  private Color farge() {
    return btnFarge.getForeground();
  }
 
 
  private String lesFilnavn(boolean lagre) {
    String filnavn = null;
    JFileChooser filvelger = new JFileChooser();
    filvelger.setCurrentDirectory(new File("."));
    int status = 0;
    if (lagre)
      status = filvelger.showSaveDialog(null);
    else
      status = filvelger.showOpenDialog(null);
    if (status == JFileChooser.APPROVE_OPTION) {
      File fil = filvelger.getSelectedFile();
      filnavn = fil.getAbsolutePath();
    }
    return filnavn;
  }
 
}
Kildekode blir vist ved hjelp av GeSHi.