Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање на језику Java - колоквијуми
Други колоквијум
22. 1. 2007

Задатак | Напомене | Решење

Поставка задатка (решење | садржај)

Саставити на језику Java следећи пакет класа:


Напомене (садржај)


Решење задатка (поставка | садржај)

// Prikazivac.java

package histogram;
import java.awt.*;

public abstract class Platno extends Canvas {
  protected double min, max;
  protected double[] niz;
  protected int poc, duz;

  public Platno (double mi, double ma) { min = mi; max = ma; }

  public Platno (double ma) { max = ma; }

  public Platno () { max = getHeight()-1; }

  public void prikazi (double[] niz, int poc) {
    this.niz = niz; this.poc = poc;
    duz = niz.length;
    repaint ();
  }

  public abstract void paint (Graphics g);
}

// Histogram.java

package histogram;
import java.awt.*;

public class Histogram extends Platno {
  public Histogram (double max) { this.max = max; }

  public void postaviMax (double max) { this.max = max; }

  public void paint (Graphics g) {
    if (niz != null) {
      g.setColor (Color.BLACK);
      int sir = getWidth (), vis = getHeight ();
      double ds = (double)sir / duz,
             dv = (double)vis / (max - min),
             sr = 0;
      for (int i=0; i<duz; i++) {
        int x = (int) (i * ds);
        int v = (int) ((niz[(poc+i)%duz]-min)*dv);
        g.fillRect (x, vis-v, (int)ds-1, v);
        sr += niz[i];
      }
      int v = vis - (int) (sr/duz * dv);
      g.setColor (Color.RED);
      g.drawLine (0, v, sir, v);
    }
  }
}

// Generator.java

package histogram;

public class Generator extends Thread {
  private double min = 0, max = 1;
  private int dt = 100;
  private boolean radi = false;
  private Platno platno;
  private double[] niz;
  private int tek;

  public Generator (Platno pl) { platno = pl; start (); }

  public void parametri (double min, double max, int dt)
    { this.min=min; this.max=max; this.dt=dt; }

  public synchronized void kreni (int duz) {
    niz = new double [duz]; tek = 0;
    radi = true; notify ();
  }

  public synchronized void stani () { radi=false; }

  public void zavrsi () { interrupt (); }

  public void run () {
    try {
      while (! interrupted ()) {
        if (! radi) synchronized (this) { wait(); }
        niz[tek++] = min + (max - min) * Math.random ();
        if (tek == niz.length) tek = 0;
        platno.prikazi (niz, tek);
        sleep (dt);
      }
    } catch (InterruptedException g) {}
  }
}

// Program.java

package histogram;
import java.awt.*;
import java.awt.event.*;

public class Program extends Frame {
  private Histogram hist = new Histogram (1);
  private Generator gen = new Generator (hist);
  private TextField tksMin =new TextField("0.5",3),
                    tksMax =new TextField("1.0",3),
                    tksYmax=new TextField("1.0",3),
                    tksDt  =new TextField("500",3),
                    tksDuz =new TextField("30" ,3);

  private void postaviParametre () {
    try {
      gen.parametri (
        Double.parseDouble(tksMin.getText()),
        Double.parseDouble(tksMax.getText()),
        Integer.parseInt(tksDt.getText())
      );
      hist.postaviMax (Double.parseDouble(tksYmax.getText()));
    } catch (NumberFormatException g) {}
  }

  private Panel ploParametri() {
    Panel plo = new Panel ();
    plo.add (new Label ("min:", Label.RIGHT));
    plo.add (tksMin);
    plo.add (new Label ("max:", Label.RIGHT));
    plo.add (tksMax);
    plo.add (new Label ("Ymax:", Label.RIGHT));
    plo.add (tksYmax);
    plo.add (new Label ("dt:", Label.RIGHT));
    plo.add (tksDt);
    TextListener osm = new TextListener () {
      public void textValueChanged (TextEvent d) { postaviParametre (); }
    };
    tksMin .addTextListener (osm);
    tksMax .addTextListener (osm);
    tksYmax.addTextListener (osm);
    tksDt  .addTextListener (osm);
    postaviParametre ();
    return plo;
  }

  private Panel ploKomande () {
    Panel plo = new Panel ();
    plo.add (new Label ("duz:", Label.RIGHT));
    plo.add (tksDuz);
    Button dgm = new Button ("Kreni");
    plo.add (dgm);
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d) {
        try {
          gen.kreni (Integer.parseInt (tksDuz.getText()));
        } catch (NumberFormatException g) {}
      }
    });
    plo.add (dgm = new Button ("Stani"));
    dgm.addActionListener (new ActionListener () {
      public void actionPerformed (ActionEvent d) { gen.stani (); }
    });
    return plo;
  }

  private void popuniProzor () {
    add (hist, "Center");
    Panel plo = new Panel (new GridLayout (2,1));
    add (plo, "South");
    plo.add (ploParametri());
    plo.add (ploKomande());
  }

  public Program () {
    super ("Histogram");
    setSize (400, 200);
    popuniProzor ();
    setVisible (true);

    addWindowListener (new WindowAdapter () {
      public void windowClosing (WindowEvent d) { gen.zavrsi () ; dispose (); }
    });
  }

  public static void main (String[] varg) { new Program (); }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2010, Laslo Kraus
Последња ревизија: 8.9.2010.