湖南第一师范学院信息科学与工程系
课程设计报告
题 目 JAVA简易时间日历程序 学生姓名 邹跃玲 学 号 0307307016 专业班级 07计算机应用技术一班 指导教师 伍智平
2009 年 12 月 18 日
目 录
1. 课程设计任务书„„„„„„„„„„„„„„第 2页 2. 题目说明„„„„„„„„„„„„„„„„„第 4页 3. 系统设计„„„„„„„„„„„„„„„„„第 4页 4. 类及接口描述„„„„„„„„„„„„„„„第 5页 5. 运行结果„„„„„„„„„„„„„„„„„第 7页 6. 程序源代码„„„„„„„„„„„„„„„„第 8页 7. 总 结„„„„„„„„„„„„„„„„„„第17页 8. 参考文献„„„„„„„„„„„„„„„„„第18页
共19页 第1页
2007级计算机应用专业《Java课程设计》
安排计划书
指导老师:伍智平 指导方式:集体辅导、分组讨论研究
一、 课程设计教学目的及基本要求
1、 培养的Java语言与算法设计方法,具备初步的分析和设计能力; 2、 学习软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3、 训练综合运用所学的理论知识和方法进行分析和解决问题的能力; 4、 训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。 5、 设计的题目要求达到一定工作量,程序能够运行,并对标准的测试数据有正确的输出结果。 6、 按《湖南第一师范学院信息科学与工程系课程设计报告写作规范》要求的书写格式编写出课程设计报告书,报告书不少于8页(代码不算)。
二、 计划安排
1、 任务书下达时间:第15周 2、 任务讲解与动员:第15周 3、 任务设计与辅导:
辅导教师:伍智平
辅导形式:以学生自行设计为主,教师现场解答学生疑难问题。 纪律要求:上课前学生签到,课后学习委员交名单给老师。
4、完成时间:第16周星期四
三、课程设计课题与安排
每位学生在下面列出的设计题目中选择其中的一个完成:
课题详细要求:参见教材13.2节《课程设计的要求和选题》(P408~413)
共19页 第2页
五、提交成果
1、《课程设计报告》(电子版和打印版,格式参照《湖南第一师范学院信息科学与工程系课程设计报告写作规范》)(注意:报告中一定要包括课程设计任务书,课程设计任务书的格式参加本文档的附件1) 2、源代码(电子版和打印版)
六、成绩评定
1、根据平时上机考勤(考勤20分);注重平时上机成绩,教师要不定期检查学生进度,学生不得以自己有私人电脑为借口而不来上机。
2、根据程序运行结果(上机演示30分); 3、 根据《Java课程设计报告》,学生能对自己的程序面对教师提问并能熟练地解释清楚(报告50分)
4、无报告书者或者答辩不通过者,课程设计记0分。
指导教师:伍智平 2009年12月10日
共19页 第3页
课程设计题目
2. 题目说明
通过编写一个基于JAVA的应用系统综合实例,自定义一个日历组件显示日期和时间并进行适当的功能扩充,实践Java语言编程技术。
3. 系统设计
2.1 设计目标
一个完整的程序应具有以下功能: 1)显示当月日历、当前日期、当前时间; 2)可查寻任意月以及任意年的日历; 3)使用图形化界面能够弹出对话框; 5)正常退出程序。 2.2 设计思想
设计一个类用来构成日历系统的主窗口,然后编写一个框架类显示时间和提示信息。在设计中应用了多种容器和控件。 2.3 系统模块划分
public static class CalendarTable(日历类) public class MyCalendar extends JApplet (主日历框架类) public static void main(String[] args) public static class RollbyJFrame (滚动时间类) 共19页 第4页
图1:简易日历的程序结构图
2.3.1 初始化:
public void init()完成界面初始化,形成一个以挂历形式显示当前日期的窗口。 2.3.2 日历描述:
(1)public void updateView()改变日期后完成更新界面;
(2)抽象类java.util.Calendar获取系统日期并传递日期数据而且在人工改变日期后得出当天是周几;
(3)public static void main(String[] args) 主函数完成系统各算法的调用并对主窗口的一些属性进行设置; 2.3.3 滚动时间:
将时间以文本的形式在文本框中滚动播出,并能改变滚动的速度。
4. 使用类及接口
仅仅简单说明类的功能,详细资料请参看 《JavaTM 2 Platform Standard Ed. 6》的电子文档,常规的接口与包则省略不屑。 //以下是日历程序块中使用的类 package fancy; import java.awt.*; import java.awt.event.*;
import java.util.*; //主要用此包中的日期和时间类 import javax.swing.*; import javax.swing.event.*; import javax.swing.table.*;
共19页 第5页
//以下是对滚动时间程序块所使用的类和接口, 用到定时器类Timer import java.awt.Color; import java.awt.FlowLayout;
import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.FocusListener;、 //用于监听鼠标单击(焦点改变)事件
import java.awt.event.FocusEvent; //用于响应鼠标单击(焦点改变)事件、
import javax.swing.JFrame; import javax.swing.JTextField; import javax.swing.JSpinner;
//让用户从一个有序序列中选择一个数字或者一个对象值的单行输入字段。
import javax.swing.JPanel; import javax.swing.Timer;
//在指定时间间隔触发一个或多个 ActionEvent, 创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。并配合事件支持时间的滚动播放。
import javax.swing.event.ChangeListener; import javax.swing.event.ChangeEvent;
共19页 第6页
5. 运行结果与分析
图2:初始界面显示日历。
图3:点击查看时间按钮, 弹出时间消息对话框。
图4:滚动显示当前时间。
共19页 第7页
6. 程序源代码
/**
* @(#) MyCalendar.java * @author fancy */
//日历使用的类
import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.FlowLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.util.Calendar; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel;
import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JSpinner; import javax.swing.JTable; import javax.swing.JTextField;
import javax.swing.ListSelectionModel; import javax.swing.Timer;
import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableModel; //日历
public class MyCalendar extends JApplet {
public static final String WEEK_SUN = \"SUN\"; public static final String WEEK_MON = \"MON\"; public static final String WEEK_TUE = \"TUE\";
共19页 第8页
public static final String WEEK_WED = \"WED\"; public static final String WEEK_THU = \"THU\"; public static final String WEEK_FRI = \"FRI\"; public static final String WEEK_SAT = \"SAT\"; public static final Color background = Color.yellow; public static final Color foreground = Color.black; public static final Color headerBackground = Color.blue;
public static final Color headerForeground = Color.white;
public static final Color selectedBackground = Color.blue;
public static final Color selectedForeground = Color.white;
private JPanel cPane;
private JLabel yearsLabel; private JSpinner yearsSpinner; private JLabel monthsLabel;
private JComboBox monthsComboBox; private JTable daysTable;
private AbstractTableModel daysModel; private Calendar calendar; private JButton button1; public MyCalendar() {
cPane = (JPanel) getContentPane(); }
public void init() {
cPane.setLayout(new BorderLayout()); calendar = Calendar.getInstance(); calendar = Calendar.getInstance();
JButton button1=new JButton(\" 单击此处 查看时间 \");
button1.setBounds(10,10,10,10);
cPane.add(button1,BorderLayout.SOUTH); button1.addActionListener(
new java.awt.event.ActionListener()
{public void actionPerformed(ActionEvent e) { RollbyJFrame myrili=new RollbyJFrame();
JOptionPane.showMessageDialog(null, \"您点击了\"+e.getActionCommand().toString()+\"按钮\");
共19页 第9页
}
} );
yearsLabel = new JLabel(\"Year: \"); yearsSpinner = new JSpinner(); yearsSpinner.setEditor(new
JSpinner.NumberEditor(yearsSpinner, \"0000\")); yearsSpinner.setValue(new
Integer(calendar.get(Calendar.YEAR))); yearsSpinner.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.YEAR, ((Integer) yearsSpinner.getValue()).intValue()); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView(); } });
JPanel yearMonthPanel = new JPanel(); cPane.add(yearMonthPanel, BorderLayout.NORTH);
yearMonthPanel.setLayout(new BorderLayout()); yearMonthPanel.add(new JPanel(), BorderLayout.CENTER);
JPanel yearPanel = new JPanel(); yearMonthPanel.add(yearPanel, BorderLayout.WEST);
yearPanel.setLayout(new BorderLayout());
yearPanel.add(yearsLabel, BorderLayout.WEST);
共19页 第10页
yearPanel.add(yearsSpinner, BorderLayout.CENTER);
monthsLabel = new JLabel(\"Month: \"); monthsComboBox = new JComboBox(); for (int i = 1; i <= 12; i++) {
monthsComboBox.addItem(new Integer(i)); }
monthsComboBox.setSelectedIndex(calendar.get(Calendar.MONTH));
monthsComboBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent actionEvent) { int day = calendar.get(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.MONTH, monthsComboBox.getSelectedIndex()); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH, day > maxDay ? maxDay : day);
updateView(); } });
JPanel monthPanel = new JPanel(); yearMonthPanel.add(monthPanel, BorderLayout.EAST);
monthPanel.setLayout(new BorderLayout()); monthPanel.add(monthsLabel, BorderLayout.WEST);
monthPanel.add(monthsComboBox, BorderLayout.CENTER);
daysModel = new AbstractTableModel() { public int getRowCount() { return 9; }
共19页 第11页
public int getColumnCount() { return 7; }
public Object getValueAt(int row, int column) {
if (row == 0) {
return getHeader(column); }
row--;
Calendar calendar = (Calendar) MyCalendar.this.calendar.clone();
calendar.set(Calendar.DAY_OF_MONTH, 1); int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int index = row * 7 + column; int dayIndex = index - moreDayCount + 1;
if (index < moreDayCount || dayIndex > dayCount) {
return null; } else {
return new Integer(dayIndex); } } };
daysTable = new CalendarTable(daysModel, calendar);
daysTable.setCellSelectionEnabled(true);
daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() { public Component getTableCellRendererComponent(JTable table, Object
共19页 第12页
value, boolean isSelected,
boolean hasFocus, int row, int column) {
String text = (value == null) ? \"\" : value.toString();
JLabel cell = new JLabel(text); cell.setOpaque(true); if (row == 0) {
cell.setForeground(headerForeground);
cell.setBackground(headerBackground); } else {
if (isSelected) {
cell.setForeground(selectedForeground);
cell.setBackground(selectedBackground); } else {
cell.setForeground(foreground);
cell.setBackground(background); } }
return cell; } });
updateView();
cPane.add(daysTable, BorderLayout.CENTER);
}
public static String getHeader(int index) { switch (index) { case 0:
return WEEK_SUN; case 1:
return WEEK_MON;
共19页 第13页
case 2:
return WEEK_TUE; case 3:
return WEEK_WED; case 4:
return WEEK_THU; case 5:
return WEEK_FRI; case 6:
return WEEK_SAT; default:
return null; } }
public void updateView() {
daysModel.fireTableDataChanged();
daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH),
calendar.get(Calendar.WEEK_OF_MONTH));
daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,
calendar.get(Calendar.DAY_OF_WEEK) - 1); }
public static class CalendarTable extends JTable {
private Calendar calendar;
public CalendarTable(TableModel model, Calendar calendar) {
super(model);
this.calendar = calendar; }
public void changeSelection(int row, int column, boolean toggle, boolean extend) {
super.changeSelection(row, column, toggle, extend);
共19页 第14页
if (row == 0) { return; }
Object obj = getValueAt(row, column); if (obj != null) {
calendar.set(Calendar.DAY_OF_MONTH, ((Integer)obj).intValue()); } }
}
public static void main(String[] args) { JFrame frame = new JFrame(\"简易时间日历\");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MyCalendar myCalendar = new MyCalendar(); myCalendar.init();
frame.getContentPane().add(myCalendar); frame.setLocation(330,80); frame.setSize(360, 212);
frame.setVisible(true); } //滚动字
public static class RollbyJFrame extends JFrame implements ActionListener, FocusListener, javax.swing.event.ChangeListener {
private JTextField text; private JSpinner spinner; private Timer timer; private JButton button;
public RollbyJFrame() {
super(\"滚动时间\");
this.setSize(360,100);
this.setBackground(java.awt.Color.lightGray); this.setLocation(700,120);
共19页 第15页
Container c=getContentPane();
JButton button=new JButton(\"修改速度\"); this.add(button,\"East\");
button.addActionListener(this); Calendar now = Calendar.getInstance(); int hour=now.get(Calendar.HOUR);
int minute=now.get(Calendar.MINUTE); int year=now.get(Calendar.YEAR); int month=now.get(Calendar.MONTH);
int day=now.get(Calendar.DAY_OF_MONTH);
text = new JTextField(\" Hello 当前时间是: \"+hour+\":\"+minute+\" \"+year+\"/\"+month+\"/\"+day); this.add(text,\"Center\");
text.addFocusListener(this); //注册焦点事件
timer = new Timer(136,this); timer.start(); JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
this.add(panel,\"South\"); spinner = new JSpinner();
spinner.setValue(timer.getDelay()); panel.add(spinner);
spinner.addChangeListener(this); this.setVisible(true); }
public void focusGained(FocusEvent e) //获得焦点时 {
if (e.getSource()==text) {
timer.stop(); } }
public void focusLost(FocusEvent e) //失去焦点时 {
if (e.getSource()==text) {
timer.restart();
共19页 第16页
} }
public void stateChanged(ChangeEvent e) {
if (e.getSource()==spinner) {
timer.setDelay(new
Integer(\"\"+spinner.getValue())); //设置延时的时间间隔 } }
public void actionPerformed(ActionEvent e) //定时器定时执行事件
{if (e.getSource()==button);
else{
String temp = text.getText(); temp = temp.substring(1) + temp.substring(0,1); text.setText(temp);} }
public void buttondown(ActionEvent e) //单击事件
{if (e.getSource()==button){} ;
} } } 7. 总 结
本次作业是对前面学过的所有面向对象的编程思想以及编程方法的一个总结、回顾和实践,因此,开始设计的时候先回顾以前所学的内容,明确本次作业设计所要用到的技术点并在网上搜索以及查阅相关的书籍来搜集资料。也非常感谢这次实验让我学到了不少知识。懂得了学习中非常重要的方法:自己分析问题,并根据需要查资料,分析资料,真正达到学以致用的目的。
共19页 第17页
5-1、用户界面设计为“鼠标单击响应”模式,使人们更加容易使用。 5-2、在编程中使用了很不规范的编程方法,应用了一些临时变量来实现功能,,而大量临时变量在代码中没有很好地进行命名。这给程序的调试带来了相当的困难。
5-3、这次课程设计没有将各个功能的类代码段书写,以至于程序的结构不清晰,由于一个函数完成多个功能致使程序的各个函数间关系复杂,程序难以阅读。从实践中我获得的经验是设计时应尽量把功能模块设计好考虑全。
5-4.程序能和计算机的日期和时间保持同步,但还不能像网络上提供的万年历一样有节日提醒、农历查询等功能。有时间时我要进一步改进,把此程序完善。
5-5.设计中得到了老师和广大同学的帮助,并参考了网络上的优秀论文和文献书籍,使我的程序设计能够较为顺利的进行下去。在此我衷心感谢老师同学和提供宝贵资源的作者。
8. 参考文献
书籍资料
【1】:《java2 程序设计实用教程》(第二版)
电子工业出版社 叶核亚编著
【2】:《Java大学简明教程》 作者:(美)戴尔特
电子工业出版社 译者:张琛恩
【3】:《JavaTM 2 Platform Standard Edition 6 API 规范》
Sun Microsystems公司
共19页 第18页
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- dfix.cn 版权所有 湘ICP备2024080961号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务