joi, 7 iunie 2012

Ceas

////////////////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