Java实现迷你小闹钟源代码
- 格式:docx
- 大小:16.10 KB
- 文档页数:6
JavaFX实现简易时钟效果本⽂实例为⼤家分享了JavaFX实现简易时钟效果的具体代码,供⼤家参考,具体内容如下⾸先要在⾯板中显⽰⼀个时钟,我们可以设计⼀个ClockPane类来显⽰⼀个时钟。
最终效果:若要绘制⼀个时钟,需要绘制⼀个圆并为秒钟、分钟和⼩时绘制三个指针。
为了画⼀个指针,需要确定⼀条直线的两端:⼀端是时钟的中央,位于(centerX,centerY);另外⼀端位于(endX,endY),由⼀下公式来确定:endX=centerX+handLength×sin(θ) endY=centerY-handLength×cos(θ)(其中θ是指针和竖直⽅向12点的夹⾓)因为⼀分钟有60秒,所以第2个指针的⾓度是:second×(2π/60)分钟的位置由分钟和秒钟来决定。
包含秒数的确切分钟数是minu+second/60。
例如,如时间是3分30秒,那么总的分钟数就是3.5。
由于⼀⼩时有60分钟,因此分针的⾓度是: (minute+second/60)×(2π/12)由于⼀个圆被分为12个⼩时,所以时针的⾓度是: (hour+minute/60+second/(60×60))×(2π/12)为了简化计算,在计算分针和时针⾓度的时候,可以忽略秒针,因为它们数字太⼩,基本可以忽略。
因此,秒针、分针以及时针的端点可以如下计算:secondX = centerX + secondHandLength × sin(second × (2π/60))secondY = centerY - secondHandLength × cos(second × (2π/60))minuteX = centerX + minuteHandLength × sin(minute × (2π/60))minuteY = centerY - minuteHandLength × cos(minute × (2π/60))hourX = centerX + hourHandLength × sin((hour+minute/60) × (2π/12))hourX = centerX + hourHandLength × sin((hour+minute/60) × (2π/12))这样就得到了ClockPane类的实现程序:package pany;import yout.Pane;import javafx.scene.paint.Color;import javafx.scene.shape.Circle;import javafx.scene.shape.Line;import javafx.scene.text.Text;import java.util.Calendar;import java.util.GregorianCalendar;public class ClockPane extends Pane{private int hour;private int minute;private int second;private double w=250,h=250;public ClockPane() {setCurrentTime();}public ClockPane(int hour,int minute,int second) {this.hour=hour;this.minute=minute;this.second=second;paintClock();}public int getHour() {return hour;}public void setHour(int hour) {this.hour=hour;paintClock();}public int getMinute() {return minute;}public void setMinute(int minute) {this.minute=minute;paintClock();}public int getSecond() {return second;}public void setSecond(int second) {this.second=second;paintClock();}public double getW() {return w;}public void setW(double w) {this.w=w;paintClock();}public double getH() {return h;}public void setH(double h) {this.h=h;paintClock();}public void setCurrentTime() {Calendar calendar=new GregorianCalendar();this.hour=calendar.get(Calendar.HOUR_OF_DAY);this.minute=calendar.get(Calendar.MINUTE);this.second=calendar.get(Calendar.SECOND);paintClock();}protected void paintClock() {double clockRadius=Math.min(w,h)*0.8*0.5;double centerX=w/2;double centerY=h/2;Circle circle=new Circle(centerX,centerY,clockRadius);circle.setFill(Color.WHITE);circle.setStroke(Color.BLACK);Text t1=new Text(centerX-5,centerY-clockRadius+12,"12");Text t2=new Text(centerX-clockRadius+3,centerY+5,"9");Text t3=new Text(centerX+clockRadius-10,centerY+3,"3");Text t4=new Text(centerX-3,centerY+clockRadius-3,"6");double sLength=clockRadius*0.8;double scondX=centerX+sLength*Math.sin(second*(2*Math.PI/60)); double scondY=centerY-sLength*Math.cos(second*(2*Math.PI/60)); Line sline=new Line(centerX,centerY,scondX,scondY);sline.setStroke(Color.RED);double mLength=clockRadius*0.65;double minuteX=centerX+mLength*Math.sin(minute*(2*Math.PI/60)); double minuteY=centerY-mLength*Math.cos(minute*(2*Math.PI)/60); Line mline=new Line(centerX,centerY,minuteX,minuteY);mline.setStroke(Color.BLUE);double hLength=clockRadius*0.5;double hourX=centerX+hLength*Math.sin((hour%12+minute/60.0)*(2*Math.PI/12));double hourY=centerY-hLength*Math.cos((hour%12+minute/60)*(2*Math.PI/12));Line hline=new Line(centerX,centerY,hourX,hourY);hline.setStroke(Color.GREEN);getChildren().clear();getChildren().addAll(circle,t1,t2,t3,t4,sline,mline,hline);}}对程序的简要解读:①Java API的GregorianCalendar类可以使⽤它的⽆参构造⽅法来商城⼀个具有当前时间的Calendar实例。
Java 设计报告书课程名称:JAVA语言程序设计设计题目:闹钟的设计与实现院系:计算机科学与信息工程系学生姓名:学号:专业班级:指导教师:许研2010 年12 月28 日目录一、题目描述 (1)二、设计思路 (1)三、运行结果 (5)四、源代码 (6)五、总结 (10)六、参考文献 (10)闹钟的设计与实现一、题目描述:结合JAVA图形界面的知识设计一个闹钟二、设计思路1、设计要求:编写闹钟钟程序,要求画出时钟面板,动态的显示当前时间,可设定或解除闹钟时间,并提供闹钟服务相应的文字提示功能与可以自己选择闹钟提示声音提示功能,并在闹钟设定的输入框中有简单的排错功能。
2、算法基本描述:本程序先是在框架中新建了一个容器,然后用GridLayout类对面板进行划分,程序引入java.util.Date来显示当前时间,并用一个永真循环,来对当前时间显示的更新,引入java.io.File来实现对文件的读写操作,程序设计了一个选择按钮,用来选择文件,并且声明只能选择,WAU、MID的文件,引入用java.applet.Applet 来播放音乐文件,用getText()函数获取输入的闹钟设定时间,并永真循环和当前的时间进行对比,若相等则播放音乐,若不相等则显示离目标设定时间的差距。
3、设计思想与内容1、画出类的UML简图Clock类:Clock类中的变量ri, shi, fen, miao, dangqian, guanji: JLabe lqueding, dakai: JButtonmusic, RI, SHI, FEN, MIAO: JTextFieldh = 0, f = 0, m = 0, r = 0 :intFo, foo: booleansoumd1: public AudioClipClock类中的函数public clock()public static void main(String agrs[])public void run()2、各方法功能描述列表Clock类方法功能Main()执行main函数Clock()Clock类的构造函数,用于对时钟界面的初始化Run()用于对时钟的动态显示的执行,并判断是否设定了闹钟时间,若当前时间与设定的时间相等则播放选定的音乐3、主要模块算法描述(1)当前动态时间的显示的设计与实现。
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。
import java.awt.*;import java.util.*;import javax.swing.*;//数字时钟public class ClockDemo extends JFrame implements Runnable{Thread clock;public ClockDemo(){super("数字时钟"); //调用父类构造函数setFont(new Font("Times New Roman",Font.BOLD,60)); //设置时钟的显示字体start(); //开始进程setSize(280,100); //设置窗口尺寸setVisible(true); //窗口可视this.setLocation(440,330);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序}public void start(){ //开始进程if (clock==null){ //如果进程为空值clock=new Thread(this); //实例化进程clock.start(); //开始进程}}public void run(){ //运行进程while (clock!=null){repaint(); //调用paint方法重绘界面try{Thread.sleep(1000); //线程暂停一秒(1000毫秒)}catch (InterruptedException ex){ex.printStackTrace(); //输出出错信息}}}public void stop(){ //停止进程clock=null;}public void paint(Graphics g){ //重载组件的paint方法Graphics2D g2=(Graphics2D)g; //得到Graphics2D对象Calendar now=new GregorianCalendar(); //实例化日历对象String timeInfo=""; //输出信息int hour=now.get(Calendar.HOUR_OF_DAY); //得到小时数int minute=now.get(Calendar.MINUTE); //得到分数int second=now.get(Calendar.SECOND); //得到秒数if (hour<=9)timeInfo+="0"+hour+":"; //格式化输出elsetimeInfo+=hour+":";if (minute<=9)timeInfo+="0"+minute+":";elsetimeInfo+=minute+":";if (second<=9)timeInfo+="0"+second;elsetimeInfo+=second;g.setColor(Color.orange); //设置当前颜色为白色Dimension dim=getSize(); //得到窗口尺寸g.fillRect(0,0,dim.width,dim.height); //填充背景色为白色g.setColor(Color.black); //设置当前颜色为橙色g.drawString(timeInfo,20,80); //显示时间字符串}public static void main(String[] args){new ClockDemo();}}。
电子闹钟源程序模块一#include <reg51.h>extern void InitT0(void);extern void Init8255(void);extern unsigned char DispBuf[6];extern bit xTim,xKey;extern void KeyPro(void);extern unsigned char KeySts;extern void Delay(unsigned int ms) ;unsigned char sec,min,hour;Unsigned char code table[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86, 0x8E};sbit P1_1=P1^1;void TimUpdate(void){if(++sec==60){sec=0;if(++min==60){min=0;if(++hour==24){hour=0;}}}}void DisplayTim(){DispBuf[0]=table[sec % 10];DispBuf[1]=table[sec / 10];DispBuf[2]=table[min % 10];DispBuf[3]=table[min / 10];DispBuf[4]=table[hour % 10];DispBuf[5]=table[hour / 10];}void main(void){unsigned char i,x, xi ;x=1;for (i=0;i<6;i++) DispBuf[i]=0xFF;sec=0;min=0;hour=0;InitT0();Init8255();KeySts=0;while(1){if (xTim && (KeySts == 0)){xTim=0;TimUpdate();DisplayTim();// P1= ~x;// x<<=1;//if (x==0) x=1;}if (xKey){xKey =0;KeyPro();}if((sec==0)&&(min==0)){ xi=hour;if (xi==0){ xi=24; }while(xi--){ P1_1=1;DisplayTim();Delay(500);P1_1=0;DisplayTim();Delay(500);sec++;}}}}模块二#include <reg51.h>unsigned char xdata PA _at_ 0x8000; unsigned char xdata PB _at_ 0x8001; unsigned char xdata PC _at_ 0x8002; unsigned char xdata CtrlW _at_ 0x8003;unsigned char pLED;unsigned char DispBuf[6];unsigned char Digit[6]={0xDF,0xEF,0xF7,0xFB,0xFD,0xFE}; unsigned char count;bit xTim,xKey;unsigned char KeyV al;void InitT0(void){pLED=0;xTim=0;count=0;TMOD=(TMOD&0xF0)|0x01;TH0=0xF1;TL0=0x00;TR0=1;ET0=1;EA=1;}void Delay(unsigned int ms){int i,j;for(i=0;i<ms;i++){for(j=0;j<114;j++){}}}void Init8255(void){Delay(1000);CtrlW=0x81;}void T0Srv(void) interrupt 1 using 1{TH0=0xF1;PA=0xFF;PB=Digit[pLED];PA=DispBuf[pLED];if(++pLED==6) pLED=0;count++;if((count&0x03)==0){KeyV al=PC & 0x0F;xKey=1;P1=KeyV al;}if(count==240){count=0;xTim=1;}}模块三#define SET 0x01#define LR 0x02#define UD 0x04#define OK 0x08#include <reg51.h>extern unsigned char sec,min,hour; extern unsigned char code table[16]; extern unsigned char DispBuf[6]; unsigned char EditSec,EditMin,EditHour; extern unsigned char KeyV al; unsigned char CurKey,LastKey; unsigned char KeySts;void DisplayEdit(){DispBuf[0]=table[EditSec%10]; DispBuf[1]=table[EditSec/10];DispBuf[2]=table[EditSec%10]; DispBuf[3]=table[EditSec/10];DispBuf[4]=table[EditSec%10]; DispBuf[5]=table[EditSec/10];DispBuf[6-KeySts]&=0x7F;}void Copy(){sec=EditSec;min=EditMin;hour=EditHour;}void KeyPro(void){unsigned char KeyPressed;LastKey=CurKey;CurKey=KeyV al;KeyPressed=CurKey^LastKey;if(KeyPressed==0) return;if(CurKey==0x0F) return;switch(KeySts){case 0:if(KeyPressed==SET){KeySts++;EditSec=sec;EditMin=min;EditHour=hour;}break;case 1:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour +=10;if(EditHour>=24) EditHour-=24; break;case OK: Copy();KeySts=0;break;}break;case 2:switch(KeyPressed){case LR: KeySts++;break;case UD: EditHour++;if(EditHour>=24) EditHour-=24; break;case OK: Copy();KeySts=0;break;}break;case 3:switch(KeyPressed){case LR: KeySts++;break;case UD:EditMin+=10;if(EditMin>=60) EditMin-=60; break;case OK:Copy();KeySts=0;break;}break;case 4:switch(KeyPressed){case LR: KeySts++;break;case UD: EditMin++;if(EditMin>=60) EditMin-=60; break;case OK: Copy();KeySts=0;break;}break;case 5:switch(KeyPressed){case LR: KeySts++;break;case UD: EditSec+=10;if(EditSec>=60) EditSec-=60; break;case OK: Copy();KeySts=0;break;}break;case 6:switch(KeyPressed){case LR:KeySts=1;break;case UD:EditSec++;if(EditSec>=60) EditSec-=60; break;case OK: Copy();KeySts=0;break;}break;default:KeySts=0;}DisplayEdit();}。
电子时钟工具的程序设计及代码示例为满足现代生活的需求,电子时钟成为人们生活中的常见工具。
除了具备实时显示时间的功能外,电子时钟还可以根据用户需求进行各种定制,如显示日期、倒计时、闹钟等功能。
本文将探讨电子时钟的程序设计方法,并提供一个简单的代码示例。
一、程序设计方法在进行电子时钟的程序设计前,我们需要确定以下几个关键因素:1. 使用的编程语言:根据实际情况选择合适的编程语言,如C++、Java、Python等。
2. GUI框架:确定使用什么图形界面框架,如Qt、Tkinter等。
3. 实时更新:确定时间的实时更新方式,可以利用计时器、循环等方式进行时间更新。
4. 用户交互:考虑用户是否需要与电子时钟进行交互,如设置闹钟、选择日期等。
二、代码示例以下是一个基于Python和Tkinter的电子时钟代码示例,代码注释中详细说明了每个函数的功能和实现方法:```pythonimport tkinter as tkfrom datetime import datetimedef update_time():# 获取当前时间current_time = datetime.now().strftime("%H:%M:%S")# 更新时间标签time_label.config(text=current_time)# 每隔1秒更新一次时间time_label.after(1000, update_time)# 创建窗口window = ()window.title("电子时钟")# 创建时间标签time_label = bel(window, font=("Arial", 100), bg="white") time_label.pack(pady=50)# 更新时间update_time()# 运行窗口主循环window.mainloop()```以上代码创建了一个简单的窗口,使用标签实时显示当前时间。
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),表⽰在原来图像的基础上,再画图。
package pkg110;import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.Timer;/**** @author Administrator*/public class Clock extends JFrame implements ActionListener{ public final int HEIGTH = 200, L0 = 50, T0 = 50,N=8;public final double RAD = Math.PI / 180.0;int x, y, old_X, old_Y, r, x0, y0, w, h, ang;int sdo, mdo, hdo, old_M, old_H, hh, mm, ss;int delay = 1000;Calendar now;String st, alarm, Items1, Items2,str[];JButton jb;JComboBox jc1, jc2, jc3;JLabel jl1, jl2, jl3, jl4;JTextField jtf1, jtf2, time;JPanel jp1, jp2, jp3;Timer timer;TimeZone tz = TimeZone.getTimeZone("JST");Toolkit toolkit=Toolkit.getDefaultToolkit();/*** @param args the command line arguments*/public static void main(String[] args) {// TODO code application logic hereClock cp = new Clock();cp.setVisible(true);}Clock() {super("闹钟");setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);setSize(400,550);setVisible(true);Container contentPane = getContentPane();jp2 = new JPanel();jl1 = new JLabel("闹铃时间");jl1.setFont(new Font("楷体", Font.BOLD, 18));time = new JTextField("00:00",10);alarm = time.getText();jb = new JButton("修改闹铃时间");jb.addActionListener(this);jb.setActionCommand("CC");jp2.add(jl1);jp2.add(time);jp2.add(jb);contentPane.add(jp2, BorderLayout.SOUTH);ClockPanel clock = new ClockPanel();contentPane.add(clock, BorderLayout.CENTER);ActionListener taskPerformer = new ActionListener() { public void actionPerformed(ActionEvent evt) {repaint();}};new Timer(delay, taskPerformer).start();}Color waiquan= Color.magenta;Color bianxian= Color.black;Color biaopan= Color.yellow;Color juxing= Color.yellow;Color miaozhen= Color.red;Color fenzhen= Color.red;Color shizhen= Color.red;public class ClockPanel extends JPanel {public void paint(Graphics g) {h = getSize().height - 200;g.setColor(waiquan);g.fillOval(L0 + 30, T0 + 30, h - 60, h - 60);g.setColor(bianxian);g.drawOval(L0 + 31, T0 + 31, h - 62, h - 62);g.setColor(biaopan);g.fillOval(L0 + 50, T0 + 50, h - 100, h - 100);g.setColor(bianxian);g.drawOval(L0 + 51, T0 + 51, h - 102, h - 102);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;now = Calendar.getInstance();hh = now.get(Calendar.HOUR_OF_DAY);mm = now.get(Calendar.MINUTE);ss = now.get(Calendar.SECOND);g.setColor(juxing);g.fillRect(110,350, 150, 30);g.setColor(fenzhen);if (hh < 10)st = "0" + hh;elsest = "" + hh;if (mm < 10)st = st + ":0" + mm;elsest = st + ":" + mm;if(alarm.equals(st)){if(toolkit!=null)toolkit.beep();else {}}if (ss < 10)st = st + ":0" + ss;elsest = st + ":" + ss;{g.setFont(new Font("华文楷体", Font.BOLD, 16));g.drawString("当前时间:" + st, 115,370);}sdo = 90 - ss * 6;mdo = 90 - mm * 6;hdo = 90 - hh * 30 - mm / 2;if (old_X > 0) {g.setColor(biaopan);} else {old_M = mdo;old_H = hdo;}g.setColor(miaozhen);x = (int) ((r - 26) * Math.cos(RAD * sdo) + x0);y = (int) ((r - 26) * Math.sin(RAD * sdo) + y0) - 2 * T0;g.drawLine(x0, y0, x, (h - y));old_X = x;old_Y = y;if (mdo != old_M) {g.setColor(biaopan);old_M = mdo;}if (hdo != old_H) {g.setColor(biaopan);old_H = hdo;}g.setColor(fenzhen);x = (int) ((r - 45) * Math.cos(RAD * mdo) + x0);y = (int) ((r - 45) * Math.sin(RAD * mdo) + y0) - 2 * T0;g.drawLine(x0, y0, x, (h - y));g.setColor(shizhen);x = (int) ((r - 70) * Math.cos(RAD * hdo) + x0);y = (int) ((r - 70) * Math.sin(RAD * hdo) + y0) - 2 * T0;g.drawLine(x0, y0, x, (h - y));}}// 闹铃时间的判断及实现// 闹铃声音的实现public void actionPerformed(ActionEvent e) {if (e.getActionCommand()=="CC") {int newHou, newMin;char c;String getTime = JOptionPane.showInputDialog(this, "请输入闹铃时间格式如:", "00:00");repaint();if(getTime==null)System.out.println(getTime);judge: if (getTime != null) {System.out.println(getTime);if (getTime.length() != 5) {JOptionPane.showMessageDialog(time, "格式错误\n请按格式输入5位数字", "Error",JOptionPane.ERROR_MESSAGE);repaint();break judge;}for (int i = 0; i < (getTime.length()); i++) {c = getTime.charAt(i);if (i == 2 && !Character.isDigit(c))continue;if (i != 2 && !Character.isDigit(c)) {JOptionPane.showMessageDialog(this, "格式错误\n请按格式输入5位数字", "Error",JOptionPane.ERROR_MESSAGE);repaint();break judge;}}char[] hour = { getTime.charAt(0), getTime.charAt(1) };char[] minute = { getTime.charAt(3), getTime.charAt(4) };newHou = Integer.parseInt(String.valueOf(hour));newMin = Integer.parseInt(String.valueOf(minute));if (newHou >= 24 || newHou < 0) {JOptionPane.showMessageDialog(this, "格式错误\n小时应该是不小于0不大于23的正数","Error", JOptionPane.ERROR_MESSAGE);repaint();break judge;}if (newMin >= 60 || newHou < 0) {JOptionPane.showMessageDialog(this, "格式错误\n分钟应该是小于60的正数", "Error",JOptionPane.ERROR_MESSAGE);repaint();break judge;}new SetTime(newHou, newMin);}}toolkit=Toolkit.getDefaultToolkit();}class SetTime {String Hour;String Minute;public SetTime() { }public SetTime(int hour, int minute) {if (hour < 10) {Hour = "0" + String.valueOf(hour);} else {Hour = "" + String.valueOf(hour);}if (minute < 10) {Minute = "0" + String.valueOf(minute);} else {Minute = "" + String.valueOf(minute);}alarm = Hour + ":" + Minute;time.setText(alarm);repaint();}}}。