Vous êtes sur la page 1sur 6

Lucrare de Laborator nr.

3
la PC
Varianta: 6
Cronometru, cu butoanele start/stop i reset.
Listing-ul programului:
package lab3pc;
import
import
import
import
import

java.util.*;
java.awt.*;
java.awt.event.*;
java.applet.*;
java.text.*;

class MyThread extends Thread {


public Color updated_color;
public int H=1,S=1,B=1;
public MyThread(){
//H=H+40;S=S+40;B=B+40;
updated_color=Color.getHSBColor(H++,S++,B++);
}
public void update_color() {
H=H+2;
S=S+2;
B=B+2;
this.updated_color=Color.getHSBColor(H,S,B);
}
@Override
public void run() {
while(true){
try {
sleep(2000);
} catch (InterruptedException e) { }
update_color();
}
}
}
public class Lab3pc extends Applet implements Runnable, ActionListener {
public Thread timer;
// Reteaua care afiseaza timpul
public MyThread paint_thread;
//Firul ce coloreaza arcul secundelor
public int lastxs, lastys, lastxm,
lastym, lastxh, lastyh; // Dimensiunile necesare desenarii arcelor

public Font clockFaceFont;


// Fontul pentru numerele de pe cronometru
public Date currentDate;
// Data curenta
public Date DataStart;
// Data de start a cronometrului
public int SecPornire;
// Data de pornire a cronometrului
public int SecOprire;
// Data de oprire a cronometrului
public int Interval_sec;
// Intervalul de timp in secunde intre oprire
// si pornire a cronometrului
public Color handColor;
// Culoarea arcului minutelor si a cronometrului
public Color numberColor;
// Culoarea arcului secundelor si a numerelor
public int xcenter = 80, ycenter = 90; // Center position
public TextField a1 = new TextField("",1),a2 = new TextField("",1);
public Button START_STOP = new Button("Start / Stop");
public Button RESET = new Button("Resetare");
public int Stare=1; //Starea cronometrului la momentul dat
public void init() {
int x,y;
add(a1);
a1.setEditable(false);
add(a2);
a2.setEditable(false);
lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
DataStart=new Date();
SecPornire=0;
SecOprire=0;
Interval_sec=0;
clockFaceFont = new Font("Serif", Font.BOLD, 18);
handColor = Color.green;
numberColor = Color.darkGray;
add(START_STOP);
START_STOP.addActionListener(this);
add(RESET);
RESET.addActionListener(this);
try {
setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),
16)));
} catch (NullPointerException e) {
} catch (NumberFormatException e) {
}
try {
handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),
16));
} catch (NullPointerException e) {
} catch (NumberFormatException e) {
}
try {
numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),

