clasa ceas////////
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.*;
//se ut. o imagine bufferata pt imaginea ceasului pt. ca
// imaginea sa nu fie desenata de fiecare data
public class Ceas extends JComponent{
private static final double TWO_PI=2*Math.PI; //lungimea cercului
private static final int UPDATE_INTERVAL=100; //milisecunde
//intervalul de "reimprospatare"
private Calendar timpCurent=Calendar.getInstance();
// timpul actual
private int diametru; //inaltime..latime fetei ceasului
private int x;
private int y; //coord mijlocului ceasului
private BufferedImage clockImage; // imaginea fetei ceasului e salvata
private javax.swing.Timer timer; //update clock
//Fires one or more action events after a specified delay. For example, an animation object can
//use a Timer as the trigger for drawing its frames.
//construtorul acestei clase
private Ascultator asc;
public Ceas()
{
asc=new Ascultator();
timer=new javax.swing.Timer(UPDATE_INTERVAL,asc);
}
// porneste timerul
public void start() {
timer.start();
}
private void updateTime()
{
timpCurent.setTimeInMillis(System.currentTimeMillis());
}
// opreste timerul
public void stop() {
timer.stop();
}
public class Ascultator implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
updateTime();
repaint();
}
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//setRenderingHints(Map hints)
// inlocuieste valorile pt toate alegerile
//alg. de redare cu cheile precizate
//panoul este posibil sa se fi redimensionat ..ia in vedere noile pozitii
int w = getWidth();
int h = getHeight();
diametru = ((w < h) ? w : h);
x=diametru / 2;
y=diametru / 2;
//cream imaginea de fundal a ceasului daca am trecut pe aici pt
//prima data sau data dimens panoului s-au schimbat
if (clockImage == null
|| clockImage.getWidth() != w
|| clockImage.getHeight() != h) {
clockImage = (BufferedImage)(this.createImage(w, h));
// accesam contextul grafic al imaginii
Graphics2D g2a = clockImage.createGraphics();
g2a.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
drawClockFace(g2a);
}
// deseneaza imaginea cesasului
g2.drawImage(clockImage, null, 0, 0);
// deseneaza acele ceasului in mod dinamic
drawClockHands(g2);
}
private void drawClockFace(Graphics2D g2) {
// deseneaza ceasul
g2.setColor(Color.cyan);
g2.fillOval(0, 0, diametru,diametru);
g2.setColor(Color.BLACK);
g2.drawOval(0, 0,diametru,diametru);
int raza = diametru/2;
g2.drawString("12", raza-8,35);
g2.drawString("6", raza-2,diametru-25);
g2.drawString("3", diametru-25,raza+5);
g2.drawString("9", 20,raza+5);
//desenez intervalele de timp de jur-imprejurul circumferintei
for (int sec = 0; sec < 60; sec++) {
int tickStart;
if (sec%5 == 0) {
tickStart = raza - 10; // desenez linie lunga marcata pt. 5
} else {
tickStart = raza - 5; // linie scurta.
}
drawRadius(g2, sec / 60.0, tickStart , raza);
}
}
private void drawRadius(Graphics2D g2, double fractie,
int minRadius, int maxRadius) {
// parametrul fractie e o fractie(0.0 - 1.0) din cale
// in sensul acelor de ceasornic de la 12. metodele din Graphics2D ut. radiani
// ..invers...de la 3, mici conversii sunt necesare.
double radians = (0.5 - fractie) * TWO_PI;
double sine = Math.sin(radians);
double cosine = Math.cos(radians);
int dxmin = x + (int)(minRadius * sine);
int dymin = y+ (int)(minRadius * cosine);
int dxmax = x + (int)(maxRadius * sine);
int dymax = y + (int)(maxRadius * cosine);
g2.drawLine(dxmin, dymin, dxmax, dymax);
}
private void drawClockHands(Graphics2D g2) {
//... iau inf. necesare din clasa Calendar
int ore = timpCurent.get(Calendar.HOUR);
int minute = timpCurent.get(Calendar.MINUTE);
int secunde = timpCurent.get(Calendar.SECOND);
int miliSecunde = timpCurent.get(Calendar.MILLISECOND);
//... second hand
int handMin = diametru / 8; // al doilea ac nu incepe din mijloc
int handMax = diametru / 2; // al doilea ac se extinde catre linia din afara a orizontului
double fsecunde = (secunde + (double)miliSecunde/1000) / 60.0;
drawRadius(g2, fsecunde, 0, handMax);
//...acul pt minute
handMin = 0; // acul pt. minute incepe in mijloc
handMax = diametru / 3;
double fminute = (minute + fsecunde) / 60.0;
drawRadius(g2, fminute, 0, handMax);
// limba pt ore
handMin = 0;
handMax = diametru / 4;
drawRadius(g2, (ore + fminute) / 12.0, 0, handMax);
}
}
///////////////clasa CeasAnalogic///////////////
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class CeasAnalogic extends JApplet {
private Ceas ceas;
public CeasAnalogic() {
ceas = new Ceas();
setPreferredSize(new Dimension(100,100));
setLayout(new BorderLayout());
add(ceas, BorderLayout.CENTER);
start(); //ceasul incepe sa fct
}
public void start() {
ceas.start();
}
public void stop() {
ceas.stop();
}
public static void main(String[] args) {
Console.run(new CeasAnalogic(),600,400);
}
}
///////////////////clasa Console/////////////////
import javax.swing.*;
import java.awt.*;
public class Console {
public static void run(JApplet applet,int lung,int inalt)
{
JFrame frame=new JFrame("Ceas Analogic");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(lung,inalt);
frame.getContentPane().add(applet);
applet.init();
applet.start();
// frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Niciun comentariu:
Trimiteți un comentariu