Java时钟(实现扫秒及表盘替换)

来源:互联网 发布:吉首大学教务网络 编辑:程序博客网 时间:2024/05/01 02:48

先上个效果图
这里写图片描述

再贴上笔者的代码

import java.awt.BasicStroke;import java.awt.Color;import java.awt.Dimension;import java.awt.EventQueue;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.RenderingHints;import java.awt.Toolkit;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.Timer;import java.awt.Window.Type;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.geom.Line2D;import java.util.Calendar;class MyPanel extends JPanel {  private double flag = -1,x1 = 0, y1 = 0, x2 = 0, y2 = 0,x3,y3,x4,y4;  private String imgdz="1.jpg";  public String getImgdz() {    return imgdz;  }  public void setImgdz(String imgdz) {    this.imgdz = imgdz;  }  public double getFlag() {    return flag;  }  public void setFlag(double flag) {    this.flag = flag;  }  public double getX1() {    return x1;  }  public void setX1(double x1) {    this.x1 = x1;  }  public double getY1() {    return y1;  }  public void setY1(double y1) {    this.y1 = y1;  }  public double getX2() {    return x2;  }  public void setX2(double x2) {    this.x2 = x2;  }public double getY2() {    return y2;  }  public void setY2(double y2) {    this.y2 = y2;  }  public double getX3() {    return x3;  }  public void setX3(double x3) {    this.x3 = x3;  }  public double getY3() {    return y3;  }  public void setY3(double y3) {    this.y3 = y3;  }  public double getX4() {    return x4;  }  public void setX4(double x4) {    this.x4 = x4;  }  public double getY4() {    return y4;  }  public void setY4(double y4) {    this.y4 = y4;  }  public void paint(Graphics g1) {    Toolkit tool=Toolkit.getDefaultToolkit();    Graphics2D g = (Graphics2D) g1;    super.paint(g); // repaint后清除原图像    g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 抗锯齿    g.setStroke(new BasicStroke(1));    g.drawOval(100, 100, 200, 200);    Image img =tool.getImage("image/"+imgdz);    g.drawImage(img, 60, 60, 280,280,this);    for (int i = 0; i < 360; i = i + 6) {      g.setColor(Color.gray);      g.setStroke(new BasicStroke(2));      if (i % 90 == 0) {        g.setColor(Color.blue);        g.setStroke(new BasicStroke(7));        g.drawLine(200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85), 200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85));      } else if (i % 30 == 0) {        g.setColor(Color.orange);        g.setStroke(new BasicStroke(5));        g.drawLine(200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85), 200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85));      } else {        g.setColor(Color.gray);        g.drawLine(200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85), 200 + (int) (Math.cos(i * Math.PI / 180) * 85),                   200 + (int) (Math.sin(i * Math.PI / 180) * 85));      }    }    if (flag == 1) {      g.setColor(Color.PINK);      g.fillOval(190,190,20,20);      g.setStroke(new BasicStroke(7));      g.setColor(Color.gray);;      g.draw(new Line2D.Double(x1,y1,x4,y4));      g.setStroke(new BasicStroke(4));      g.setColor(Color.green);;      g.draw(new Line2D.Double(x1,y1,x3,y3));      g.setStroke(new BasicStroke(2));      g.setColor(Color.red);      g.draw(new Line2D.Double(x1,y1,x2,y2));      g.setColor(Color.green);      g.setStroke(new BasicStroke(5));      g.fillOval(195,195,10,10);    }  }}public class Clock {  private JFrame frame;  public static void main(String[] args) {    EventQueue.invokeLater(new Runnable() {      public void run() {        try {          Clock window = new Clock();          window.frame.setVisible(true);        } catch (Exception e) {          e.printStackTrace();        }      }    });  }  public Clock() {    initialize();  }  private void initialize() {    Dimension  scr=Toolkit.getDefaultToolkit().getScreenSize();    int frameh=420,framew=500,framey=(int)(scr.getHeight()/2-frameh/2),framex=(int)(scr.getWidth()/2-framew/2);    frame = new JFrame("钟表");    frame.setType(Type.UTILITY);    frame.setBounds(framex, framey, frameh, framew);    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    frame.setResizable(false);    MyPanel panel =new MyPanel();    frame.setContentPane(panel);    panel.setLayout(null);    JLabel label =new JLabel();    label.setBounds(80, 270, 300, 200);    panel.add(label);    panel.setBackground(Color.white);    Font f1=new Font("幼圆",1,22);   //字体显示    label.setFont(f1);    JMenuBar bar=new JMenuBar();    frame.setJMenuBar(bar);    JMenu shezhi=new JMenu("设置");    bar.add(shezhi);    JMenuItem beijing=new JMenuItem("选择表盘");    shezhi.add(beijing);    beijing.addActionListener(new ActionListener() {      public void actionPerformed(ActionEvent e) {        Object[] options = {"复古","卡通","朴素"};        int response=JOptionPane.showOptionDialog(frame, "选择需要的表盘", "表盘选择",JOptionPane.YES_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);        if(response==0)        {          panel.setImgdz("1.jpg");        }        else if(response==1)        {          panel.setImgdz("2.jpg");        }        else if(response==2)        {          panel.setImgdz("3.jpg");        }      }    });    JMenu bangzhu=new JMenu("帮助");    bar.add(bangzhu);    JMenuItem guanyu=new JMenuItem("关于");    bangzhu.add(guanyu);    guanyu.addActionListener(new ActionListener() {      public void actionPerformed(ActionEvent e) {        JOptionPane.showMessageDialog(frame, "软件名:精美时钟\n制作时间:2017年4月28日\n制作人:牧羊人907","版权信息",JOptionPane.PLAIN_MESSAGE);      }    });    Timer timer =new Timer(1,new ActionListener() {      public void actionPerformed(ActionEvent e) {        Calendar Cld = Calendar.getInstance();        panel.setFlag(1);        panel.setX1(200);        panel.setY1(200);        int s = Cld.get(Calendar.SECOND), ms = Cld.get(Calendar.MILLISECOND);        double x2, y2;        x2 = (200 + 80 * Math.sin((s + ms / 1000.0) * 2 * Math.PI / 60.0));        y2 = (200 - 80 * Math.cos((s + ms / 1000.0) * 2 * Math.PI / 60.0));        panel.setX2(x2);        panel.setY2(y2);        double x3, y3;        int m = Cld.get(Calendar.MINUTE);        x3 = (200 + 60 * Math.sin((m + s / 60.0 + ms / 60000.0) * 2 * Math.PI / 60.0));        y3 = (200 - 60 * Math.cos((m + s / 60.0 + ms / 60000.0) * 2 * Math.PI / 60.0));        panel.setX3(x3);        panel.setY3(y3);        double x4, y4;        int h = Cld.get(Calendar.HOUR);        x4 = (200 + 40 * Math.sin((h + m / 60.0 + s / 3600.0 + ms / 60 / 60000.0) * 2 * Math.PI / 12.0));        y4 = (200 - 40 * Math.cos((h + m / 60.0 + s / 3600.0 + ms / 60 / 60000.0) * 2 * Math.PI / 12.0));        panel.setX4(x4);        panel.setY4(y4);        int y = Cld.get(Calendar.YEAR), mo = Cld.get(Calendar.MONTH)+1, d = Cld.get(Calendar.DAY_OF_MONTH),            week = Cld.get(Calendar.DAY_OF_WEEK);        h = Cld.get(Calendar.HOUR_OF_DAY);        String weekz="";        switch (week-1) {        case 1:          weekz = "一";          break;        case 2:          weekz = "二";          break;        case 3:          weekz = "三";          break;        case 4:          weekz = "四";          break;        case 5:          weekz = "五";          break;        case 6:          weekz = "六";          break;        case 0:          weekz = "日";          break;        }        label.setText("<html><center>"+y + "年" + mo + "月" + d + "日 "+ "星期" + weekz + "</center><center>"+h + ":" + m + ":" + s+"</center></html>");        panel.repaint();      }    });    timer.start();  }}

笔者水平有限,很多地方处理可能不到位,下面对于扫秒功能的实现进行阐述:
众所周知,Graphics中的drawLine只能在整点(坐标均为整数)间画线,而这并不能满足扫秒的要求,故我们需要借助Graphics2D中的draw( Line2D.Double(double x1, double y1, double x2, double y2) ),这满足了我们在非整点间画线的要求,其次,我们通过计算可得到指针在某时刻的位置,这里注意,我们需要用Calendar类进行毫秒的获取,若获得的时间仅精确到秒,则结果还是一秒一秒地跳,而并非扫秒,其他细节就请分析我的源代码吧

下面把我这个项目的所有文件的下载地址给出
链接:http://pan.baidu.com/s/1eRRWQA2 密码:wbln

0 0
原创粉丝点击