JAVA 闹钟程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA 闹钟程序相关的知识,希望对你有一定的参考价值。

请高手帮我个忙啊。。我想做个JAVA闹钟。请高手给我个实例代码。。谢谢了。。在网上百度了几个都没用。。(或者我不知道用)。。请高手帮帮忙啊。。小弟我刚学。。谢谢

import java.util.*;
import java.awt.*;
import java.applet.*;
import java.text.*;
import java.awt.event.*;

public class Alarm extends Applet implements Runnable

Thread timer=null; //创建线程timer
Image gif1; //clockp:闹钟的外壳,闹铃和报时物
boolean setflag=false,stopflag=false,cancelflag=false;
Panel setpanel;
//获取声音文件
AudioClip ring=getAudioClip(getCodeBase(), "1.mid");
Button setbutton=new Button("SET");
Button cancelbutton=new Button("CANCEL");
Button stopbutton=new Button("STOP");
//响应按钮事件
private ActionListener setli=new ActionListener()

public void actionPerformed(ActionEvent e)

setflag=true;

;
private ActionListener cancelli=new ActionListener()

public void actionPerformed(ActionEvent e)

setflag=true;

;
private ActionListener stopli=new ActionListener()

public void actionPerformed(ActionEvent e)

ring.stop();
//清除的方法
//g.clearRect(83,280,20,30);

;

Label note1=new Label("Alarm clock:");
//GregorianCalendar提供的是一个日历式的东东,上面又多了很多的参数,是方便操作了不少。而Date类的功能远不及其,求个和日期有联系的还要自己计算。
GregorianCalendar cal=new GregorianCalendar();
GregorianCalendar cal2=new GregorianCalendar();
SimpleDateFormat df=new SimpleDateFormat("yyyy MM dd HH:mm:ss");//设置时间格式
Date dummy=new Date(); //生成Data对象
String lastdate=df.format(dummy);
Font F=new Font("TimesRoman",Font.PLAIN,14);//设置字体格式
Date dat=null;
Date timeNow;
Color fgcol=Color.blue;
Color fgcol2=Color.darkGray;
Color backcolor=Color.blue;
Label hlabel2,mlabel2,slabel2;//显示时间单位时所用的标签(时、分、秒)
int i;
int s,m,h;
TextField sethour,setmin,setsec;//显示当前时间文本框和定时文本框

//在Applet程序中,首先自动调用初始化完成必要的初始化工作,紧接着自动调用start,在进入执行程序和返回到该页面时被调用,而从该页面转到别的页面时,stop被调用,关闭浏览器时,执行destroy。
public void init()//初始化方法

int fieldx=50,fieldy1=120,fieldy2=220,fieldw=30,fieldh=20,space=50;//显示时间和定时文本框的定位参数
setLayout(null); //将布局管理器初始化为null
setpanel=new Panel();
setpanel.setLayout(null);
setpanel.add(note1);
note1.setBounds(30,100,60,20);
note1.setBackground(backcolor);
note1.setForeground(Color.black);
//定时用的文本框(时、分、秒)
sethour=new TextField("00",5);
setmin=new TextField("00",5);
setsec=new TextField("00",5);
hlabel2=new Label();
mlabel2=new Label();
slabel2=new Label();
//定时的小时文本框的位置、大小
setpanel.add(sethour);
sethour.setBounds(fieldx,fieldy2,fieldw,fieldh);
sethour.setBackground(Color.white);
//在文本框后加入单位“时”
setpanel.add(hlabel2);
hlabel2.setText("h");
hlabel2.setBackground(backcolor);
hlabel2.setForeground(Color.black);
hlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20);
fieldx=fieldx+space;
//定时的分钟文本框的位置、大小
setpanel.add(setmin);
setmin.setBounds(fieldx,fieldy2,fieldw,fieldh);
setmin.setBackground(Color.white);
//在文本框后加入单位“分”
setpanel.add(mlabel2);
mlabel2.setText("m");
mlabel2.setBackground(backcolor);
mlabel2.setForeground(Color.black);
mlabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20);
fieldx=fieldx+space;
//定时的秒文本框的位置、大小
setpanel.add(setsec);
setsec.setBounds(fieldx,fieldy2,fieldw,fieldh);
setsec.setBackground(Color.white);
//在文本框后加入单位“秒”
setpanel.add(slabel2);
slabel2.setText("s");
slabel2.setBackground(backcolor);
slabel2.setForeground(Color.black);
slabel2.setBounds(fieldx+fieldw+3,fieldy2,14,20);
//设置闹钟控制按钮(on,off)
setpanel.add(cancelbutton);
setpanel.add(setbutton);
setpanel.add(stopbutton);
cancelbutton.setBounds(90,180,40,20);
setbutton.setBounds(140,180,40,20);
stopbutton.setBounds(522,180,40,20);
setbutton.addActionListener(setli);
cancelbutton.addActionListener(cancelli);
stopbutton.addActionListener(stopli);
stopbutton.setVisible(false);
//将面板加入当前容器中,并设置面板的大小和背景色
add(setpanel);
setpanel.setBounds(300,1,250,420);
setpanel.setBackground(backcolor);

