首页 > 技术文章 > java写的各种钟(收集)

jamsbwo 2015-06-19 15:42 原文

1.clock_demo1.java,时间有点不准,望指正

public class clock_demo1 extends JFrame {
    private static final long serialVersionUID = 6790815213225162093L;
    Timer timer;
    int x, y, old_X, old_Y, r, x0, y0, w, h, ang;
    int sdo, mdo, hdo, old_M, old_H;
    // TimeZone tz =TimeZone.getTimeZone("JST");
    TimeZone tz = TimeZone.getDefault();
    final double RAD = Math.PI / 180.0;

    @SuppressWarnings("deprecation")
    public clock_demo1() {
        super("[HappyChat]钟");
        setSize(300, 300);
        setBackground(new Color(0, 0, 192));
        setResizable(false);
        Dimension scr = Toolkit.getDefaultToolkit().getScreenSize();// ����Ļ������ʾ
        Dimension fra = this.getSize();
        if (fra.width > scr.width) {
            fra.width = scr.width;
        }
        if (fra.height > scr.height) {
            fra.height = scr.height;
        }
        this.setLocation((scr.width - fra.width) / 2,
                (scr.height - fra.height) / 2);
        show();
        int delay = 1000;

        // 
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                repaint();
            }
        };
        new Timer(delay, taskPerformer).start();
    }

    public void actionPerformed(ActionEvent e) {
        timer.restart();
    }

    public void paint(Graphics g) {
        Insets insets = getInsets();
        int L0 = (insets.left) / 2, T0 = (insets.top) / 2;
        int hh, mm, ss;
        String st;
        h = getSize().height;
        // 
        g.setColor(Color.white);
        g.drawOval(L0 + 30, T0 + 30, h - 60, h - 60);
        g.drawOval(L0 + 32, T0 + 32, h - 64, h - 64);
        r = h / 2 - 30;
        x0 = 30 + r - 5 + L0;
        y0 = 30 + r - 5 - T0;
        ang = 60;
        for (int i = 1; i <= 12; i++) {
            x = (int) ((r + 10) * Math.cos(RAD * ang) + x0);
            y = (int) ((r + 10) * Math.sin(RAD * ang) + y0);
            g.drawString("" + i, x, h - y);
            ang -= 30;
        }
        x0 = 30 + r + L0;
        y0 = 30 + r + T0;
        // 
        Calendar now = Calendar.getInstance();
        hh = now.get(Calendar.HOUR_OF_DAY);// 
        mm = now.get(Calendar.MINUTE);// 
        ss = now.get(Calendar.SECOND);// 
        g.setColor(Color.red);
        g.fillRect(L0, T0, 60, 28);//
        g.setColor(Color.blue);
        if (hh < 10)
            st = "0" + hh;
        else
            st = "" + hh;
        if (mm < 10)
            st = st + ":0" + mm;
        else
            st = st + ":" + mm;
        if (ss < 10)
            st = st + ":0" + ss;
        else
            st = st + ":" + ss;
        g.drawString(st, L0, T0 + 25);
        //
        sdo = 90 - ss * 6;
        mdo = 90 - mm * 6;
        hdo = 90 - hh * 30 - mm / 2;
        // 
        if (old_X > 0) {
            g.setColor(getBackground());
            g.drawLine(x0, y0, old_X, (h - old_Y));
        } else {
            old_M = mdo;
            old_H = hdo;
        }
        // 
        g.setColor(Color.yellow);
        x = (int) ((r - 8) * Math.cos(RAD * sdo) + x0);
        y = (int) ((r - 8) * Math.sin(RAD * sdo) + y0) - 2 * T0;
        g.drawLine(x0, y0, x, (h - y));

        old_X = x;
        old_Y = y;
        // 
        if (mdo != old_M) {
            line(g, old_M, (int) (r * 0.7), getBackground());
            old_M = mdo;
        }
        if (hdo != old_H) {
            line(g, old_H, (int) (r * 0.5), getBackground());
            old_H = hdo;
        }
        // 
        line(g, mdo, (int) (r * 0.7), Color.green);
        // 
        line(g, hdo, (int) (r * 0.5), Color.red);
    } // end paint

    public void line(Graphics g, int t, int n, Color c) {
        int[] xp = new int[4];
        int[] yp = new int[4];
        xp[0] = x0;
        yp[0] = y0;
        xp[1] = (int) ((n - 10) * Math.cos(RAD * (t - 4)) + x0);
        yp[1] = h - (int) ((n - 10) * Math.sin(RAD * (t - 4)) + y0);
        xp[2] = (int) (n * Math.cos(RAD * t) + x0);
        yp[2] = h - (int) (n * Math.sin(RAD * t) + y0);
        xp[3] = (int) ((n - 10) * Math.cos(RAD * (t + 4)) + x0);
        yp[3] = h - (int) ((n - 10) * Math.sin(RAD * (t + 4)) + y0);
        g.setColor(c);
        g.fillPolygon(xp, yp, 4);
    }
    
    public static void main(String[] args) {
        new clock_demo1();
    }
}
View Code

