VISER, Beograd
Ласло Краус
Објектно програмирање 2 - колоквијуми
Други колоквијум
20. 1. 2010

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

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

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


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


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

// Stoperica.java

package stoperica;
import java.awt.Component;

public abstract class Stoperica extends Thread {
  private long t0;
  private boolean radi = false;

  public Stoperica() {
    t0 = System.currentTimeMillis();
    start();
  }

  public synchronized void kreni () {
    t0 = System.currentTimeMillis();
    radi = true; notify();
  }

  public void stani() { radi = false; }

  public synchronized void nastavi () { radi = true; notify(); }

  public void prekini() { interrupt(); }

  public abstract Component prikazivac();

  protected abstract void prikazi(long dt);

  public void run () {
    try {
      while (! interrupted()) {
        if (!radi) synchronized (this) { wait(); }
        sleep( 10);
        prikazi(System.currentTimeMillis() - t0);
      }
    } catch (InterruptedException g) {}
  }
}

// Digitalna.java

package stoperica;
import java.awt.*;

public class Digitalna extends Stoperica {

  private Label prik = new Label( "0.000", Label.CENTER);

  public Digitalna() {
    prik.setFont( new Font( null, Font.BOLD, 20));
  }

  public Label prikazivac () { return prik; }

  public void prikazi( long dt) {
    prik.setText( String.format( "%.3f", dt/1000.));
  }
}

// Analogna.java

package stoperica;
import java.awt.*;

public class Analogna extends Stoperica {
  long dt;
  Platno prik = new Platno();

  public Platno prikazivac() { return prik; }

  public void prikazi( long dt) { this.dt = dt; prik.repaint(); }

  private class Platno extends Canvas {
    public void paint( Graphics g) {
      int a = getWidth() / 2 - 1;
      int b = getHeight() / 2 - 1;
      g.translate( a, b);
      a -= 10; b -=10;
      g.setColor( Color.BLACK);
      g.drawOval(-a, -b, 2*a, 2*b);
      g.setColor( Color.RED);
      double fi = Math.PI/2 - dt*Math.PI/30000;
      int x = (int)(a * Math.cos( fi));
      int y = (int)(- b * Math.sin( fi));
      g.drawLine( 0, 0, x, y);
    }
  }
}

// Program.java

import stoperica.*;
import java.awt.*;
import java.awt.event.*;

public class Program extends Frame {
  Stoperica dig = new Digitalna();
  Stoperica ana = new Analogna();

  public Program() {
    super( "Stoperica");
    setSize( 200, 200);
    popuniProzor();
    setVisible( true);
    addWindowListener( new WindowAdapter() {
      public void windowClosing( WindowEvent d) {
        dig.prekini(); ana.prekini(); dispose();
      }
    });
  }

  private void popuniProzor() {
    add (dig.prikazivac(), "North");
    add (ana.prikazivac(), "Center");
    Panel plo = new Panel();
    add( plo, "South");
    plo.setBackground( Color.LIGHT_GRAY);
    Button dgm = new Button( "Kreni");
    plo.add(dgm);
    dgm.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent d) {
        dig.kreni(); ana.kreni();
      }
    });
    plo.add( dgm = new Button("Stani"));
    dgm.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent d) {
        dig.stani(); ana.stani();
      }
    });
    plo.add( dgm = new Button("Nastavi"));
    dgm.addActionListener( new ActionListener() {
      public void actionPerformed( ActionEvent d) {
        dig.nastavi(); ana.nastavi();
      }
    });
  }

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

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