joi, 7 iunie 2012

Ceas

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