2.clock_demo2.java

@SuppressWarnings("serial")
public class clock_demo2 extends JFrame {
    clock_demo2() {
        MyPanel1 my = new MyPanel1();
        this.add(my);
        Thread t = new Thread(my);
        t.start();
        /*
         * this.addMouseListener(new MouseAdapter() { public void
         * mouseExited(MouseEvent e) { System.exit(0); } });
         */
        // Frame 
        this.setTitle("DIVʱ��");
        this.setResizable(false);
        this.setAlwaysOnTop(true);
        this.setVisible(true);
        this.setSize(215, 240);
        this.setDefaultCloseOperation(3);
    }
    public static void main(String[] args) {
        //int x=0b10100012210;
        new clock_demo2();
    }
}

@SuppressWarnings("serial")
class MyPanel1 extends JPanel implements Runnable {
    double x1 = 105, y1 = 105, x2 = 105, y2 = 105, x3 = 105, y3 = 105;
    static double a, b, r, d;//
    Line2D.Double ld1, ld2, ld3, ld4, ld5, ld6, ld0, ldx1, ldx2, ldx3;//

    MyPanel1() {//
        this(0, 0, 200);
        this.setSize(200, 200);
        this.setBackground(new Color(200, 0, 200));
        this.setLayout(null);
        ld1 = new Line2D.Double(a - r, b, a + r, b);//
        ld2 = new Line2D.Double(a - (Math.sqrt(3) / 2) * r, b - r / 2, a//
                + (Math.sqrt(3) / 2) * r, b + r / 2);
        ld3 = new Line2D.Double(a - r / 2, b - (Math.sqrt(3) / 2) * r, a + r//5
                / 2, b + (Math.sqrt(3) / 2) * r);
        ld4 = new Line2D.Double(a, b - r, a, b + r);//6 12
        ld5 = new Line2D.Double(a + r / 2, b - (Math.sqrt(3) / 2) * r, a - r
                / 2, b + (Math.sqrt(3) / 2) * r);//1 7
        ld6 = new Line2D.Double(a - (Math.sqrt(3) / 2) * r, b + r / 2, a
                + (Math.sqrt(3) / 2) * r, b - r / 2);//2  8
    }

    @SuppressWarnings("static-access")
    MyPanel1(double a, double b, double d) {//(a,b)
        this.d = d;
        this.r = d / 2;
        this.a = a + r + 5;
        this.b = b + r + 5;
    }