/*int xcenter,ycenter,s,m,h;
//闹钟中心点所在位置
xcenter=145;
ycenter=162;
s=(int)cal.get(Calendar.SECOND);
m=(int)cal.get(Calendar.MINUTE);
h=(int)cal.get(Calendar.HOUR_OF_DAY);
//初始化指针位置
lastxs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter);
lastys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter);
lastxm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter);
lastym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter);
lastxh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*18+xcenter);
lastyh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*18+ycenter);
lasts=s; */

MediaTracker mt=new MediaTracker(this);//为给定组件创建一个跟踪媒体的MediaTracker对象,把图片添加到被跟踪的图片组

//Java允?Sapplet??html所在的位置(decument base)下?d?Y料,也允?Sapplet?钠涑淌酱a所在的位置(code base)下?d?Y料。藉由呼叫getDocumentBase()?cgotCodeBase()可得到URL物件。?@些函?????湍阏业侥阆胂螺d的?n案的位置
//clockp=getImage(getDocumentBase(),"11.png");
gif1=getImage(getCodeBase(),"2.gif");

//i为id号

mt.addImage(gif1,i++);

try

mt.waitForAll();

catch(InterruptedException e)
;//等待加载结束
resize(600,420);//设置窗口大小

//窗口显示有改变的时候调用paint
public void paint(Graphics g)
//重写paint()方法
int xh,yh,xm,ym,xs,ys,strike_times;
int xcenter,ycenter;
String today;
xcenter=148;
ycenter=186;
dat=new Date();
//用当前时间初始化日历时间
cal.setTime(dat);
//读取当前时间
s=(int)cal.get(Calendar.SECOND);
m=(int)cal.get(Calendar.MINUTE);
h=(int)cal.get(Calendar.HOUR_OF_DAY);
//换一种时间表达形式
today=df.format(dat);
//指针位置
xs=(int)(Math.cos(s*3.14f/30-3.14f/2)*30+xcenter);
ys=(int)(Math.sin(s*3.14f/30-3.14f/2)*30+ycenter);
xm=(int)(Math.cos(m*3.14f/30-3.14f/2)*25+xcenter);
ym=(int)(Math.sin(m*3.14f/30-3.14f/2)*25+ycenter);
xh=(int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*12+xcenter);
yh=(int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*12+ycenter);
//设置字体和颜色
g.setFont(F);
//前景色

g.setColor(getBackground()); //取背景色的
g.drawImage(gif1,75,110,this);
//以数字方式显示年、月、日和时间
g.drawString(today,55,415);