16));
} catch (NullPointerException e) {
} catch (NumberFormatException e) {
}
}
// Metoda de mai jos este partea pRincipala a programului
@Override
public void update(Graphics g) {
int xm, ym, xs, ys,
s=0,m=0;
String S1=new String(""),S2=new String("");
int temp;
currentDate = new Date();

s = (currentDate.getSeconds()-DataStart.getSeconds())-Interval_sec;
m = s/60;
//Calculeaza pozitiile virfurilor arcelor cronometrului
xs = (int) (Math.cos(s * Math.PI / 30 - Math.PI / 2) * 45 + xcenter);
ys = (int) (Math.sin(s * Math.PI / 30 - Math.PI / 2) * 45 + ycenter);
xm = (int) (Math.cos(m * Math.PI / 30 - Math.PI / 2) * 40 + xcenter);
ym = (int) (Math.sin(m * Math.PI / 30 - Math.PI / 2) * 40 + ycenter);
// Sterge arcele precedente
g.setColor(getBackground());
if (xs != lastxs || ys != lastys) {
g.drawLine(xcenter, ycenter, lastxs, lastys);
}
if (xm != lastxm || ym != lastym) {
g.drawLine(xcenter, ycenter-1, lastxm, lastym);
g.drawLine(xcenter-1, ycenter, lastxm, lastym);
}
// Calcularea sirului de afisare a timpului trecut S
g.setFont(clockFaceFont);
switch(s/10)
{ case 0: S2="0"; break;
case 1: S2="1"; break;
case 2: S2="2"; break;
case 3: S2="3"; break;
case 4: S2="4"; break;
case 5: S2="5"; break;
case 6: S2="6"; break;
case 7: S2="7"; break;
case 8: S2="8"; break;
case 9: S2="9"; break;
}
switch(s%10)
{ case 0: S2=S2+"0"; break;

case 1: S2=S2+"1";
case 2: S2=S2+"2";
case 3: S2=S2+"3";
case 4: S2=S2+"4";
case 5: S2=S2+"5";
case 6: S2=S2+"6";
case 7: S2=S2+"7";
case 8: S2=S2+"8";
case 9: S2=S2+"9";
}
a2.setText(S2);

break;
break;
break;
break;
break;
break;
break;
break;
break;

switch(m/10)
{ case 0: S1=S1+"0"; break;
case 1: S1=S1+"1"; break;
case 2: S1=S1+"2"; break;
case 3: S1=S1+"3"; break;
case 4: S1=S1+"4"; break;
case 5: S1=S1+"5"; break;
case 6: S1=S1+"6"; break;
case 7: S1=S1+"7"; break;
case 8: S1=S1+"8"; break;
case 9: S1=S1+"9"; break;
}
switch(m%10)
{ case 0: S1=S1+"0"; break;
case 1: S1=S1+"1"; break;
case 2: S1=S1+"2"; break;
case 3: S1=S1+"3"; break;
case 4: S1=S1+"4"; break;
case 5: S1=S1+"5"; break;
case 6: S1=S1+"6"; break;
case 7: S1=S1+"7"; break;
case 8: S1=S1+"8"; break;
case 9: S1=S1+"9"; break;
}
a1.setText(S1);
// Tiparirea timpului si a bratelor cronometrului
g.setColor(paint_thread.updated_color);
g.drawLine(xcenter, ycenter, xs, ys);
g.setColor(handColor);
g.drawLine(xcenter, ycenter-1, xm, ym);
g.drawLine(xcenter-1, ycenter, xm, ym);
lastxs = xs; lastys = ys;
lastxm = xm; lastym = ym;
}
@Override
public void paint(Graphics g) {
int i;

a1.move(55,145);
a2.move(85,145);
START_STOP.move(25,5);
RESET.move(100,5);
g.setFont(clockFaceFont);
// Deseana circumferinta si arcele cronometrului
g.setColor(handColor);
g.drawArc(xcenter-50, ycenter-50, 100, 100, 0, 360);
g.setColor(numberColor);
g.drawString("45", xcenter-45, ycenter+3);
g.drawString("15", xcenter+35, ycenter+3);
g.drawString("60", xcenter-5, ycenter-37);
g.drawString("30", xcenter-3, ycenter+45);
// Deseana arcele
g.setColor(numberColor);
g.drawLine(xcenter, ycenter, lastxs, lastys);
g.setColor(handColor);
g.drawLine(xcenter, ycenter-1, lastxm, lastym);
g.drawLine(xcenter-1, ycenter, lastxm, lastym);
}
@Override
public void start() {
timer = new Thread(this);
timer.start();
paint_thread = new MyThread();
paint_thread.start();
}
@Override
public void stop() {
timer = null;
paint_thread = null;
}
@Override
public void run() {
Thread me = Thread.currentThread();
while (timer == me) {
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
}
repaint();
}
}

@Override
public void actionPerformed(ActionEvent thisEvent)
{ Thread me = Thread.currentThread();
int temp;
if(thisEvent.getSource()==START_STOP && Stare==1)
{
SecOprire=new Date().getSeconds();
timer.suspend();
Stare=0;}
else if(thisEvent.getSource()==START_STOP && Stare==0)
{
SecPornire=new Date().getSeconds();
Interval_sec=Interval_sec+SecPornire-SecOprire;
while(Interval_sec>60) { Interval_sec=Interval_sec-60; }
timer.resume();
Stare=1;}
if(thisEvent.getSource()==RESET) {DataStart=new Date(); Interval_sec=0;}
}
}
Rezultatul obtinut:

Vous aimerez peut-être aussi