您的当前位置:首页正文

Java时钟软件设计报告

2024-10-18 来源:威能网


佛山科学技术学院

《可视化编程技术》课程设计报告

时钟软件设计

学生姓名: *** 学 号: **********

年级专业: 11级教育技术学2班 指导老师: *** 学 院: 教育科学学院

广东★佛山 提交日期:2013年6月

目 录

1. 前言………………………………………………………………………………2 2.概要设计…………………………………………………………………………3 2.1 开发环境 ……………………………………………………………………3 2.2 计算器功能 …………………………………………………………………3 2.3 界面设计 ……………………………………………………………………3 2.4 类的框架结构图 ……………………………………………………………4 3. 详细设计 ………………………………………………………………………4 3.1 使用的JAVA类的说明 ……………………………………………………4 3.2 类的主要方法 ………………………………………………………………5

3.2.1 处理按了运算符后的计算 ……………………………………………5 3.2.2 处理输入字符 …………………………………………………………6 3.2.3 进制的转换 ……………………………………………………………6 3.2.4 设计总体认识 …………………………………………………………7 3.2.5 程序流程图 ……………………………………………………………8 4. 运行结果…………………………………………………………………………8 5. 测试分析…………………………………………………………………………9 5.1 程序运行情况………………………………………………………………9 5.2 程序异常处理………………………………………………………………9 6. 源程序……………………………………………………………………………9 参考文献……………………………………………………………………………27 设计总结……………………………………………………………………………27

1

摘要:本程序在框架中新建一个容器,用GridLayout类对面板进行划分,程

序引入java.util.Date来显示当前时间;用一个永真循环,来对当前时间显示的更新,用java.io.File来实现对文件读写,设计了一个按钮,用来选择文件WAU或MID,用java.applet.Applet 播放音乐文件,用getText()函数获取输入的闹钟设定时间,并永真循环和当前的时间进行对比,若相等则播放音乐,若不相等则显示离目标设定时间的差距.

关键字:java时钟,时钟类,方法,事件

1 前言

随着科学技术的不断发展,计算机已经成为我们工作学习和生活中不可缺少的工具。文本编辑器是个人计算机最司空见惯的应用程序了,在学习了Java语言之后,我决定使用Java语言编写一个简单的时钟,可以清楚地知道时间和设定一个时间来提醒自己,满足日常基本的工作学习和生活需要。

Java是由Sun公司开发的新一代纯面向对象的网络编程语言。其目标是建立一种在任意种机器、任一种操作系统的网络环境中运行的软件,实行所谓的“程序写一次,到处运行”的目标。正因为如此,Java已成为当今Internet上最流行、最受欢迎的一种程序开发语言。

Java开发小组把Java按特性分为基本版、移动版、企业版,每个版本有一个软件开发包。Java基本版本叫Java 2标准版(Java 2 Standard Edition,J2SE),它包含建立Java应用程序或者是Applet所需的应用程序编程接口(API)。Java 2移动版(The Java 2 Mobile Edition,J2ME)包含创建无线Java应用程序的API。还有Java 2企业版(The Java 2 Enterprise,J2EE)是J2SE的增强版本,包含建立多层架构应用程序API。

Java语言是由C++语言发展起而来的,是一种彻底的面向对象的程序设计语言。作为一种纯面向对象的程序设计语言,它非常适合大型软件的开发。Java语言去掉了C++语言的一些容易引起错误的特性。Java语言的特点有:面向对象、跨平台、安全性、多线程和图形功能强。

2

2 概要设计

2.1开发环境

开发平台:Microsoft Windows XP Professional Service Pack 2 开发工具:JBuilder 2007 + JDK 1.6.0_02

2.2时钟功能

功能 1:在时钟面板上,动态显示出当前时间。

功能 2:可以设定闹钟时间 ,且当时间到了设定的闹钟时间时,会播放音乐来提醒。 功能 3: 可以随意解除设定的闹钟时间,再重新设定一个新的时间。 功能4 :按下清除‘开始’键,闹钟就开始设定好了,按“关闭”闹铃就停止。 功能5:界面设计,可模拟真实钟表界面也可以用数字界面显示,美观、实用和个性化。

2.3界面设计

3

图2.3 时钟面板

2.4类的框架结构图

1、画出类的UML简图 Clock类:

Clock类中的变量 ri, shi, fen, miao, dangqian, guanji: JLabel queding, dakai : JButton music, RI, SHI, FEN, MIAO : JTextField