//画指针
g.drawLine(xcenter,ycenter,xs,ys);
g.drawLine(xcenter,ycenter-1,xm,ym); //(x1,y1,x2,y2)
g.drawLine(xcenter-1,ycenter,xm,ym);
g.drawLine(xcenter,ycenter-1,xh,yh);
g.drawLine(xcenter-1,ycenter,xh,yh);

int timedelta;//记录当前时间与闹铃定时的时差
Integer currh,currm,currs;//分别记录当前的时、分、秒

Date dat2=new Date();
cal2.setTime(dat2);
//读取当前时间
currh=(int)cal2.get(Calendar.SECOND);
currm=(int)cal2.get(Calendar.MINUTE);
currs=(int)cal2.get(Calendar.HOUR_OF_DAY);
//这样做的话说我API已过时
//timeNow=new Date();
//currh=new Integer(timeNow.getHours());
//currm=new Integer(timeNow.getMinutes());
//currs=new Integer(timeNow.getSeconds());

if(setflag)
//判断是否设置了闹钟
//判断当前时间是否为闹钟所定的时间
if((currh.intValue()==Integer.valueOf(sethour.getText()).intValue())&&(currm.intValue()==Integer.valueOf(setmin.getText()).intValue())&&(currs.intValue()==Integer.valueOf(setsec.getText()).intValue()))

ring.play();
g.drawImage(gif1,83,280,this);
stopbutton.setVisible(true);

timedelta=currm.intValue()*60+currs.intValue()-Integer.valueOf(setmin.getText()).intValue()*60-Integer.valueOf(setsec.getText()).intValue();
if((timedelta>=30))

//若当前时间与闹钟相差时间超过30秒,闹钟自动停
ring.stop();
//清除的方法
g.clearRect(83,280,20,30);


dat=null;


public void start()

if(timer==null)

timer=new Thread(this);//将timer实例化
timer.start();



public void stop()

timer=null;


//给创建线程后start之后自动执行的函数
public void run()

//在run()方法中,调用repaint()方法,以重绘小程序区,进行时钟显示的更新。接着调用sleep方法让当前线程(也就是我们创建的线程clockthread)睡眠1000毫秒,因为我们每秒钟要更新一下显示,所以让它睡眠1秒
while(timer!=null)

try

timer.sleep(1000);

catch(InterruptedException e)

//调用repaint时,会首先清除掉paint方法之前的画的内容,再调用paint方法
repaint();//刷新画面

timer=null;


//当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除
//有两种方法可以明显地减弱闪烁:重载 update()或使用双缓冲。
//使用双缓冲技术:另一种减小帧之间闪烁的方法是使用双缓冲,它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。
// 双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。

public void update(Graphics g)

Image offscreen_buf=null;
//采用双缓冲技术的update()方法
if(offscreen_buf==null)
offscreen_buf=createImage(600,420);
Graphics offg=offscreen_buf.getGraphics();
offg.clipRect(1,1,599,419);
paint(offg);
Graphics ong=getGraphics();
ong.clipRect(1,1,599,419);
ong.drawImage(offscreen_buf,0,0,this);


/** Creates a new instance of AlarmClock */

参考资料:http://conjs.cn

参考技术A //OK 写好了...怕你不懂 帮你加了注释

package 娱乐;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
public class Alarm extends JFrame implements Runnable
JLabel ri ,shi, fen, miao, dangqian;

JButton queding, dakai;

JTextField music,RI, SHI, FEN, MIAO;