    public void paint(Graphics g) {//
        super.paint(g);
        Graphics2D gg = (Graphics2D) g;
        Stroke stroke = new BasicStroke(2.0f);// 
        gg.setStroke(stroke);
        // System.out.println(a + " " + b + " " + r + " " + d);
        Ellipse2D.Double e = new Ellipse2D.Double(a - r, b - r, d, d);
        gg.draw(e);
        gg.draw(ld1);
        gg.draw(ld2);
        gg.draw(ld3);
        gg.draw(ld4);
        gg.draw(ld5);
        gg.draw(ld6);

        //
        g.setColor(new Color(200, 200, 200));
        g.fillOval((int) a - 90, (int) a - 90, 180, 180);//

        // 
        g.setColor(Color.BLACK);
        stroke = new BasicStroke(4.0f);
        gg.setStroke(stroke);
        ld0 = new Line2D.Double(a, b, a, b);
        gg.draw(ld0);
        
        // 
        g.setColor(Color.RED);
        stroke = new BasicStroke(4.0f);
        gg.setStroke(stroke);
        ldx1 = new Line2D.Double(x1, y1, a, b);
        gg.draw(ldx1);
        
        //
        g.setColor(new Color(0, 172, 86));
        stroke = new BasicStroke(2f);
        gg.setStroke(stroke);
        ldx2 = new Line2D.Double(x2, y2, a, b);
        gg.draw(ldx2);

        // 
        g.setColor(Color.BLUE);
        stroke = new BasicStroke(1.5f);
        gg.setStroke(stroke);
        ldx3 = new Line2D.Double(x3, y3, a, b);
        gg.draw(ldx3);

        // 
        g.setFont(new Font("华文新魏", Font.BOLD, 16));
        g.setColor(new Color(120, 40, 110));
        g.drawString("华农制作,我参考", 72, 140);
    }

    int hour, minute, second;
    double hour_r, minute_r, second_r;//

    public void run() {
        while (true) {
            try {
                Thread.sleep(1000);
                // 
                Calendar c = Calendar.getInstance();
                hour = c.get(Calendar.HOUR_OF_DAY+1);
                minute = c.get(Calendar.MINUTE);
                second = c.get(Calendar.SECOND);
                if (hour > 11) {
                    hour -= 12;
                }
                hour_r = r / 2;
                minute_r = r * 0.8;
                second_r = r;
                hourPack();
                minutePack();
                secondPack();
            } catch (InterruptedException e) {
                JOptionPane.showMessageDialog(null, e.toString());
            }
        }
    }

    //
    public void hourPack() {

        if (hour >= 0 && hour < 3) {
            x1 = a + (Math.sin(Math.toRadians(hour * 30))) * hour_r;
            y1 = b - (Math.cos(Math.toRadians(hour * 30))) * hour_r;
            repaint();
        } else if (hour >= 3 && hour < 6) {

            x1 = a + (Math.sin(Math.toRadians((3 - hour) * 30))) * hour_r;
            y1 = b + (Math.cos(Math.toRadians((3 - hour) * 30))) * hour_r;
            repaint();
        } else if (hour >= 6 && hour < 9) {
            x1 = a - (Math.cos(Math.toRadians((6 - hour) * 30))) * hour_r;
            y1 = b + (Math.sin(Math.toRadians((6 - hour) * 30))) * hour_r;
            repaint();
        } else {
            x1 = a - (Math.sin(Math.toRadians((12 - hour) * 30))) * hour_r;
            y1 = b - (Math.cos(Math.toRadians((12 - hour) * 30))) * hour_r;
            repaint();
            
        }
    }

    //
    public void minutePack() {
        if (minute >= 0 && minute < 15) {
            x2 = a + (Math.sin(Math.toRadians(minute * 6))) * minute_r;
            y2 = b - (Math.cos(Math.toRadians(minute * 6))) * minute_r;
            repaint();
        } else if (minute >= 15 && minute < 30) {

            x2 = a + (Math.sin(Math.toRadians((30 - minute) * 6))) * minute_r;
            y2 = b + (Math.cos(Math.toRadians((30 - minute) * 6))) * minute_r;
            repaint();
        } else if (minute >= 30 && minute < 45) {
            x2 = a - (Math.cos(Math.toRadians((45 - minute) * 6))) * minute_r;
            y2 = b + (Math.sin(Math.toRadians((45 - minute) * 6))) * minute_r;
            repaint();
        } else {
            x2 = a - (Math.sin(Math.toRadians((60 - minute) * 6))) * minute_r;
            y2 = b - (Math.cos(Math.toRadians((60 - minute) * 6))) * minute_r;
            repaint();

        }

    }