4

h = 0, f = 0, m = 0, r = 0 : int Fo, foo : boolean soumd1 : public AudioClip Clock类中的函数 public clock() public static void main(String agrs[]) public void run()

3详细设计

主要模块算法描述

(1)当前动态时间的显示的设计与实现。 功能:可以实时的更新显示系统完整的时间 算法:引入java.util.Date用while循环更新时间 代码如下:

public void run() { while (true) {

Date now = new Date();//设置一个新的当前时间对象。

dangqian.setText(\"当前时间: \" + now.toString());//显示当前的时间 …

}

(2)音乐文件的选择。

5

功能:用打开按钮实现对本地音乐文件的选择

算法:引入java.io.File和java.net.MalformedURLException 来实现对音乐本地音乐文件的选择。 代码如下:

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)\"; } });

(3)闹铃功能的实现

功能:到达设定闹钟时间,会有输出文字及产生音乐。 算法:读入Clock类中的时间,并设置一个Timer,每隔0.1秒进行比对,如果字符串之间匹配就显示,简化代码如下示意:

public void run() { ……… if (fo) { foo = true;

RI.setEditable(false);//设定之后禁用输入功能 SHI.setEditable(false);

6

FEN.setEditable(false); MIAO.setEditable(false);

queding.setText(\"关闭\");//关闭闹钟设定

SimpleDateFormat ri = new SimpleDateFormat(\"dd\"); // 封装 为了获取日期

SimpleDateFormat shi = new SimpleDateFormat(\"HH\"); // 封装 为了获取小时

SimpleDateFormat fen = new SimpleDateFormat(\"mm\"); // 封装 为了获取分钟

SimpleDateFormat miao = new SimpleDateFormat(\"ss\"); // 封装 为了获取秒钟

riqi = Integer.parseInt(ri.format(now)); // 获取日期

shizhong = Integer.parseInt(shi.format(now)); // 获取小时 fenzhong = Integer.parseInt(fen.format(now)); // 获取分钟 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; foo = false;

} catch (MalformedURLException e) { e.printStackTrace(); } } } try {

Thread.sleep(1000);

} catch (InterruptedException ie) { } } }

 JAVA设计的摘要  JAVA设计的目录结构  JAVA设计的概要和详细设计  JAVA设计的版权意识  JAVA设计需要编译的环境  JAVA设计的实用性

7

4运行结果

图 工作状态显示

{ js();}

catch(This_number_too_big e) {

lab.setText(\"0\"); number=0; mark='n';

8

Refresh=false;

System.out.println(\"The number is too big\"); } //如果出现异常则初始化效果如同clear键

5 .程序分析 遇到问题

5. 1 设置迷你闹钟的界面化时遇到问题通过参考已有的程序加以解决 。 5. 2 设置“闹铃时间”、“开关按钮”、“背景音乐列表框”时 控遇到问题

经过反复修改调试得到解决。

事件的触发和监

5. 3 闹铃背景音乐格式设置遇到问题,经过调试和格式转换解决。

待解决问题

闹钟的思想是“北京时间”

所以背景音乐中有《天涯共此时》音乐

界面上有但反复

北京时间等标识本来想在界面上添加一幅具有北京特色的图片做背景尝试

遗憾的是均未能成功

添加的背景图片总被上层面板遮挡

希望老师给

以指导。

6 程序清单:

import java.awt.*; import java.awt.event.*; import java.util.*; import javax.swing.*; import sun.audio.*; import java.io.*;

public class JavaClock extends JFrame implements ActionListener,Runnable{ /**

Thread thread; * */

private static final long serialVersionUID = -7303693253632593767L;

9

JPanel panel1=new JPanel(); JPanel panel2=new JPanel(); JPanel panel3=new JPanel();

JButton button2=new JButton(\"开闹铃\"); JButton button1=new JButton(\"确定\");

JComboBox sComboBox,mComboBox,hComboBox;

JLabel label1=new JLabel(\":\"); JLabel label2=new JLabel(\":\");

JLabel label3=new JLabel(\"设置闹铃时间:\"); JLabel label4=new JLabel(\"闹铃状态:关\");

Clock clock=new Clock();

boolean flag=false;

int hour=0,minute=0,second=0; int nowsecond,nowminute,nowhour;

AudioData theData=null;

AudioDataStream nowPlaying=null;

public JavaClock(){ setTitle(\"闹钟\");

setResizable(false);//用户不能调整大小 setLocation(450,100);//在屏幕位置 setSize(400,500);

10

setVisible(true);

setDefaultCloseOperation(EXIT_ON_CLOSE);//按窗口关闭按钮时退出程序 setLayout(new BorderLayout()); add(clock,BorderLayout.NORTH);

sComboBox=new JComboBox(); mComboBox=new JComboBox(); hComboBox=new JComboBox();

for(int i=0;i<60;i++){ sComboBox.addItem(i); mComboBox.addItem(i); }

for(int i=0;i<24;i++){ hComboBox.addItem(i); }

button1.addActionListener(this); button2.addActionListener(this);

label3.setFont(new Font(\"楷体_GB2312\ panel1.add(label3); panel1.add(hComboBox); panel1.add(label1); panel1.add(mComboBox); panel1.add(label2); panel1.add(sComboBox); panel1.add(button1);

label4.setFont(new Font(\"楷体_GB2312\ label4.setForeground(Color.red); panel2.add(label4);

11

panel2.add(button2);

panel3.setLayout(new BorderLayout()); panel3.add(panel1,BorderLayout.NORTH); panel3.add(panel2,BorderLayout.CENTER); add(panel3,BorderLayout.CENTER); pack();//自动调整窗口大小 thread=new Thread(this); thread.start(); }

public void actionPerformed(ActionEvent ae){

if(ae.getSource()==button2){ if(flag){ //闹铃开

button2.setText(\"开闹铃\"); label4.setText(\"闹铃状态:关\"); flag=false; stop(); } else{ //闹铃关

button2.setText(\"关闹铃\");

label4.setText(\"闹铃状态:开\"+hour+\":\"+minute+\":\"+second); flag=true; } }

if(ae.getSource()==button1){

铃时间:12

闹 hour=Integer.valueOf(hComboBox.getSelectedItem().toString());

minute=Integer.valueOf(mComboBox.getSelectedItem().toString());

second=Integer.valueOf(sComboBox.getSelectedItem().toString());

button2.setText(\"关闹铃\");

label4.setText(\"闹铃状态:开 闹铃时间:\"+hour+\":\"+minute+\":\"+second); flag=true; } }

public void run(){ while(true){ if(flag){

Calendar time=Calendar.getInstance(); nowsecond=time.get(Calendar.SECOND); nowminute=time.get(Calendar.MINUTE); nowhour=time.get(Calendar.HOUR_OF_DAY);

if(second==nowsecond&&minute==nowminute&&hour==nowhour){ //闹铃响

play(\"sound.wav\"); } } try{

Thread.sleep(500);

}catch(InterruptedException e){break;} } }

13

//播放音乐

public void play(String str){ try{

InputStream fis=this.getClass().getResourceAsStream(str); AudioStream as=new AudioStream(fis);//音频文件流 theData=as.getData();//取得音乐文件的数据 }catch(IOException e){ System.err.println(e); }

if(theData!=null){ stop();

ContinuousAudioDataStream

ContinuousAudioDataStream(theData);//不间断地循环播放 AudioPlayer.player.start(cads); nowPlaying=cads; } }

//停止播放

public void stop(){

AudioPlayer.player.stop(nowPlaying); }

public static void main(String[] args){ new JavaClock(); } }

cads=new

14

//时钟类

class Clock extends Canvas implements Runnable{ /** * */

private static final long serialVersionUID = -8190862918726517275L;

Thread threadClock;

int centerX,centerY,diameter;//圆心坐标、直径 Image imageBuffer;

public Clock(){

centerX=centerY=200; diameter=300; setSize(400,400);

threadClock=new Thread(this); threadClock.start(); }

public void run(){ while(true){ repaint(); try{

Thread.sleep(100);

}catch(InterruptedException e){break;} } }

15

//画表

public void update(Graphics g){ Color backColor=Color.DARK_GRAY; Color hHandColor=Color.yellow; Color mHandColor=Color.green; Color sHandColor=Color.red; Color hPointColor=Color.red; Color mPointColor=Color.orange; //获得系统时间

Calendar time=Calendar.getInstance(); int second=time.get(Calendar.SECOND); int minute=time.get(Calendar.MINUTE); int hour=time.get(Calendar.HOUR_OF_DAY); if(hour>=12){

hour-=12; } //画表盘

imageBuffer=createImage(400,400);//不能在外面实例化 Graphics graphBuffer=imageBuffer.getGraphics(); graphBuffer.setColor(backColor); graphBuffer.fillRect(0, 0, 400, 400); double radius=(diameter>>1)*0.9; //画刻度

for(int i=1;i<=12;i++){

double buffer=Math.PI*(0.5-i/6.0);

int posX=(int)Math.floor(centerX+radius*Math.cos(buffer)); int posY=(int)Math.floor(centerY+radius*Math.sin(buffer)); graphBuffer.setColor(hPointColor);

graphBuffer.fill3DRect(posX-4, posY-4, 8, 8, true);

16

}

for(int i=1;i<60;i++){ if((i%5)!=0){

double buffer=Math.PI*i/30.0;

int posX=(int)Math.floor(centerX+radius*Math.cos(buffer)); int posY=(int)Math.floor(centerY+radius*Math.sin(buffer)); graphBuffer.setColor(mPointColor);

graphBuffer.fill3DRect(posX-4, posY-4, 3, 3, false); } } //画数字

graphBuffer.setFont(new Font(\"TimesRoman\ graphBuffer.setColor(Color.yellow);

graphBuffer.drawString(\"9\ graphBuffer.drawString(\"3\ graphBuffer.drawString(\"12\ graphBuffer.drawString(\"6\

//指针半径

double Sradius=(diameter>>1)*0.90; double Mradius=(diameter>>1)*0.80; double Hradius=(diameter>>1)*0.70;

double posSecond=Math.PI*second/30.0;//秒针走过弧度

double posMinute=Math.PI*(minute/30.0+second/1800.0);//分针走过弧度 double posHour=Math.PI*(hour/6.0+minute/360.0);//时针走过弧度 //画指针

graphBuffer.setColor(hHandColor); graphBuffer.drawLine(centerX-3,

(int)(Math.round(centerX+Hradius*Math.sin(posHour))),

17

centerY-3,

(int)(Math.round(centerY-Hradius*Math.cos(posHour)))); graphBuffer.drawLine(centerX+3,

(int)(Math.round(centerX+Hradius*Math.sin(posHour))), (int)(Math.round(centerY-Hradius*Math.cos(posHour)))); graphBuffer.setColor(mHandColor); graphBuffer.drawLine(centerX-2,

(int)(Math.round(centerX+Mradius*Math.sin(posMinute))), (int)(Math.round(centerY-Mradius*Math.cos(posMinute)))); graphBuffer.drawLine(centerX+2,

(int)(Math.round(centerX+Mradius*Math.sin(posMinute))), (int)(Math.round(centerY-Mradius*Math.cos(posMinute)))); graphBuffer.setColor(sHandColor); graphBuffer.drawLine(centerX,

(int)Math.round(centerX+Sradius*Math.sin(posSecond)), (int)Math.round(centerY-Sradius*Math.cos(posSecond)));

graphBuffer.fillOval((int)Math.round(centerX+Sradius*Math.sin(posSecond))-5, (int)Math.round(centerY-Sradius*Math.cos(posSecond))-5,10,10); graphBuffer.fillOval(centerX-5, centerY-5, 10, 10); //画数字时钟

graphBuffer.setColor(Color.white);

graphBuffer.drawString(time.get(Calendar.HOUR_OF_DAY)+\":\"+minute+\":\"+second, centerX-50, centerY+80);

//画完图片后,把图片载入画布 paint(g); }

public void paint(Graphics g){

g.drawImage(imageBuffer,0,0,null); //在画布上加入图片

18

centerY+3,

centerY-2,

centerY+2,

centerY,

} }

参考文献 [1] 耿祥义张跃平, java大学实用教程. 电子工业出版社,

java课程课件

第二版. 2008年9月 [2]梁春燕

计总结(自己所做的主要工作与体会)

设经过这次短短的一个礼拜的课程设计,发现自己的整体面向对象的编程能力大大提高,虽然相对于以前的实验更复杂,不过加强了对GUI、线程的等程序的练习。由于这次课程设计安排的时间不是很足够,对于一个要给别人用的软件来比较的话,在很多功能上还需加强。虽然在设计的时候有遇到过很多困难和错误,但我觉得能够完成这次的课程设计,确实有了很大的进步与收获。

19

因篇幅问题不能全部显示,请点此查看更多更全内容