int h=0,f=0,m=0,r=0;
boolean fo=false;
public AudioClip soumd1;
public Alarm()
Container c = getContentPane();
c.setLayout(new GridLayout(3, 1));
JPanel jp = new JPanel();
dangqian = new JLabel();
jp.add(dangqian);
c.add(jp);
JPanel jp1 = new JPanel();
music = new JTextField(20);
dakai = new JButton("选择闹铃音乐");
jp1.add(music);
jp1.add(dakai);
c.add(jp1);
ri = new JLabel("日");
RI = new JTextField(4);
shi = new JLabel("时");
SHI = new JTextField(4);
fen = new JLabel("分");
FEN = new JTextField(4);
miao = new JLabel("秒");
MIAO = new JTextField(4);
JPanel jp2 = new JPanel();
jp2.add(ri);
jp2.add(RI);
jp2.add(shi);
jp2.add(SHI);
jp2.add(fen);
jp2.add(FEN);
jp2.add(miao);
jp2.add(MIAO);
queding = new JButton("确定");
jp2.add(queding);
c.add(jp2);
setSize(400, 130);
setVisible(true);
dakai.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent event)
JFileChooser fileChooser = new JFileChooser(); // 实例化文件选择器
fileChooser
.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); // 设置文件选择模式,此处为文件和目录均可
fileChooser.setCurrentDirectory(new File(".")); // 设置文件选择器当前目录
fileChooser
.setFileFilter(new javax.swing.filechooser.FileFilter()
public boolean accept(File file) // 可接受的文件类型
String name = file.getName().toLowerCase();
return name.endsWith(".wav")
|| name.endsWith(".au")
|| file.isDirectory();


public String getDescription() // 文件描述
return "音乐文件(*.wav,*.au)";

);
if (fileChooser.showOpenDialog(Alarm.this) == JFileChooser.APPROVE_OPTION) // 弹出文件选择器,并判断是否点击了打开按钮
String fileName = fileChooser.getSelectedFile().getAbsolutePath(); // 得到选择文件或目录的绝对路径
music.setText(fileName);


);
queding.addActionListener(new ActionListener()
public void actionPerformed(ActionEvent event)
if(queding.getText().equals("确定"))
try
r=Integer.parseInt(RI.getText());
h=Integer.parseInt(SHI.getText());
f=Integer.parseInt(FEN.getText());
m=Integer.parseInt(MIAO.getText());
if(1<=h&&h<=31&&0<=h&&h<=23&&0<=f&&f<=59&&0<=m&&m<=59)

fo=true;

else
JOptionPane.showMessageDialog(null, "输入时间错误");

catch(Exception e)
JOptionPane.showMessageDialog(null, "请输入正确的时间");



else

fo=false;
RI.setEditable(true);
SHI.setEditable(true);
FEN.setEditable(true);
MIAO.setEditable(true);
queding.setText("确定");
soumd1.stop();


);



public static void main(String agrs[])
Alarm s = new Alarm();
Thread t1 = new Thread(s);
t1.start();
s.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


public void run()
while (true)
Date now = new Date();
dangqian.setText("当前时间: " + now.toString());
if(fo)

RI.setEditable(false);
SHI.setEditable(false);
FEN.setEditable(false);
MIAO.setEditable(false);
queding.setText("关闭");
SimpleDateFormat ri=new SimpleDateFormat("dd"); //封装 为了获取日期
SimpleDateFormat shi=new SimpleDateFormat("kk"); //封装 为了获取小时
SimpleDateFormat fen=new SimpleDateFormat("mm"); //封装 为了获取分钟
SimpleDateFormat miao=new SimpleDateFormat("ss"); //封装 为了获取秒钟
int riqi=Integer.parseInt(ri.format(now)); //获取日期
int shizhong=Integer.parseInt(shi.format(now)); //获取小时
int fenzhong=Integer.parseInt(fen.format(now)); //获取分钟
int miaozhong=Integer.parseInt(miao.format(now)); //获取秒钟
if(riqi==r&&shizhong==h&&fenzhong==f&&miaozhong==m) //判断条件

try
soumd1=Applet.newAudioClip(new File(music.getText()).toURL()); //播放音乐
soumd1.loop(); //我设置的是循环播放..这样不起床都不行..
fo=false;
catch (MalformedURLException e)
e.printStackTrace();



