辽 宁 工 业 大 学
JAVA程序设计 课程设计(论文)
题目: 万年历设计
院(系): 软件学院
专业班级: 计算机网络技术072班
学 号: 071406066
学生姓名: 任奚南
指导教师: 赵 锦
教师职称: 助 教
起止时间: 2008.5.26至2008.6.8
程序设计专题(报告)任务及评语
院(系):软件学院 教研室:软件教研室
学 号 | 071406066 | 学生姓名 | 任奚南 | 专业班级 | 计算机网络技术072班 | |
程序设计(报告)题目 | 万年历设计 | |||||
程序设计(报告)任务 | 程序设计专题的任务与要求: (1)掌握Java编程、面向对象的基础知识。 (2)较熟练地编写Java应用程序Application。 (3)了解Java的常用标准类库、编程技巧、异常处理。 (5)联系已学过的内容,巩固所学的理论,增强独立工作能力。 (6)通过设计主要使学生有一个独立编写程序的过程,对理论学习及动手能力都有一个很大的提高。 (7)通过本次设计,进一步培养学生热爱专业的思想,同时对本专业综合素质的提高起一个积极的推动作用。 课程设计过程中,要严格遵守实践环节的时间安排,听从指导教师的指导。正确地完成上述内容,记录实习日记,规范完整地撰写出课程设计报告。 | |||||
指导教师评语及成绩 | 成绩: 指导教师签字: 2008 年 6 月 9 日 | |||||
目 录
第1章 课程设计的目的与要求 1
1.1 课程设计目的 1
1.2 课程设计的实验环境 1
1.3 课程设计的预备知识 1
1.4 课程设计要求 1
第2章 课程设计内容 2
2.1课程设计主要内容 2
2.2概要设计 2
2.2.1自定义类说明 2
2.3详细设计 5
2.4测试分析 11
2.4.1程序运行情况 11
2.4.2程序异常处理 13
第3章 课程设计总结 14
参考资料 15
《JAVA程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JAVA程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。
硬件要求能运行Windows 9.X操作系统的微机系统。JAVA程序设计语言及相应的集成开发环境,J2SDK和ECLIPSE开发工具。
熟悉JAVA语言及ECLIPSE开发工具。
按课程设计指导书提供的课题,要求学生在自行完成各个操作环节,并能实现且达到举一反三的目的,完成一个项目解决一类问题。要求学生能够全面、深入理解和熟练掌握所学内容,并能够用其分析、设计和解答类似问题;对此能够较好地理解和掌握,能够进行简单分析和判断;能编写出具有良好风格的程序;掌握JAVA程序设计的基本技能和面向对象的概念和方法;了解多线程、安全和网络等编程技术。同时培养学生进行分析问题、解决问题的能力;培养学生进行设计分析、设计方法、设计操作与测试、设计过程的观察、理解和归纳能力的提高。
本次课程设计的主要内容是编写一个万年历程序,主要目的是加强对Java的实际运用,了解图形用户界面的基本组件窗口、按纽(JButton)、标签(JLabel)、下拉表组件(JComboBox)、文本框(TextBox)、选择框、查询事件的处理,菜单的设计还有日期的计算等的使用方法,了解如何使用布局管理器对组件进行管理,以及如何使用Java的事件处理机制。
万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查找,通过在年份对应的下拉菜单中选择要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。此外,还可以显示出数字时间,很方便用户的查询。
本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。
本程序涉及三个类,MainFrame为显示日期部分的类,是程序中的主类,ClockAction
是对所要查询的年份及其月份进行选择的类,Clock是对当前时间进行显示的类,位与整个界面的底部,程序运行时,只要运行MainFrame即可显示出日期以及时间的详细信息。以下是对这三个类的具体说明。
(1) 类名:ClockAction
作用:获取当前下拉列表中所选择的信息
实现的接口: ActionListener
ActionListener用于接收操作事件的侦听器接口。使用该类创建的对象可使用组件的 addActionListener 方法向该组件注册。在发生操作事件时,调用该对象的 actionPerformed 方法。ActionEvent指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件生成此高级别事件。事件被传递给每一个 ActionListener 对象,这些对象是使用组件的 addActionListener 方法注册的,用以接收这类事件。
具体说明如下:
//对当前所选年份、月份的查询
class ClockAction implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
int c_year, c_month, c_week;
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
}
}
(2) 类名:MainFrame
作用:主类
继承的父类:JFrame
实现的接口:没有
JFrame是MainFrame的父类,当用户试图关闭窗口时,JFrame 知道如何进行响应。用户关闭窗口时,默认的行为只是简单地隐藏 JFrame。在多屏幕环境中,可以在不同的屏幕设备上创建一个 JFrame。
主要方法说明:
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
}
(3) 类名:Clock
作用:显示时间的类
继承的父类:Canvas
实现的接口:Runnable
Canvas是Clock的父类,它表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件。Runnable接口由Clock类来实现,设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。
主要方法说明:
//用来显示时间的方法
public void paint(Graphics g){
Font f=new Font("宋体",Font.BOLD,16);
SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化时间显示类型
Calendar now=Calendar.getInstance();
time=SDF.format(now.getTime()); //得到当前日期和时间
g.setFont(f);
g.setColor(Color.orange);
g.drawString(time,45,25);
}
}
成员变量表
表1MainFrame成员变量 | ||
成员变量描述 | 变量类型 | 名称 |
文件 | File | File |
文本区 | JTextArea | Textarea |
单选按钮菜单项 | JRadioButtonMenuItem | Rbmi_red,rbmi_blue,rbmi_gree rbmi_pink,rbmi_yellow |
菜单项 | JMenuItem | menuitem_copy,menuitem_cut, menuitempaste,menuitem_seek |
字体菜单项 | JMenuItem | menuitem_song,menuitem_fang menuitem_hua,menuitem_kai |
字形菜单项 | JMenuItem | menuitem_normal, menuitem_bold, menuitem_italic |
字号菜单项 | JMenuItem | menuitem_20,menuitem_30, menuitem_40,menuitem_50, |
菜单 | JMenuItem | menuitem_exit, menuitem_infor |
快捷菜单 | JPopupMenu | Popupmenu |
颜色菜单项 | JMenuItem | menuitem_red,menuitem_green menuitem_blue,menuitem_pink menuitem_yellow |
对话框 | JDialog | Dialog,dialog1 |
对话框按钮 | JButton | Button_seek |
查找文本条 | JTextArea | Textfield_seek |
标签 | JLabel | Label_seek,label_infor |
文件名 | String | Seek |
本程序包括两部分,一部分是MainFrame.java,用来显示日期,另一部分是Clock.java,用来显示时间。编写程序时,首先创建MainFrame类,在MainFrame类中编写显示日期的代码,再创建Clock类,再向Clock类中编写显示时间的代码,把MainFrame类和Clock类放在同一个项目中,运行程序时,只需运行MainFrame即可显示出所有信息,此时,在界面上会显示出相应的日期,同时,在界面的底部会显示出当前的时间。
以下是程序的第一部分,也是程序的主体部分。运行时,只要运行MainFrame.java即可实现日期的显示。
程序主要代码如下:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MainFrame extends JFrame {
/** *//**
*
*/
private static final long serialVersionUID = 1L;
JPanel panel = new JPanel(new BorderLayout());
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel(new GridLayout(7, 7));
JPanel panel3 = new JPanel();
JLabel[] label = new JLabel[49];
JLabel y_label = new JLabel("年份");
JLabel m_label = new JLabel("月份");
JComboBox com1 = new JComboBox();
JComboBox com2 = new JComboBox();
int re_year, re_month;
int x_size, y_size;
String year_num;
Calendar now = Calendar.getInstance(); // 实例化Calendar
MainFrame() {
super("万年历");
setSize(300, 350);
x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth());
y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight());
setLocation((x_size - 300) / 2, (y_size - 350) / 2);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.add(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
for (int i = 0; i < 49; i++) {
label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中
panel2.add(label[i]);
}
panel3.add(new Clock(this));
panel.add(panel1, BorderLayout.NORTH);
panel.add(panel2, BorderLayout.CENTER);
panel.add(panel3, BorderLayout.SOUTH);
panel.setBackground(Color.white);
panel1.setBackground(Color.white);
panel2.setBackground(Color.white);
panel3.setBackground(Color.white);
Init();
com1.addActionListener(new ClockAction());
com2.addActionListener(new ClockAction());
setContentPane(panel);
setVisible(true);
setResizable(false);
}
class ClockAction implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
int c_year, c_month, c_week;
c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份
c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11
c_week = use(c_year, c_month); // 调用函数use,得到星期几
Resetday(c_week, c_year, c_month); // 调用函数Resetday
}
}
public void Init() {
int year, month_num, first_day_num;
String log[] = { "日", "一", "二", "三", "四", "五", "六" };
for (int i = 0; i < 7; i++) {
label[i].setText(log[i]);
}
for (int i = 0; i < 49; i = i + 7) {
label[i].setForeground(Color.red); // 将星期日的日期设置为红色
}
for (int i = 6; i < 49; i = i + 7) {
label[i].setForeground(Color.green);// 将星期六的日期设置为绿色
}
for (int i = 1; i < 10000; i++) {
com1.addItem("" + i);
}
for (int i = 1; i < 13; i++) {
com2.addItem("" + i);
}
month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份
year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份
com1.setSelectedIndex(year - 1); // 设置下拉列表显示为当前年
com2.setSelectedIndex(month_num); // 设置下拉列表显示为当前月
first_day_num = use(year, month_num);
Resetday(first_day_num, year, month_num);
}
public int use(int reyear, int remonth) {
int week_num;
now.set(reyear, remonth, 1); // 设置时间为所要查询的年月的第一天
week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期
return week_num;
}
@SuppressWarnings("deprecation")
public void Resetday(int week_log, int year_log, int month_log) {
int month_day_score; // 存储月份的天数
int count;
month_day_score = 0;
count = 1;
Date date = new Date(year_log, month_log + 1, 1); // now
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1); // 前个月
month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
for (int i = 7; i < 49; i++) { // 初始化标签
label[i].setText("");
}
week_log = week_log + 6; // 将星期数加6,使显示正确
month_day_score = month_day_score + week_log;
for (int i = week_log; i < month_day_score; i++, count++) {
label[i].setText(count + "");
}
}
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
new MainFrame();
}
}
这一部分是程序中用来显示当前时间的。用户查询日期的同时,还可以相应的显示出当前的时间,使用更方便。
程序主要代码如下:
2.Clock.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Date;
import java.util.Calendar;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
//显示时间的类:Clock
/** *//**
* Clock.java
* Summary 数字时间显示
* Created on
* @author
* remark
*/
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Calendar;
class Clock extends Canvas implements Runnable{
/** *//**
*
*/
private static final long serialVersionUID = 3660124045489727166L;
MainFrame mf;
Thread t;
String time;
public Clock(MainFrame mf){
this.mf=mf;
setSize(280,40);
setBackground(Color.white);
t=new Thread(this); //实例化线程
t.start(); //调用线程
}
public void run(){
while(true){
try
{
Thread.sleep(1000); //休眠1秒钟
}catch(InterruptedException e){
System.out.println("异常");
}
this.repaint(100);
}
}
public void paint(Graphics g){
Font f=new Font("宋体",Font.BOLD,16);
SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");
//格式化时间显示类型
Calendar now=Calendar.getInstance();
time=SDF.format(now.getTime()); //得到当前日期和时间
g.setFont(f);
g.setColor(Color.orange);
g.drawString(time,45,25);
}
}
程序正常运行时,显示当前的年份,月份,日期以及数字时间。如果想要实现对指定日期的查询,可在“年份”对应的下拉框中选择所要查询的年,在“月份”对应的下拉框中选择所要查询的月即可。例如:查询2008年5月30日是星期几。即在“年份”对应的下拉列表中选择2008,在“月份”对应的下拉列表中选择5,通过选择,即可实现对日期的查询,查询后的结果,如图2.4.1所示,通过此程序,还可对其他时间查询,按照查询要求进行选择。
图2.4.1 选择“年份”、“月份”
按照要求输入相应的查询条件后,界面上即可显示所要查询的日期以及对应显示当前的详细时间。如图2.4.2所示。这样,便可以对任何日期进行查询了,为使用者提供了很大的帮助。
图2.4.2 显示所选日期
异常是指程序运行过程中出现的非正常现象,如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。由于异常是运行过程中不可避免的,所以,开发应用程序时要充分考虑各种以外情况,使程序具有较强的容错能力,这重对异常情况进行处理的技术称为异常处理。
程序运行中将可能发生异常的程序代码放置在try程序块中,程序运行过程中,如果该块内的代码没有出现任何异常,将正常执行,后面的各catch块不起任何作用。但如果该块内的代码出现了异常,系统将终止try块代码的执行,自动跳转到所发生的异常类对应的catch块中,执行该块中的代码。
本程序中利用Clock类中的run方法来处理运行时出现的异常,当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。有时候,一种方法可能希望测试当前线程是否已被中断,如果已被中断,则立即抛出此异常。利用try……catch来捕获出现的异常。
异常处理如下:
public void run(){
while(true){
try{
Thread.sleep(1000); //休眠1秒钟
}catch(InterruptedException e){
System.out.println("异常");
}
this.repaint(100);
}
}
Java 语言是解释执行的高级编程语言,是面向对象的程序设计语言,功能强大,它是解释执行的,能跨平台使用。具有较高的性能和高度的安全性,Java程序的三级代码安全检查机制可以有效的防止非法代码的入侵,阻止对内存的越权访问,能够避免病毒的侵害,成为Internet上最安全的技术之一。并且支技多线程,可使用户程序并行执行,即有内存垃圾自动收集机制。Java语言是一种“直译”式语言,即用Java编写的程序首先被编译成字节码,再通过JVM解释成机器码,字节码是Java 专有的一种中间码,必须通过JVM来解释才能运行。在不同的平台上,Java有不同的JVM,使用Java 字节码可以跨越平台的限制,在不同的平台上运行。经过了一个学期对《Java程序设计》的学习,我们学习了理论知识,了解了Java语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。
经过这次课程设计使我对JAVA图形用户界面的有关知识有了更深入了解,如几种布局管理器的使用方法,事件的处理机制,SWING的基本体系结构,SWING组件的使用方法,多媒体的实现手段等知识。完成了简单的万年历功能,本次课程设计的主要内容就是设计一个可以查询日期的程序,通过选择下拉列表中的年份以及月份来实现日期的查询,通过它可以查询到日期的一些具体信息,可以查询所选日期是星期几,还对星期六与星期日有特殊颜色的标记,方便查看。此外,还可以实现显示数字时间的功能,简单实用。通过课程设计,能够达到全面、深入理解和掌握所学内容,能够进行简单的分析和判断。这次课程设计,虽说在设计过程中遇到了很多的困难,但是在老师的细心指导下,很多不会的问题都迎刃而解了。此次课程设计一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。是对自己学习的一次很好的检验。能完成这次的课程设计,和身边的同学和老师的帮助分不开的。在此对指导老师表示感谢,还有帮助过我的一些同学,在此也表示谢意。在今后的学习中我也会更加努力的。
[1] 丁振凡 Java语言实用教程 北京:北京邮电大学出版社 2005.6
[2] 陈轶,姚晓昆 Java程序设计实验指导 北京:清华大学出版社 2006.5
[3] 赵文靖 Java程序设计基础与上机指导 北京:清华大学出版社 2006.10
[4] 赵毅 跨平台程序设计语言—Java 西安:西安电子科技大学出版社 2006.7
[5] 王路群 Java高级程序设计 北京:中国水利水电出版社 2006.8
[6] 朱福喜 Java语言习题与解析 北京:清华大学出版社 2006.3
[7] 吴其庆 Java程序设计实例教程 北京:冶金工业出版社 2006.11
[8] 柳西玲,许斌 Java语言应用开发基础 北京:清华大学出版社 2006.2
[9] 施霞萍等 Java程序设计教程 第2版 北京:机械工业出版社 2006.6
[10] 宛延闿等 实用Java程序设计教程 北京:机械工业出版社 2006.1
[11] 陈国君等 Java2程序设计基础 北京:清华大学出版社 2006.8
[12] 郑莉,王行言,马素霞 Java语言程序设计 北京:清华大学出版社 2006.12
本文来源:https://www.2haoxitong.net/k/doc/91d0dafdf61fb7360b4c651a.html
文档为doc格式