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
- Java时钟(实现扫秒及表盘替换)
- 手机时钟(加了表盘)代码
- 时钟表盘代码
- 时钟表盘代码
- 图形界面 时钟表盘
- CSS3简易表盘时钟
- iOS原生扫码实现及原理
- 绘制模拟Android钟 ####时钟表盘
- Js版带表盘的时钟
- 自定义时钟View,表盘的绘制
- Android自定义View及canvas(表盘实例)
- java实现二维码扫码下载APP
- java实现扫二维码下载APP
- JAVA实现二维码扫码登录
- Java实现扫码二维码登录
- Java实现扫码二维码登录
- java实现手机扫二维码登陆
- Linux 时钟(微妙,纳秒)
- 编写一个完整的java程序——Complex
- 【JavaScript】01入门
- Java-关联源码
- Spring之事务管理
- JVM调优总结(四)-垃圾回收面临的问题
- Java时钟(实现扫秒及表盘替换)
- 车牌识别系统研发的必要性
- SSH登陆Ubuntu
- 最优布线
- 使用栈结构简易实现浏览器的后退与前进功能(以Android为例)
- Oracle分页查询的提升阶段
- shell变量计算长度及加减运算方法总结
- 1
- SLA by Short brain-Apr-2017