JAVA简单转盘时钟
JavaScript实现简单钟表时钟

JavaScript实现简单钟表时钟本⽂实例为⼤家分享了JavaScript实现简单钟表时钟的具体代码,供⼤家参考,具体内容如下效果图:主要思想:1.先画⼀个圆表盘。
2.再⽤js循环画刻度(每⼀个刻度都是li标签)。
3.再画时分秒指针。
4.再⽤JS让指针动起来。
代码中有详细的注释可以直接看代码。
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title></head><body><style id="style">ul{list-style: none;}#circle{width: 200px;height: 200px;border-radius: 100px;border: 1px solid black;}#kedu li{width: 1px;height: 6px;border-radius: 10px;background-color: black;transform-origin: center 101px;/*设置li标签的旋转中⼼和旋转半径。
*/position: absolute;left: 109px;top: 9px;}#kedu li:nth-of-type(5n+1){height: 12px;width: 2px;}/* 秒针的绘制,⽤transform把div绘制成线条,后⾯的指针都是在这样。
java 模拟时钟问题

java 模拟时钟问题编写的JA V A动态模拟时钟,结果每次都走三个格(就相当于1s走了3s的时间)import java.applet.Applet;import java.awt.Color;import java.awt.Graphics;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;public class ClockApplet extends Applet implements Runnable //Applet支持线程{private Thread athread; //线程private SimpleDateFormat sdateformat; //日期格式public void init(){this.setBackground(Color.white);this.athread = null;}public void paint(Graphics g){this.sdateformat = new SimpleDateFormat("hh时mm分ss秒");g.drawString(this.sdateformat.format(new Date()),25,131);Calendar rightnow = Calendar.getInstance();int second = rightnow.get(Calendar.SECOND);int minute = rightnow.get(Calendar.MINUTE);int hour = rightnow.get(Calendar.HOUR);//半径int R_H = 20,R_M = 4,R_S = 4;//时针的坐标//x ====(9-3)[0-6] (3-9)[6-0]//y ====(12-6)[0-6] (6-12)[6-0]int H_x ;int H_y;//xif(hour == 0){hour = 12;}if( hour >= 3 && hour <= 9 ){H_x = R_H*Math.abs(hour - 9);}else{if(hour > 9){H_x = R_H*Math.abs(hour - 9);}else{H_x = R_H*Math.abs(hour+3);}}//yif( hour >= 6 && hour <= 12 ){H_y = R_H*Math.abs(hour - 12);}else{H_y = R_H*hour;}//分针的坐标int M_x;int M_y;if(minute == 0){minute = 60;}if( minute >= 15 && minute <= 45 ){M_x = R_M*Math.abs(minute - 45); }else{if(minute > 45){M_x = R_M*Math.abs(minute - 45);}else{M_x = R_M*Math.abs(minute+15);}}//yif( minute >= 30 && minute < 60 ){M_y = R_M*Math.abs(minute - 60);}else{M_y = R_M*minute;}//秒针的坐标int S_x;int S_y;if(second == 0){second = 60;}if( second >= 15 && second <= 45 ){S_x = R_S*Math.abs(second - 45);}else{if(second > 45){S_x = R_S*Math.abs(second - 45);}else{S_x = R_S*Math.abs(second+15);}}//yif( second >= 30 && second <= 60 ){S_y = R_S*Math.abs(second - 60);}else{S_y = R_S*second;}// g.drawString(String.valueOf(second),25,50);// g.drawString(String.valueOf(minute),25,60);// g.drawString(String.valueOf(hour),25,70);// g.drawString(String.valueOf(H_x),25,80);// g.drawString(String.valueOf(H_y),25,90);g.drawOval(0,0,120,120);//距离相差10像素g.setColor(Color.darkGray);g.drawString("9",5,65);g.drawString("3",110,65);g.drawString("12",55,15);g.drawString("6",55,115);g.drawString("1",80,20);g.drawString("2",100,40);g.drawString("4",100,90);g.drawString("5",80,110);g.drawString("7",30,110);g.drawString("8",10,90);g.drawString("10",10,40);g.drawString("11",30,20);g.setColor(Color.red);g.drawLine(60,60,H_x,H_y);//前一个点表示起点,另一个表示终点g.setColor(Color.blue);g.drawLine(60,60,M_x,M_y);g.setColor(Color.yellow);g.drawLine(60,60,S_x,S_y);}public void start(){if(athread == null){athread = new Thread(this);athread.start();}}public void stop(){if(athread != null){athread.interrupt();athread = null;}}public void run(){while(athread != null){repaint();try{athread.sleep(1000);}catch(InterruptedException e){}}}}。
用JAVA实现一个时钟

