////////////////ceas////////////
import javax.swing.*;
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
@SuppressWarnings("serial")
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
static long deplasare;
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);
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);
handMax = diametru / 3;
double fminute = (minute + fsecunde) / 60.0;
drawRadius(g2, fminute, 0, handMax);
handMax = diametru / 4;
drawRadius(g2, (ore + fminute) / 12.0, 0, handMax);
}
}
...............................
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class CeasAnalogic extends JFrame implements ActionListener{
private Ceas ceas;
private JButton btn1=new JButton("Setare Ora");
private JButton btn2=new JButton("Setare Minute");
JTextField l1=new JTextField();
JTextField l2=new JTextField();
public CeasAnalogic() {
ceas = new Ceas();
btn1.addActionListener(this);
btn2.addActionListener(this);
JPanel panel=new JPanel(new GridLayout(4, 1, 5, 5));
panel.add(btn1);
panel.add(l1);
panel.add(btn2);
panel.add(l2);
setPreferredSize(new Dimension(400,400));
setLayout(new BorderLayout());
add(ceas, BorderLayout.CENTER);
add(panel,BorderLayout.WEST);
start(); //ceasul incepe sa fct
}
public void start() {
ceas.start();
}
public void stop() {
ceas.stop();
}
@SuppressWarnings("static-access")
public void actionPerformed(ActionEvent e) {
@SuppressWarnings("unused")
long a,b;
if (e.getSource() == btn1) {
try {
a=new Long(l1.getText());
System.out.println(a);
if(a>12)
{
JOptionPane.showMessageDialog(this,
"numar prea mare",
"setare ora", JOptionPane.PLAIN_MESSAGE);
}
else
Ceas.deplasare+=a*60*60*60*60*60;
} catch (NumberFormatException e1) {
// TODO Auto-generated catch block
JOptionPane.showMessageDialog(this,
"INTRODUCETI NUMAR",
"setare ora", JOptionPane.PLAIN_MESSAGE);
}
return;
}
if (e.getSource() == btn2) {
try{
b=new Long(l2.getText());
if(b>60)
{
JOptionPane.showMessageDialog(this,
"numar prea mare",
"setare minut", JOptionPane.PLAIN_MESSAGE);
}
else
Ceas.deplasare=+b*60*60*60*60*60*60*60;
} catch (NumberFormatException e1) {
JOptionPane.showMessageDialog(this,
"INTRODUCETI NUMAR",
"setare minut", JOptionPane.PLAIN_MESSAGE);
}
return;
}
}
public static void main(String[] args) {
CeasAnalogic ceas=new CeasAnalogic();
ceas.setVisible(true);
ceas.setSize(200, 200);
ceas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ceas.pack();
ceas.setResizable(true);
ceas.setLocationRelativeTo(null);
ceas.setVisible(true);
}
}
Niciun comentariu:
Trimiteți un comentariu