try
Thread.sleep(1000);
catch (InterruptedException ie)




本回答被提问者和网友采纳
参考技术B import java.util.Timer;
import java.util.TimerTask;

public class MyDoit
public static void main(String[] args)
new Timer().schedule(new TimerTask()
public void run()
System.out.println("简单的闹钟");

, 0, 1000 * 60 * 60 * 24);

JAVA可视化闹钟源码

概述

一些同学的Java课设有这样一个问题,比较感兴趣就做了一下

功能介绍:

1、可增加闹钟

2、可删除闹钟

3、时间到了响铃

4、关闭闹钟不会丢失闹钟(因为闹钟存储在txt文件中,不会因程序关闭就终止)

缺点

1、没有使用多线程,闹钟响起时只能等待1分钟或者关闭程序

2、界面设计不够美观,后期有时间会进行修改,重新设计

3、没有闹钟修改的功能,虽然可以通过增删来达到修改的目的,但功能仍然属于空缺范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
package Clock;

import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

import javax.swing.*; //awt和swing是做界面用的类
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*; //io流用于读写文件,包括增删闹钟、打开铃声等等
import java.util.Calendar; //用于获取当前时间的类
import java.util.GregorianCalendar;//标准阳历
import java.util.StringTokenizer; //读取文件转换成计算机语言用的类
/*
1 计时器
要求1:一个带有可视化界面的钟表。
要求2:可以添加若干个闹钟。
要求3:具备持久化功能,关闭程序不能丢失闹钟。
要求4:闹钟是可编辑,可删除的。

实现:先创建一个面板显示闹钟,面板内创建按钮增加闹钟,按钮查看闹钟,按钮删除闹钟
线程间隔1s读取时间和闹钟比较

*/
public class ClockTry extends JFrame implements Runnable
/* 成员变量 */
private JPanel xx; //总的面板
private JComboBox ho; //hour选择时间的下拉框
private JComboBox mi; //min选择分钟的下拉框
private JButton tjnz; //添加闹钟的按钮
private JButton schour; //删除闹钟的按钮
private String filename = "D://homework//java//Gui//src//Clock//0.wav"; //所有的路径改这两个地方就可以了
private String pathname = "D://homework//java//Gui//src//Clock//nz.txt"; // 绝对路径或相对路径都可以,写入文件时演示相对路径,读取以上路径的input.txt文件

private int HOUR; //定义HOUR用于接收按钮按下从下拉框中获取的数据
private int MIN; //同上

int x = 100, y = 100, r = 100; // (x,y)为(0,0)点,表示原点
int h, m, s; // 时,分,秒
double rad = Math.PI / 180; // 1°

private String[][] str= new String[100][2]; //定义二维数组,用于存储以及对小时和分针的操作,暂定为100个闹钟于是定义为【100】【2】
/**
*读取文件,每次的增删都需要对数据进行读取,将数据写在面板上也需要读取数据
*/
public void readFile()
try (FileReader reader = new FileReader(pathname); //创建一个FilReader对象,将文件读出来,相当于请教一个当地人,当地人了解本地文化,但是语言不通听不懂
BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言,相当于请一个翻译,把当地人读取的东西转换成计算机能懂的东西
)
String line;

int i =0;
while ((line = br.readLine()) != null) //翻译理解的东西存到line里面
int j =0;
StringTokenizer st = new StringTokenizer(line, ":"); //重点:由于存储数据时都是时间,道理来说都是数字,无法区分小时部分和分钟部分
while (st.hasMoreTokens()) //每读取一次读到的内容 //所以这里用分割符“:”来分割,相应的,后面的写入文件也应该已“:”分割进行写入
str[i][j]=st.nextToken(); //把读到的内容存储在数组里面便于后面的操做——增删
j++; //包括上面的j=0,是将for循环拆分放进while循环中,要不然循环写起来也很麻烦