⽤JAVA实现⼀个时钟⽤JAVA实现⼀个时钟⽤图形库绘制表盘,然后⽤事件处理机制刷新窗⼝,反复重绘,让表针转动起来import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.geom.*;import java.awt.geom.Line2D.Double;import java.math.*;import java.time.LocalTime;public class MyClock {public static void main(String[] args) {// TODO Auto-generated method stubActionListener listener = new TimerClock();Timer t = new Timer(1000, listener);t.start();//System.exit(0);}}class ClockWindow extends JFrame {ClockWindow() {add(new ClockInfo());pack();}}class ClockInfo extends JComponent {private static final int DEFAULT_WIDTH = 500;private static final int DEFAULT_HEIGHT = 500;public void paintComponent(Graphics g) {Graphics2D g2 = (Graphics2D) g;g2.draw(new Ellipse2D.Double(50.0, 50.0, 400.0, 400.0));//圆⼼为250, 250//绘制⼩时刻度g2.setPaint(Color.red);double r1 = 190, r2 = 200;double cx = 250.0, cy = 250.0;for(double i = 0; i < 2.0 * Math.PI; i += (Math.PI / 6.0)) {double lx, ly, rx, ry;lx = r1 * Math.sin(i);ly = r1 * Math.cos(i);rx = r2 * Math.sin(i);ry = r2 * Math.cos(i);g2.draw(new Line2D.Double(cx + lx, cy - ly, cx + rx, cy - ry));}//绘制分钟刻度r1 = 195.0;for(double i = 0; i < 2.0 * Math.PI; i += (Math.PI / 30.0)) {double lx, ly, rx, ry;lx = r1 * Math.sin(i);ly = r1 * Math.cos(i);rx = r2 * Math.sin(i);ry = r2 * Math.cos(i);g2.draw(new Line2D.Double(cx + lx, cy - ly, cx + rx, cy - ry));}//绘制指针double hour = LocalTime.now().getHour() * Math.PI / 6.0;double minute = LocalTime.now().getMinute() * Math.PI / 30.0;double second = LocalTime.now().getSecond() * Math.PI / 30.0;//时针g2.setPaint(Color.black);g2.setStroke(new BasicStroke(4.0f));g2.draw(new Line2D.Double(cx, cy, cx + 120.0 * Math.sin(hour), cy - 120.0 * Math.cos(hour)));//分针g2.setPaint(Color.green);g2.setStroke(new BasicStroke(2.0f));g2.draw(new Line2D.Double(cx, cy, cx + 140.0 * Math.sin(minute), cy - 140.0 * Math.cos(minute)));//秒针g2.setPaint(Color.red);g2.setStroke(new BasicStroke(1.0f));g2.draw(new Line2D.Double(cx, cy, cx + 160.0 * Math.sin(second), cy - 160.0 * Math.cos(second)));//⽂字Font f = new Font("Serif", Font.PLAIN, 30);//逻辑字体g2.setFont(f);g2.setColor(Color.orange);int h = LocalTime.now().getHour();int m = LocalTime.now().getMinute();int s = LocalTime.now().getSecond();g2.drawString("" + h + ":" + m + ":" + s,10,50);}public Dimension getPreferredSize() {return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); }}class TimerClock implements ActionListener {ClockWindow frame;TimerClock() {frame = new ClockWindow();frame.setTitle("MyClock");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubframe.repaint();}}。
利用JAVA实现一个时钟的小程序

JAVA课程项目报告项目题目:利用JAVA实现一个小时钟的程序专业班级:10软件工程利用JAVA实现一个时钟的小程序1.软件开发的需求分析在当今的信息时代,时钟已经成为人们生活中必不可少的应用工具,Java语言是当今流行的网络编程语言,它具有面向对象、与平台无关、安全、多线程等特点。
使用Java 语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的、嵌入式设备进行应用程序的开发。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。
为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼我们熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。
此次课程设计的题目为简单的小时钟程序设计,通过做巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDK、JCreator等开发工具的运用,拓宽常用类库的应用。
使我们通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。
2.具体实现2.1设计思路Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。
Java去掉了C++语言的许多功能,让Java的语言功能很精炼,并增加了一些很有用的功能,如自动收集碎片。
这将减少平常出错的50%。
而且,Java很小,整个解释器只需215K的RAM。
因此运用JAVA程序编写小时钟程序,实现简单显示时间的功能。
本次课程设计做的是Java简单小时钟,它是图形界面、线程、流与文件等技术的综合应用,其界面主要采用了java.awt包,javax.swing包等。
程序实现了小时钟的基本功能。
2.2设计方法在设计简单小时钟时,需要编写5个Java源文件:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
java简易电子时钟代码Word版

import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.text.SimpleDateFormat;public class ClockJFrame extends JFrame{private Date now=new Date();Panel buttons=new Panel();Button button_start=new Button("启动");Button button_interrupt=new Button("停止");Clock label=new Clock();public ClockJFrame() //构造方法{super("电子时钟");this.setBounds(300,240,300,120);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setLayout(new BorderLayout());this.getContentPane().add("North",label);//初始化一个容器,用来在容器上添加一个标签this.getContentPane().add("South",buttons);buttons.setLayout(new FlowLayout());buttons.add(button_start);buttons.add(button_interrupt);setVisible(true);}private class Clock extends Label implements ActionListener,Runnable{ private Thread clocker=null;private Date now=new Date();public Clock(){button_start.addActionListener(this);button_interrupt.addActionListener(this);SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");//可以方便地修改日期格式String t = dateFormat.format( now );this.setText(t);}public void start(){if(clocker==null){clocker=new Thread(this);clocker.start();}}public void stop(){clocker=null;}public void run(){Thread currentThread=Thread.currentThread();while(clocker==currentThread){now=new Date();SimpleDateFormat dateFormat = newSimpleDateFormat("HH:mm:ss");//可以方便地修改日期格式String t = dateFormat.format( now );this.setText(t);try{clocker.sleep(1000);}catch(InterruptedException ie){JOptionPane.showMessageDialog(this,"Thread error:+ie");}}}public void actionPerformed(ActionEvent e){if (e.getSource()==button_start) {clocker = new Thread(this); //重新创建一个线程对象clocker.start();button_start.setEnabled(false);button_interrupt.setEnabled(true);}if (e.getSource()==button_interrupt) //单击中断按钮时{clocker.stop(); //设置当前线程对象停止标记button_start.setEnabled(true);button_interrupt.setEnabled(false);}}}//内部类结束public static void main(String[] args) {ClockJFrame time=new ClockJFrame();}}运行结果:。
Java模拟时钟制作案例

美化指针
调用AffineTransform
public AffineTransform sc =new AffineTransform(); sc.setToRotation(Math.PI/30f*(s1-15),125,125); g2.fill(tick_s.createTransformedShape(sc));
程序代码
主类
程序代码
程序代码
运行效果
运行效果
面板刻度
绘制刻度
l1=new Line2D.Double[60]; for(int i=0 ;i<l1.length;i++) { double b[]=new double[4]; int j; if(i%5==0){ if(i%15==0){ j=50; }else { j=60; }
运行效果程序代码程序代码程序代码程序代码程序代码代码优化与改进以上的代码已经能基本完成时钟的功能
Java模拟时钟制 作案例
Java开发实例
需求分析
模拟时钟,把它放在程序中可以给人一种清 新的感觉。比起数字时钟来说,有一定的真 实感怀旧情结。看到秒针一下一下的转动, 时时提醒,时间在不断流逝,要我们珍惜时 间。 子在川上曰:逝者如斯夫。
坐标的转换,使用方法
调用方法:
p0=xy(125,125,75,s1*6); s.x1=p0.getX(); s.y1=p0.getY(); p0=xy(125,125,65,m1*6); m.x1=p0.getX(); m.y1=p0.getY(); p0=xy(125,125,55,(h1*30+m1/2f)); h.x1=p0.getX(); h.y1=p0.getX();
JAVA可视化闹钟源码

JAVA可视化闹钟源码概述⼀些同学的Java课设有这样⼀个问题,⽐较感兴趣就做了⼀下功能介绍:1、可增加闹钟2、可删除闹钟3、时间到了响铃4、关闭闹钟不会丢失闹钟(因为闹钟存储在txt⽂件中,不会因程序关闭就终⽌)缺点1、没有使⽤多线程,闹钟响起时只能等待1分钟或者关闭程序2、界⾯设计不够美观,后期有时间会进⾏修改,重新设计3、没有闹钟修改的功能,虽然可以通过增删来达到修改的⽬的,但功能仍然属于空缺范围1package Clock;23import sun.audio.AudioPlayer;4import sun.audio.AudioStream;56import javax.swing.*; //awt和swing是做界⾯⽤的类7import java.awt.*;8import java.awt.event.ActionEvent;9import java.awt.event.ActionListener;10import java.awt.event.WindowAdapter;11import java.awt.event.WindowEvent;12import java.io.*; //io流⽤于读写⽂件,包括增删闹钟、打开铃声等等13import java.util.Calendar; //⽤于获取当前时间的类14import java.util.GregorianCalendar;//标准阳历15import java.util.StringTokenizer; //读取⽂件转换成计算机语⾔⽤的类16/*171 计时器18要求1:⼀个带有可视化界⾯的钟表。
19要求2:可以添加若⼲个闹钟。
20要求3:具备持久化功能,关闭程序不能丢失闹钟。
21要求4:闹钟是可编辑,可删除的。
2223实现:先创建⼀个⾯板显⽰闹钟,⾯板内创建按钮增加闹钟,按钮查看闹钟,按钮删除闹钟24线程间隔1s读取时间和闹钟⽐较2526*/27public class ClockTry extends JFrame implements Runnable {28/* 成员变量 */29private JPanel xx; //总的⾯板30private JComboBox ho; //hour选择时间的下拉框31private JComboBox mi; //min选择分钟的下拉框32private JButton tjnz; //添加闹钟的按钮33private JButton schour; //删除闹钟的按钮34private String filename = "D://homework//java//Gui//src//Clock//0.wav"; //所有的路径改这两个地⽅就可以了35private String pathname = "D://homework//java//Gui//src//Clock//nz.txt"; // 绝对路径或相对路径都可以,写⼊⽂件时演⽰相对路径,读取以上路径的input.txt⽂件3637private int HOUR; //定义HOUR⽤于接收按钮按下从下拉框中获取的数据38private int MIN; //同上3940int x = 100, y = 100, r = 100; // (x,y)为(0,0)点,表⽰原点41int h, m, s; // 时,分,秒42double rad = Math.PI / 180; // 1°4344private String[][] str= new String[100][2]; //定义⼆维数组,⽤于存储以及对⼩时和分针的操作,暂定为100个闹钟于是定义为【100】【2】45/**46 *读取⽂件,每次的增删都需要对数据进⾏读取,将数据写在⾯板上也需要读取数据47*/48public void readFile() {49try (FileReader reader = new FileReader(pathname); //创建⼀个FilReader对象,将⽂件读出来,相当于请教⼀个当地⼈,当地⼈了解本地⽂化,但是语⾔不通听不懂50 BufferedReader br = new BufferedReader(reader) // 建⽴⼀个对象,它把⽂件内容转成计算机能读懂的语⾔,相当于请⼀个翻译,把当地⼈读取的东西转换成计算机能懂的东西51 ) {52 String line;5354int i =0;55while ((line = br.readLine()) != null) { //翻译理解的东西存到line⾥⾯56int j =0;57 StringTokenizer st = new StringTokenizer(line, ":"); //重点:由于存储数据时都是时间,道理来说都是数字,⽆法区分⼩时部分和分钟部分58while (st.hasMoreTokens()){ //每读取⼀次读到的内容 //所以这⾥⽤分割符“:”来分割,相应的,后⾯的写⼊⽂件也应该已“:”分割进⾏写⼊59 str[i][j]=st.nextToken(); //把读到的内容存储在数组⾥⾯便于后⾯的操做——增删60 j++; //包括上⾯的j=0,是将for循环拆分放进while循环中,要不然循环写起来也很⿇烦61 }62//System.out.print(str[i][0]+":"+str[i][1]); 写的时候⽤来在控制台打印查看效果63//System.out.println();64 i++;65 j = 0;66 }67 } catch (IOException e) {68 e.printStackTrace(); //try……catch抛出异常69 }70 }717273/**74 * 写⼊TXT⽂件75*/76public void writeFile() {77 HOUR = Integer.valueOf(ho.getSelectedIndex()); //获取下拉框中的值,存储到HOUR中78 MIN = Integer.valueOf(mi.getSelectedIndex());79 String x = HOUR + ":" + MIN;80try (FileWriter writer = new FileWriter(pathname,true); //同上⾯的读取,本地⼈写⼊,注意:后⾯的append:true是表⽰不是重新写,⽽是在后⾯追加81 BufferedWriter out = new BufferedWriter(writer) //翻译⼀下再写⼊82 ) {8384 out.write(HOUR + ":" + MIN + "\r\n"); //这⾥写⼊的时候把:写进去了!85 out.flush(); // 把缓存区内容压⼊⽂件,计算机的存储过程,存在缓存区再写⼊⽂件86 JOptionPane.showMessageDialog(null,"闹钟添加成功!","添加闹钟提醒",RMATION_MESSAGE); //提⽰框:添加闹钟成功87 } catch (IOException e) {88 e.printStackTrace();8990 }9192 }939495/**96 * 删除闹钟,实际上是先将要删除的数据找到移除数组,再将数组重新写⼊,所以要先读取⽂件,再重新写⼊97*/98public void shanchuFile() {99 HOUR = Integer.valueOf(ho.getSelectedIndex());100 MIN = Integer.valueOf(mi.getSelectedIndex());101try (FileWriter writer = new FileWriter(pathname); //没有append:true,表⽰重新写!102 BufferedWriter out = new BufferedWriter(writer)103 ) {104 readFile();105for (int i = 0; i < 100; i++) {106if (Integer.valueOf(str[i][0])==HOUR && Integer.valueOf(str[i][1])==MIN){107continue;108 }109else{110 out.write(str[i][0]+":"+str[i][1]+"\r\n"); // \r\n即为换⾏111 }112 }113114//out.write("1"+"1"+"\r\n"); // \r\n即为换⾏115 out.flush(); // 把缓存区内容压⼊⽂件116 } catch (IOException e) {117 e.printStackTrace();118 }catch (NumberFormatException e){119 System.out.println("this isn't exist!");120 JOptionPane.showMessageDialog(null,"该闹钟已删除!","删除闹钟提醒",RMATION_MESSAGE); //弹窗提⽰121 }122 }123124/* 初始化函数 */125public void init() {126127 Calendar now = new GregorianCalendar(); //获取当前时间128/*129 * GregorianCalendar(标准阳历)130 * 是Calendar(⽇历)【国际环境下都能运⾏的程序】131 * 的⼦类132*/133 s = now.get(Calendar.SECOND) * 6; // 秒针转换成⾓度:1秒,秒针动⼀次,转动6°134 m = now.get(Calendar.MINUTE) * 6; // 分针转换为⾓度:1分,分针动⼀次,转动6°135 h = now.get(Calendar.HOUR) * 30 + now.get(Calendar.MINUTE) / 12 * 6; // 先把分化为⼩时,再乘以6°,因为分针转12°,时针才会转1°,⼀⼩时中间有5格,数学问题136/*137 * Calendar.HOUR 显⽰范围:1-12(⽆论AM还是PM) Calendar.HOUR_OF_DAY 显⽰范围:1-24(包括PM138*/139140 Thread t = new Thread(this); //添加线程,线程⽬标是整个程序,this141 t.start(); //线程就绪142 }143144public void paint(Graphics g) { //awt中的⽅法,因为要时时显⽰闹钟,所以不得不使⽤绘画的⽅式,不断重绘145super.paint(g);146/*147 * paint(g)函数会重绘图像,要加上super.paint(g),表⽰在原来图像的基础上,再画图。
Java 桌面小时钟

Java 桌面小时钟一:简介:Java桌面小时钟制作过程:从网上收集可用的表盘、时针、分针、秒针图片,用Photoshop CS5进行修剪,在eclipse上利用Java绘图技术将图片加载在一个JPanel上,其中时针分针秒针按获取到的日期和计算公式进行旋转。
JPanel放在JFrame上,并将窗口设置为不规则形状。
后期为时钟添加事件响应,双击时关闭,鼠标位于窗口上时鼠标形状变为手型,窗口可拖拽。
鼠标悬停在时钟上时,可提示当前的年月日等信息。
程序运行结果如下:难点:本程序主要是控制时针分针秒针图片的旋转,从而实现时钟走动的效果。
但是在控制图片旋转的过程中遇到一个难题。
旋转后的图片会有锯齿现象,这回影响到程序的界面外观,解决办法是利用Java2D类的渲染参数,把渲染级别提高。
关键代码如下:// 获取绘图上下文的副本Graphics2D g1 = (Graphics2D) g.create();// 设置绘图上下文以质量为主,绘制图片,这样可以避免图片旋转时的锯齿g1.setRenderingHint(RenderingHints.KEY_RENDERING,RenderingHint s.VALUE_RENDER_QUALITY);二:类详解:MainFrame类本程序主类名称是MainFrame,它继承Jframe类成为一个窗体类。
在该类的构造方法中对窗体进行了初始化,为窗体控件进行了布局,并添加了必要的事件监听器。
关键代码如下:public MainFrame() {super();setAlwaysOnTop(true);setResizable(false);// 禁止调整窗体大小setUndecorated(true);//不装饰setShape(new Ellipse2D.Double(0, 0, 226, 224));//设置为圆形窗口setBounds(100, 100, 226, 224);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置鼠标为手型setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));// 创建自定义面板对象final ImagePanel imagePanel = new ImagePanel();// 添加面板对象到窗体getContentPane().add(imagePanel, BorderLayout.CENTER);// 为鼠标面板添加鼠标事件监听器imagePanel.addMouseListener(new MouseAdapter() {Public void mousePressed(final MouseEvent e) {fp = e.getPoint();}public void mouseClicked(MouseEvent e) {if (e.getClickCount() == 2) {System.exit(0);}}});// 为时钟面板的鼠标拖动事件中移动窗体imagePanel.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(final MouseEvent e) {JFrame frame = (JFrame) getRootPane().getParent();Point point = e.getLocationOnScreen();frame.setLocation(point.x - fp.x, point.y - fp.y);}});Thread imageThread = new Thread(imagePanel);imageThread.start();// 启动线程}ImagePanel类继承JPanel类编写一个自定义的面板控件,该控件类的名称为ImagePanel,作为本程序的背景面板,支持背景图片及时针、分针、秒针的旋转,图片的旋转是通过线程实现的,并且线程要控制旋转速度与时间。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
package shiyan;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class shizhong extends JFrame{
public shizhong()
{ //窗体的设置
// Font jf = new Font(null,Font.BOLD,30);
// this.setFont(jf);
this.setTitle("时钟");
ClockPanel jp_clock = new ClockPanel();
this.add(jp_clock);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(400, 400);
this.setVisible(true);
//线程的设置及启动
Thread ClockRun = new Thread(jp_clock);
ClockRun.start();
}
public static void main(String[] args) {
new shizhong();
}
}
class ClockPanel extends JPanel implements Runnable
{
//表的中间
private double CenterX,CenterY;
private double Radius = 150;
//小时,分钟,秒的针头坐标
private double HPointX,HPointY,MPointX,MPointY,SPointX,SPointY;
private int Year,Month,Day,WeekDay,Hour,Minute,Second;
private final double PI = Math.PI;
public synchronized void paintComponent(Graphics g)
{
super.paintComponent(g);
CenterX = this.getWidth()/2;
CenterY = this.getHeight()/2;
double HRadian = (PI/6)*Hour + (PI/360)* Minute + (PI/21600)* Second;
double MRadian = (PI/30)*Minute + (PI/1800) * Second;
double SRadian = (PI/30)* Second;
HPointX = CenterX + Radius * 0.6 * Math.sin(HRadian);
HPointY = CenterY - Radius * 0.6 * Math.cos(HRadian);
MPointX = CenterX + Radius * 0.8 * Math.sin(MRadian);
MPointY = CenterY - Radius * 0.8 * Math.cos(MRadian);
SPointX = CenterX + Radius * Math.sin(SRadian);
SPointY = CenterX - Radius * Math.cos(SRadian);
g.drawOval((int)(CenterX - Radius), (int)(CenterY - Radius),(int)(2*Radius),(int)(2*Radius));
g.drawString("12",(int)(CenterX),(int)(CenterY - Radius) + 10 );
g.drawString("3", (int)(CenterX + Radius)- 6,(int)(CenterY));
g.drawString("6", (int)(CenterX),(int)(CenterY + Radius));
g.drawString("9", (int)(CenterX - Radius),(int)(CenterY) );
g.drawLine((int)(CenterX),(int)(CenterY),(int)(SPointX),(int)(SPointY));
g.drawLine((int)(CenterX),(int)(CenterY),(int)(MPointX),(int)(MPointY));
g.drawLine((int)(CenterX),(int)(CenterY),(int)(HPointX),(int)(HPointY));
g.drawString("星期" + WeekDay, 30, 320);
g.drawString(Year + " 年" + Month + " 月" + Day + " 日" + Hour + ":" + Minute + ":" + Second, 20, 350);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true)
{
try{
setCurrentTime();
repaint();
Thread.sleep(1000);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
public void setCurrentTime()
{
//获得时间
Calendar calendar = new GregorianCalendar();
Year = calendar.get(Calendar.YEAR);
Month = calendar.get(Calendar.MONTH);
Day = calendar.get(Calendar.DAY_OF_MONTH);
WeekDay = calendar.get(Calendar.DAY_OF_WEEK);
Hour = calendar.get(Calendar.HOUR);
Minute = calendar.get(Calendar.MINUTE);
Second = calendar.get(Calendar.SECOND);
}
}。