    //
    public void secondPack() {
        if (second >= 0 && second < 15) {
            x3 = a + (Math.sin(Math.toRadians(second * 6))) * r;
            y3 = b - (Math.cos(Math.toRadians(second * 6))) * r;
            repaint();
        } else if (second >= 15 && second < 30) {

            x3 = a + (Math.sin(Math.toRadians((30 - second) * 6))) * r;
            y3 = b + (Math.cos(Math.toRadians((30 - second) * 6))) * r;
            repaint();
        } else if (second >= 30 && second < 45) {
            x3 = a - (Math.cos(Math.toRadians((45 - second) * 6))) * r;
            y3 = b + (Math.sin(Math.toRadians((45 - second) * 6))) * r;
            repaint();
        } else {
            x3 = a - (Math.sin(Math.toRadians((60 - second) * 6))) * r;
            y3 = b - (Math.cos(Math.toRadians((60 - second) * 6))) * r;
            repaint();
        }
    }
}
View Code

3.clock_demo3.java

public class clock_demo3 extends javax.swing.JFrame{
 
    /**
     * Creates new form Clock
     */
    public clock_demo3(){
        initComponents();
        Calendar time = new GregorianCalendar();
        timeLable.setText(String.format("%2d:%02d:%02d", time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE), time.get(Calendar.SECOND)));
        new javax.swing.Timer(1000, new ActionListener(){
            public void actionPerformed(ActionEvent e){
                timePanel.repaint();
                Calendar time = new GregorianCalendar();
                timeLable.setText(String.format("%2d:%02d:%02d", time.get(Calendar.HOUR_OF_DAY), time.get(Calendar.MINUTE), time.get(Calendar.SECOND)));
            }
        }).start();
    }
 
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {
 
        timePanel = new ClockPanel();
        timeLable = new javax.swing.JLabel();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setResizable(false);
 
        timePanel.setPreferredSize(new java.awt.Dimension(350, 350));
 
        javax.swing.GroupLayout timePanelLayout = new javax.swing.GroupLayout(timePanel);
        timePanel.setLayout(timePanelLayout);
        timePanelLayout.setHorizontalGroup(
            timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 350, Short.MAX_VALUE)
        );
        timePanelLayout.setVerticalGroup(
            timePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 350, Short.MAX_VALUE)
        );
 
        timeLable.setFont(new java.awt.Font("΢���ź�", 0, 24)); // NOI18N
        timeLable.setText("12:00:00");
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(timePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addGroup(layout.createSequentialGroup()
                .addGap(121, 121, 121)
                .addComponent(timeLable, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(timePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(timeLable, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
 
        pack();
    }// </editor-fold>                        
 
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]){
        java.awt.EventQueue.invokeLater(new Runnable(){
            public void run(){
                new clock_demo3().setVisible(true);
            }
        });
    }
 
    // Variables declaration - do not modify                     
    private javax.swing.JLabel timeLable;
    private javax.swing.JPanel timePanel;
    // End of variables declaration                   
 
}
 
class ClockPanel extends JPanel{
 
    @Override
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawOval(25, 25, 300, 300);
        for (int i = 0; i < 60; i++){
            g.drawLine((int)(175 + 145 * Math.sin(i / 60.0 * 2 * Math.PI)), (int)(175 - 145 * Math.cos(i / 60.0 * 2 * Math.PI)),
                (int)(175 + 150 * Math.sin(i / 60.0 * 2 * Math.PI)), (int)(175 - 150 * Math.cos(i / 60.0 * 2 * Math.PI)));
        }
        GregorianCalendar time = new GregorianCalendar();
 
        g.setColor(Color.RED);
        double second = time.get(Calendar.SECOND);
        g.drawLine(175, 175, (int)(175 + 140 * Math.sin(second / 60 * 2 * Math.PI)), (int)(175 - 140 * Math.cos(second / 60 * 2 * Math.PI)));
        g.setColor(Color.BLUE);
        double minute = time.get(Calendar.MINUTE);
        g.drawLine(175, 175, (int)(175 + 100 * Math.sin(minute / 60 * 2 * Math.PI)), (int)(175 - 100 * Math.cos(minute / 60 * 2 * Math.PI)));
        g.setColor(Color.BLACK);
        double hour = time.get(Calendar.HOUR_OF_DAY);
        g.drawLine(175, 175, (int)(175 + 60 * Math.sin((hour + minute / 60) / 12 * 2 * Math.PI)), (int)(175 - 60 * Math.cos((hour + minute / 60) / 12 * 2 * Math.PI)));
    }
 
}
View Code

推荐阅读