//System.out.print(str[i][0]+":"+str[i][1]); 写的时候用来在控制台打印查看效果
//System.out.println();
i++;
j = 0;

catch (IOException e)
e.printStackTrace(); //try……catch抛出异常




/**
* 写入TXT文件
*/
public void writeFile()
HOUR = Integer.valueOf(ho.getSelectedIndex()); //获取下拉框中的值,存储到HOUR中
MIN = Integer.valueOf(mi.getSelectedIndex());
String x = HOUR + ":" + MIN;
try (FileWriter writer = new FileWriter(pathname,true); //同上面的读取,本地人写入,注意:后面的append:true是表示不是重新写,而是在后面追加
BufferedWriter out = new BufferedWriter(writer) //翻译一下再写入
)

out.write(HOUR + ":" + MIN + "\r\n"); //这里写入的时候把:写进去了!
out.flush(); // 把缓存区内容压入文件,计算机的存储过程,存在缓存区再写入文件
JOptionPane.showMessageDialog(null,"闹钟添加成功!","添加闹钟提醒",JOptionPane.INFORMATION_MESSAGE); //提示框:添加闹钟成功
catch (IOException e)
e.printStackTrace();






/**
* 删除闹钟,实际上是先将要删除的数据找到移除数组,再将数组重新写入,所以要先读取文件,再重新写入
*/
public void shanchuFile()
HOUR = Integer.valueOf(ho.getSelectedIndex());
MIN = Integer.valueOf(mi.getSelectedIndex());
try (FileWriter writer = new FileWriter(pathname); //没有append:true,表示重新写!
BufferedWriter out = new BufferedWriter(writer)
)
readFile();
for (int i = 0; i < 100; i++)
if (Integer.valueOf(str[i][0])==HOUR && Integer.valueOf(str[i][1])==MIN)
continue;

else
out.write(str[i][0]+":"+str[i][1]+"\r\n"); // \r\n即为换行



//out.write("1"+"1"+"\r\n"); // \r\n即为换行
out.flush(); // 把缓存区内容压入文件
catch (IOException e)
e.printStackTrace();
catch (NumberFormatException e)
System.out.println("this isn‘t exist!");
JOptionPane.showMessageDialog(null,"该闹钟已删除!","删除闹钟提醒",JOptionPane.INFORMATION_MESSAGE); //弹窗提示



/* 初始化函数 */
public void init()

Calendar now = new GregorianCalendar(); //获取当前时间
/*
* GregorianCalendar(标准阳历)
* 是Calendar(日历)【国际环境下都能运行的程序】
* 的子类
*/
s = now.get(Calendar.SECOND) * 6; // 秒针转换成角度:1秒,秒针动一次,转动6°
m = now.get(Calendar.MINUTE) * 6; // 分针转换为角度:1分,分针动一次,转动6°
h = now.get(Calendar.HOUR) * 30 + now.get(Calendar.MINUTE) / 12 * 6; // 先把分化为小时,再乘以6°,因为分针转12°,时针才会转1°,一小时中间有5格,数学问题
/*
* Calendar.HOUR 显示范围:1-12(无论AM还是PM) Calendar.HOUR_OF_DAY 显示范围:1-24(包括PM
*/

Thread t = new Thread(this); //添加线程,线程目标是整个程序,this
t.start(); //线程就绪


public void paint(Graphics g) //awt中的方法,因为要时时显示闹钟,所以不得不使用绘画的方式,不断重绘
super.paint(g);
/*
* paint(g)函数会重绘图像,要加上super.paint(g),表示在原来图像的基础上,再画图。
* 如果不加super.paint(g),重绘时,会将原有的绘制清空,再根据paing(g)函数绘制。
*/

g.setColor(Color.BLACK); //设置画笔颜色——黑色
g.drawOval(x, y, r * 2, r * 2);// 画表
/* drawOval(x,y,width,height)以矩形恰好框住椭圆,矩形左上角的顶点坐标为(x,y) */

