java 闹钟代码_JAVA可视化闹钟源码
1 packageClock;2
3 importsun.audio.AudioPlayer;4 importsun.audio.AudioStream;5
6 import javax.swing.*; //awt和swing是做界面用的類
7 import java.awt.*;8 importjava.awt.event.ActionEvent;9 importjava.awt.event.ActionListener;10 importjava.awt.event.WindowAdapter;11 importjava.awt.event.WindowEvent;12 import java.io.*; //io流用于讀寫(xiě)文件,包括增刪鬧鐘、打開(kāi)鈴聲等等
13 import java.util.Calendar; //用于獲取當(dāng)前時(shí)間的類
14 import java.util.GregorianCalendar;//標(biāo)準(zhǔn)陽(yáng)歷
15 import java.util.StringTokenizer; //讀取文件轉(zhuǎn)換成計(jì)算機(jī)語(yǔ)言用的類
16 /*
17 1 計(jì)時(shí)器18 要求1:一個(gè)帶有可視化界面的鐘表。19 要求2:可以添加若干個(gè)鬧鐘。20 要求3:具備持久化功能,關(guān)閉程序不能丟失鬧鐘。21 要求4:鬧鐘是可編輯,可刪除的。22
23 實(shí)現(xiàn):先創(chuàng)建一個(gè)面板顯示鬧鐘,面板內(nèi)創(chuàng)建按鈕增加鬧鐘,按鈕查看鬧鐘,按鈕刪除鬧鐘24 線程間隔1s讀取時(shí)間和鬧鐘比較25
26 */
27 public class ClockTry extends JFrame implementsRunnable {28 /*成員變量*/
29 private JPanel xx; //總的面板
30 private JComboBox ho; //hour選擇時(shí)間的下拉框
31 private JComboBox mi; //min選擇分鐘的下拉框
32 private JButton tjnz; //添加鬧鐘的按鈕
33 private JButton schour; //刪除鬧鐘的按鈕
34 private String filename = "D://homework//java//Gui//src//Clock//0.wav"; //所有的路徑改這兩個(gè)地方就可以了
35 private String pathname = "D://homework//java//Gui//src//Clock//nz.txt"; //絕對(duì)路徑或相對(duì)路徑都可以,寫(xiě)入文件時(shí)演示相對(duì)路徑,讀取以上路徑的input.txt文件
36
37 private int HOUR; //定義HOUR用于接收按鈕按下從下拉框中獲取的數(shù)據(jù)
38 private int MIN; //同上
39
40 int x = 100, y = 100, r = 100; //(x,y)為(0,0)點(diǎn),表示原點(diǎn)
41 int h, m, s; //時(shí),分,秒
42 double rad = Math.PI / 180; //1°
43
44 private String[][] str= new String[100][2]; //定義二維數(shù)組,用于存儲(chǔ)以及對(duì)小時(shí)和分針的操作,暫定為100個(gè)鬧鐘于是定義為【100】【2】
45 /**
46 *讀取文件,每次的增刪都需要對(duì)數(shù)據(jù)進(jìn)行讀取,將數(shù)據(jù)寫(xiě)在面板上也需要讀取數(shù)據(jù)47 */
48 public voidreadFile() {49 try (FileReader reader = new FileReader(pathname); //創(chuàng)建一個(gè)FilReader對(duì)象,將文件讀出來(lái),相當(dāng)于請(qǐng)教一個(gè)當(dāng)?shù)厝?#xff0c;當(dāng)?shù)厝肆私獗镜匚幕?#xff0c;但是語(yǔ)言不通聽(tīng)不懂
50 BufferedReader br = new BufferedReader(reader) //建立一個(gè)對(duì)象,它把文件內(nèi)容轉(zhuǎn)成計(jì)算機(jī)能讀懂的語(yǔ)言,相當(dāng)于請(qǐng)一個(gè)翻譯,把當(dāng)?shù)厝俗x取的東西轉(zhuǎn)換成計(jì)算機(jī)能懂的東西
51 ) {52 String line;53
54 int i =0;55 while ((line = br.readLine()) != null) { //翻譯理解的東西存到line里面
56 int j =0;57 StringTokenizer st = new StringTokenizer(line, ":"); //重點(diǎn):由于存儲(chǔ)數(shù)據(jù)時(shí)都是時(shí)間,道理來(lái)說(shuō)都是數(shù)字,無(wú)法區(qū)分小時(shí)部分和分鐘部分
58 while (st.hasMoreTokens()){ //每讀取一次讀到的內(nèi)容//所以這里用分割符“:”來(lái)分割,相應(yīng)的,后面的寫(xiě)入文件也應(yīng)該已“:”分割進(jìn)行寫(xiě)入
59 str[i][j]=st.nextToken(); //把讀到的內(nèi)容存儲(chǔ)在數(shù)組里面便于后面的操做——增刪
60 j++; //包括上面的j=0,是將for循環(huán)拆分放進(jìn)while循環(huán)中,要不然循環(huán)寫(xiě)起來(lái)也很麻煩
61 }62 //System.out.print(str[i][0]+":"+str[i][1]); 寫(xiě)的時(shí)候用來(lái)在控制臺(tái)打印查看效果63 //System.out.println();
64 i++;65 j = 0;66 }67 } catch(IOException e) {68 e.printStackTrace(); //try……catch拋出異常
69 }70 }71
72
73 /**
74 * 寫(xiě)入TXT文件75 */
76 public voidwriteFile() {77 HOUR = Integer.valueOf(ho.getSelectedIndex()); //獲取下拉框中的值,存儲(chǔ)到HOUR中
78 MIN =Integer.valueOf(mi.getSelectedIndex());79 String x = HOUR + ":" +MIN;80 try (FileWriter writer = new FileWriter(pathname,true); //同上面的讀取,本地人寫(xiě)入,注意:后面的append:true是表示不是重新寫(xiě),而是在后面追加
81 BufferedWriter out = new BufferedWriter(writer) //翻譯一下再寫(xiě)入
82 ) {83
84 out.write(HOUR + ":" + MIN + "\r\n"); //這里寫(xiě)入的時(shí)候把:寫(xiě)進(jìn)去了!
85 out.flush(); //把緩存區(qū)內(nèi)容壓入文件,計(jì)算機(jī)的存儲(chǔ)過(guò)程,存在緩存區(qū)再寫(xiě)入文件
86 JOptionPane.showMessageDialog(null,"鬧鐘添加成功!","添加鬧鐘提醒",JOptionPane.INFORMATION_MESSAGE); //提示框:添加鬧鐘成功
87 } catch(IOException e) {88 e.printStackTrace();89
90 }91
92 }93
94
95 /**
96 * 刪除鬧鐘,實(shí)際上是先將要?jiǎng)h除的數(shù)據(jù)找到移除數(shù)組,再將數(shù)組重新寫(xiě)入,所以要先讀取文件,再重新寫(xiě)入97 */
98 public voidshanchuFile() {99 HOUR =Integer.valueOf(ho.getSelectedIndex());100 MIN =Integer.valueOf(mi.getSelectedIndex());101 try (FileWriter writer = new FileWriter(pathname); //沒(méi)有append:true,表示重新寫(xiě)!
102 BufferedWriter out = newBufferedWriter(writer)103 ) {104 readFile();105 for (int i = 0; i < 100; i++) {106 if (Integer.valueOf(str[i][0])==HOUR && Integer.valueOf(str[i][1])==MIN){107 continue;108 }109 else{110 out.write(str[i][0]+":"+str[i][1]+"\r\n"); //\r\n即為換行
111 }112 }113
114 //out.write("1"+"1"+"\r\n");//\r\n即為換行
115 out.flush(); //把緩存區(qū)內(nèi)容壓入文件
116 } catch(IOException e) {117 e.printStackTrace();118 }catch(NumberFormatException e){119 System.out.println("this isn't exist!");120 JOptionPane.showMessageDialog(null,"該鬧鐘已刪除!","刪除鬧鐘提醒",JOptionPane.INFORMATION_MESSAGE); //彈窗提示
121 }122 }123
124 /*初始化函數(shù)*/
125 public voidinit() {126
127 Calendar now = new GregorianCalendar(); //獲取當(dāng)前時(shí)間
128 /*
129 * GregorianCalendar(標(biāo)準(zhǔn)陽(yáng)歷)130 * 是Calendar(日歷)【國(guó)際環(huán)境下都能運(yùn)行的程序】131 * 的子類132 */
133 s = now.get(Calendar.SECOND) * 6; //秒針轉(zhuǎn)換成角度:1秒,秒針動(dòng)一次,轉(zhuǎn)動(dòng)6°
134 m = now.get(Calendar.MINUTE) * 6; //分針轉(zhuǎn)換為角度:1分,分針動(dòng)一次,轉(zhuǎn)動(dòng)6°
135 h = now.get(Calendar.HOUR) * 30 + now.get(Calendar.MINUTE) / 12 * 6; //先把分化為小時(shí),再乘以6°,因?yàn)榉轴樲D(zhuǎn)12°,時(shí)針才會(huì)轉(zhuǎn)1°,一小時(shí)中間有5格,數(shù)學(xué)問(wèn)題
136 /*
137 * Calendar.HOUR 顯示范圍:1-12(無(wú)論AM還是PM) Calendar.HOUR_OF_DAY 顯示范圍:1-24(包括PM138 */
139
140 Thread t = new Thread(this); //添加線程,線程目標(biāo)是整個(gè)程序,this
141 t.start(); //線程就緒
142 }143
144 public void paint(Graphics g) { //awt中的方法,因?yàn)橐獣r(shí)時(shí)顯示鬧鐘,所以不得不使用繪畫(huà)的方式,不斷重繪
145 super.paint(g);146 /*
147 * paint(g)函數(shù)會(huì)重繪圖像,要加上super.paint(g),表示在原來(lái)圖像的基礎(chǔ)上,再畫(huà)圖。148 * 如果不加super.paint(g),重繪時(shí),會(huì)將原有的繪制清空,再根據(jù)paing(g)函數(shù)繪制。149 */
150
151 g.setColor(Color.BLACK); //設(shè)置畫(huà)筆顏色——黑色
152 g.drawOval(x, y, r * 2, r * 2);//畫(huà)表
153 /*drawOval(x,y,width,height)以矩形恰好框住橢圓,矩形左上角的頂點(diǎn)坐標(biāo)為(x,y)*/
154
155 //秒針
156 int x1 = (int) (90 * Math.sin(rad *s));157 int y1 = (int) (90 * Math.cos(rad *s));158 g.drawLine(r+x, r+y, r+x + x1, r +y-y1);159 /*drawLine(a,b,c,d) (a,b)為起始坐標(biāo) (c,d)為終點(diǎn)坐標(biāo)*/
160
161 //分針
162 x1 = (int) (80 * Math.sin(rad *m));163 y1 = (int) (80 * Math.cos(rad *m));164 g.drawLine(r+x, r+y, r +x+ x1, r+y -y1);165
166 //時(shí)針
167 x1 = (int) (60 * Math.sin(rad *h));168 y1 = (int) (60 * Math.cos(rad *h));169 g.drawLine(r+x, r+y, r+x + x1, r +y-y1);170
171 //畫(huà)數(shù)字
172 int d = 30;173 for (int i = 1; i <= 12; i++) {174 x1 = (int) ((r - 10) * Math.sin(rad *d));175 y1 = (int) ((r - 10) * Math.cos(rad *d));176 g.drawString(String.valueOf(i), r+x + x1, r+y - y1); //字符型的數(shù)據(jù)才能畫(huà)
177 d += 30;178 }179
180 //畫(huà)刻度
181 d = 0;182 for (int i = 1; i <= 60; i++) {183 x1 = (int) ((r - 2) * Math.sin(rad *d));184 y1 = (int) ((r - 2) * Math.cos(rad *d));185 g.drawString(".", r+x + x1, r +y- y1); //畫(huà)的是點(diǎn),表示刻度
186 d += 6;187 }188 //顯示時(shí)間
189 Calendar now1 = newGregorianCalendar();190 inta, b, c;191 a = now1.get(Calendar.HOUR_OF_DAY); //獲取當(dāng)前的小時(shí)
192 b = now1.get(Calendar.MINUTE); //獲取當(dāng)前的分鐘
193 c = now1.get(Calendar.SECOND); //獲取當(dāng)前的秒鐘
194 g.drawString(a + ":" + b + ":" + c, 175, 330); //將時(shí)間也畫(huà)到面板上
195 g.drawString("全部鬧鐘:",100,350); //全部鬧鐘
196
197 try (FileReader reader = newFileReader(pathname);198 BufferedReader br = new BufferedReader(reader) //建立一個(gè)對(duì)象,它把文件內(nèi)容轉(zhuǎn)成計(jì)算機(jī)能讀懂的語(yǔ)言
199 ) {200 String line;201
202 int i =0;203 while ((line = br.readLine()) != null) {204 int j =0;205 StringTokenizer st = new StringTokenizer(line, ":");206 while(st.hasMoreTokens()){207 str[i][j]=st.nextToken();208 j++;209 }210 g.drawString(str[i][0]+":"+str[i][1]+"\n",180+(i/10)*70,350+15*(i-(i/10)*10)); //貌似重新寫(xiě)了一下readfile的方法,其實(shí)是有區(qū)別的,這里是讀取以后畫(huà)出來(lái)211 //qbnz.setText(str[i][0]+":"+str[i][1]+"\n");212 //System.out.print(str[i][0]+":"+str[i][1]);213 //System.out.println();
214 i++;215 j = 0;216 }217 } catch(IOException z) {218 z.printStackTrace();219 }220 }221
222
223 //實(shí)現(xiàn)Runnable,實(shí)現(xiàn)implement Runnable就務(wù)必實(shí)現(xiàn)run方法,使線程運(yùn)行
224 public voidrun() {225 while (true) {226 try{227 Thread.sleep(1000);//間隔一秒
228 } catch(Exception ex) {229 }230 s += 6; //秒針每次走6°
231 if (s >= 360) {232 s = 0; //秒針歸零
233 m += 6;234 if (m == 72 || m == 144 || m == 288) {235 h += 6; //分針走72°,時(shí)針走6° 分針的12倍,時(shí)針走一次
236 }237
238 if (m >= 360) {239 m = 0; //分針歸零
240 h += 6;241 }242 if (h >= 360) {243 h = 0; //時(shí)針歸零
244 }245 }246
247
248 this.repaint(); //重新繪制249 //this.readFile();
250 this.alert(); //將鬧鐘加入到線程當(dāng)中
251 }}252
253 public voidalert(){254 Calendar now1 = newGregorianCalendar();255 inta, b;256 a =now1.get(Calendar.HOUR_OF_DAY);257 b = now1.get(Calendar.MINUTE); //這里沒(méi)有獲取秒針是因?yàn)轸[鐘不看秒針。。。。。
258 try (FileReader reader = newFileReader(pathname);259 BufferedReader br = new BufferedReader(reader) //建立一個(gè)對(duì)象,它把文件內(nèi)容轉(zhuǎn)成計(jì)算機(jī)能讀懂的語(yǔ)言
260 ) {261 String line;262 String[][] str= new String[100][2];263 int i =0;264 while ((line = br.readLine()) != null) {265 int j =0;266 StringTokenizer st = new StringTokenizer(line, ":");267 while(st.hasMoreTokens()){268 str[i][j]=st.nextToken();269 j++;270 }271 if (a==Integer.valueOf(str[i][0]) && b==Integer.valueOf(str[i][1])){ //讀取后與獲得的時(shí)間比較,如果鬧鐘存在,就響
272 try{273 InputStream in = new FileInputStream("D://homework//java//Gui//src//Clock//0.wav");//FIlename 是你加載的聲音文件如(“game.wav”)
274 AudioStream as = new AudioStream(in); //和讀取文件類似的原理,經(jīng)翻譯之后才播放出來(lái)
275 AudioPlayer.player.start(as); //用靜態(tài)成員player.start播放音樂(lè)
276 } catch(FileNotFoundException e){277 System.out.print("FileNotFoundException ");278 } catch(IOException e){279 System.out.print("有錯(cuò)誤!");280 }281 }282 i++;283 j = 0;284 }285 } catch(IOException z) {286 z.printStackTrace();287 }288 }289
290 //初始化界面
291 public voidlaunchFrame(){292 xx = new JPanel(); //插入一個(gè)面板
293 String[] hours = new String[24]; //長(zhǎng)度為24的數(shù)組用于存儲(chǔ)小時(shí)
294 for (int i = 0; i < hours.length; i++) {295 hours[i]=i+""; //循環(huán)對(duì)hour進(jìn)行賦值
296 }297 ho = new JComboBox(hours); //將hour加入到下拉框中
298 ho.setSize(50,40); //設(shè)置大小好像沒(méi)用
299 String[] mins = new String[60]; //同理,這是分鐘的地方
300 for (int i = 0; i < mins.length; i++) {301 mins[i]=i+""; //分鐘賦值
302 }303 mi = new JComboBox(mins); //分鐘下拉框
304 mi.setSize(50,40);305 tjnz = new JButton(); //添加鬧鐘的按鈕,拼音首字母
306 tjnz.setText("添加到鬧鐘"); //按鈕上顯示的文字
307 tjnz.setSize(100,40);308 schour = new JButton(); //刪除鬧鐘的按鈕
309 schour.setText("從鬧鐘中刪除"); //按鈕上顯示的文字
310 schour.setSize(100,40);311
312 /**
313 * 將按鈕下拉框啥的加入到面板中314 */
315 xx.add(ho);316 xx.add(mi);317 xx.add(tjnz);318 xx.add(schour);319 this.add(xx); //將面板加入到this對(duì)象中,要不然面板就不顯示
320 tjnz.addActionListener(new ActionListener() { //添加按鈕的功能
321 @Override //重寫(xiě)的標(biāo)識(shí),務(wù)必要會(huì)
322 public voidactionPerformed(ActionEvent e) {323 //TODO Auto-generated method stub
324 HOUR =Integer.valueOf(ho.getSelectedIndex());325 MIN = Integer.valueOf(mi.getSelectedIndex()); //獲取到時(shí)分后
326 writeFile(); //寫(xiě)入txt文件保存為鬧鐘
327 readFile(); //再讀取,這樣才能時(shí)時(shí)更新面板上的全部鬧鐘
328 }});329
330 schour.addActionListener(newActionListener() {331 @Override332 public voidactionPerformed(ActionEvent e) {333 //TODO Auto-generated method stub
334 HOUR =Integer.valueOf(ho.getSelectedIndex());335 MIN =Integer.valueOf(mi.getSelectedIndex());336 shanchuFile(); //這里是刪除鬧鐘的按鈕功能
337 readFile();338 }});339
340 this.setTitle("小鬧鐘"); //設(shè)置窗口標(biāo)題
341 this.setVisible(true); //設(shè)置窗口不隱身
342 this.setSize(700,500); //設(shè)置窗口大小
343 this.setLocation(500, 250); //設(shè)置窗口位置,相對(duì)于桌面左上角
344 this.init(); //調(diào)用初始化函數(shù)進(jìn)行初始化
345 this.alert();346 //this.run();//重復(fù)調(diào)用run()方法結(jié)果是秒針一次走12°
347 this.addWindowListener(newWindowAdapter() {348 @Override349 public voidwindowClosing(WindowEvent e) {350 System.exit(0);351 }352 }); //設(shè)置窗口叉號(hào)的功能,點(diǎn)擊就關(guān)閉程序
353 }354
355
356
357 public static voidmain(String[] args) {358 ClockTry c = new ClockTry(); //main方法,必有的成分,創(chuàng)建主類對(duì)象,
359 c.launchFrame(); //調(diào)用初始化面板的方法,簡(jiǎn)化了本該在main方法中寫(xiě)的代碼
360
361 }}
總結(jié)
以上是生活随笔為你收集整理的java 闹钟代码_JAVA可视化闹钟源码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python魔法方法好难_一篇干货好文,
- 下一篇: 原创:叫板华为?魅族16周年新机即将发布