// 秒针
int x1 = (int) (90 * Math.sin(rad * s));
int y1 = (int) (90 * Math.cos(rad * s));
g.drawLine(r+x, r+y, r+x + x1, r +y- y1);
/* drawLine(a,b,c,d) (a,b)为起始坐标 (c,d)为终点坐标 */

// 分针
x1 = (int) (80 * Math.sin(rad * m));
y1 = (int) (80 * Math.cos(rad * m));
g.drawLine(r+x, r+y, r +x+ x1, r+y - y1);

// 时针
x1 = (int) (60 * Math.sin(rad * h));
y1 = (int) (60 * Math.cos(rad * h));
g.drawLine(r+x, r+y, r+x + x1, r +y- y1);

// 画数字
int d = 30;
for (int i = 1; i <= 12; i++)
x1 = (int) ((r - 10) * Math.sin(rad * d));
y1 = (int) ((r - 10) * Math.cos(rad * d));
g.drawString(String.valueOf(i), r+x + x1, r+y - y1); //字符型的数据才能画
d += 30;


// 画刻度
d = 0;
for (int i = 1; i <= 60; i++)
x1 = (int) ((r - 2) * Math.sin(rad * d));
y1 = (int) ((r - 2) * Math.cos(rad * d));
g.drawString(".", r+x + x1, r +y- y1); //画的是点,表示刻度
d += 6;

// 显示时间
Calendar now1 = new GregorianCalendar();
int a, b, c;
a = now1.get(Calendar.HOUR_OF_DAY); //获取当前的小时
b = now1.get(Calendar.MINUTE); //获取当前的分钟
c = now1.get(Calendar.SECOND); //获取当前的秒钟
g.drawString(a + ":" + b + ":" + c, 175, 330); //将时间也画到面板上
g.drawString("全部闹钟:",100,350); //全部闹钟

try (FileReader reader = new FileReader(pathname);
BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言
)
String line;

int i =0;
while ((line = br.readLine()) != null)
int j =0;
StringTokenizer st = new StringTokenizer(line, ":");
while (st.hasMoreTokens())
str[i][j]=st.nextToken();
j++;

g.drawString(str[i][0]+":"+str[i][1]+"\n",180+(i/10)*70,350+15*(i-(i/10)*10)); //貌似重新写了一下readfile的方法,其实是有区别的,这里是读取以后画出来
//qbnz.setText(str[i][0]+":"+str[i][1]+"\n");
//System.out.print(str[i][0]+":"+str[i][1]);
//System.out.println();
i++;
j = 0;

catch (IOException z)
z.printStackTrace();




// 实现Runnable,实现implement Runnable就务必实现run方法,使线程运行
public void run()
while (true)
try
Thread.sleep(1000);// 间隔一秒
catch (Exception ex)

s += 6; // 秒针每次走6°
if (s >= 360)
s = 0; // 秒针归零
m += 6;
if (m == 72 || m == 144 || m == 288)
h += 6; // 分针走72°,时针走6° 分针的12倍,时针走一次


if (m >= 360)
m = 0; // 分针归零
h += 6;

if (h >= 360)
h = 0; // 时针归零




this.repaint(); // 重新绘制
//this.readFile();
this.alert(); //将闹钟加入到线程当中


public void alert()
Calendar now1 = new GregorianCalendar();
int a, b;
a = now1.get(Calendar.HOUR_OF_DAY);
b = now1.get(Calendar.MINUTE); //这里没有获取秒针是因为闹钟不看秒针。。。。。
try (FileReader reader = new FileReader(pathname);
BufferedReader br = new BufferedReader(reader) // 建立一个对象,它把文件内容转成计算机能读懂的语言
)
String line;
String[][] str= new String[100][2];
int i =0;
while ((line = br.readLine()) != null)
int j =0;
StringTokenizer st = new StringTokenizer(line, ":");
while (st.hasMoreTokens())
str[i][j]=st.nextToken();
j++;

if (a==Integer.valueOf(str[i][0]) && b==Integer.valueOf(str[i][1])) //读取后与获得的时间比较,如果闹钟存在,就响
try
InputStream in = new FileInputStream("D://homework//java//Gui//src//Clock//0.wav");//FIlename 是你加载的声音文件如(“game.wav”)
AudioStream as = new AudioStream(in); //和读取文件类似的原理,经翻译之后才播放出来
AudioPlayer.player.start(as); //用静态成员player.start播放音乐
catch(FileNotFoundException e)
System.out.print("FileNotFoundException ");
catch(IOException e)
System.out.print("有错误!");


i++;
j = 0;

catch (IOException z)
z.printStackTrace();



//初始化界面
public void launchFrame()
xx = new JPanel(); //插入一个面板
String[] hours = new String[24]; //长度为24的数组用于存储小时
for (int i = 0; i < hours.length; i++)
hours[i]=i+""; //循环对hour进行赋值

ho = new JComboBox(hours); //将hour加入到下拉框中
ho.setSize(50,40); //设置大小好像没用
String[] mins = new String[60]; //同理,这是分钟的地方
for (int i = 0; i < mins.length; i++)
mins[i]=i+""; //分钟赋值

mi = new JComboBox(mins); //分钟下拉框
mi.setSize(50,40);
tjnz = new JButton(); //添加闹钟的按钮,拼音首字母
tjnz.setText("添加到闹钟"); //按钮上显示的文字
tjnz.setSize(100,40);
schour = new JButton(); //删除闹钟的按钮
schour.setText("从闹钟中删除"); //按钮上显示的文字
schour.setSize(100,40);

/**
* 将按钮下拉框啥的加入到面板中
*/
xx.add(ho);
xx.add(mi);
xx.add(tjnz);
xx.add(schour);
this.add(xx); //将面板加入到this对象中,要不然面板就不显示
tjnz.addActionListener(new ActionListener() //添加按钮的功能
@Override //重写的标识,务必要会
public void actionPerformed(ActionEvent e)
// TODO Auto-generated method stub
HOUR = Integer.valueOf(ho.getSelectedIndex());
MIN = Integer.valueOf(mi.getSelectedIndex()); //获取到时分后
writeFile(); //写入txt文件保存为闹钟
readFile(); //再读取,这样才能时时更新面板上的全部闹钟
);

schour.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
// TODO Auto-generated method stub
HOUR = Integer.valueOf(ho.getSelectedIndex());
MIN = Integer.valueOf(mi.getSelectedIndex());
shanchuFile(); //这里是删除闹钟的按钮功能
readFile();
);

this.setTitle("小闹钟"); //设置窗口标题
this.setVisible(true); //设置窗口不隐身
this.setSize(700,500); //设置窗口大小
this.setLocation(500, 250); //设置窗口位置,相对于桌面左上角
this.init(); //调用初始化函数进行初始化
this.alert();
//this.run(); //重复调用run()方法结果是秒针一次走12°
this.addWindowListener(new WindowAdapter()
@Override
public void windowClosing(WindowEvent e)
System.exit(0);

); //设置窗口叉号的功能,点击就关闭程序




public static void main(String[] args)
ClockTry c = new ClockTry(); //main方法,必有的成分,创建主类对象,
c.launchFrame(); //调用初始化面板的方法,简化了本该在main方法中写的代码


运行效果

技术图片

技术图片

技术图片

此版本为第一次尝试,后续有时间会继续更新版本

以上是关于JAVA 闹钟程序的主要内容,如果未能解决你的问题,请参考以下文章

Java中的闹钟

java 使用swing制作一个小闹钟,包含以下功能:

微信小程序添加闹钟代码

如何在 Flutter 中设置闹钟?

用C语言写51单片机闹钟程序

iPhone闹钟应用程序中的贪睡闹钟?