资源描述
本科生课程设计
课程名称
Java程序设计B课程设计
题目
学号
学生姓名
所在专业
所在班级
指导老师
成绩
老师签字
评语:
课程设计时间:12月31日--1月6日
目 录
摘要················································2
1.引言················································2
2. 设计目标和任务····································2
3.设计方案············································3
3.1总体设计·········································3
3.2设计要求·········································3
3.3系统关键功效···································3
3.4各个类组合结构图·······························4
3.5各个类说明·······································4
3.5.1 CalendarWindow类····························4
3.5.2 CalendarMessage类·························11
3.5.3 CalendarPad类·····························13
3.5.4 NotePad类································14
3.5.5 CalendarImage类···························19
3.5.6 Clock类··································20
4.多种功效截图·······································24
5. 课程设计总结·······································26
《Java程序设计B》课程设计
——日历记事本
摘 要
本课程设计经过代码实现将理论知识和具体实践相结合,巩固提升了对JAVA相关方法和概念了解,使学生发散思维及动手能力深入加强,加强对计算机及软件工程深入了解。
在这个课程设计中,我们做成了一个有日历标识记事本软件,日历记事本面板由日历、记事本、图片、时钟四部分组成。日历部分能够选择不一样年份、月份、日期和星期;记事本模块能够实现查看,保留,删除日志等操作;而且每一步操作全部有对应提醒;图片模块能够显示预设图片;时钟模块能够用时钟来显示目前时间。本软件是一个实用性较强,简练,美观,方便功效软件。
1. 引言
Java是一个纯面向对象、网络编程首选语言。Java技术作为软件一个革命性技术,已被列为当今世界信息技术主流之一。为了适应时代时尚,我们应该加强对Java学习,愈加好掌握这门课程。为此,我们成了一个课程小组,经过小组成商讨以后,我们决定以“日历记事本”为设 题材,借此巩固加深我们对Java了解。
此次课程设计实例即使比较简单,程序设计也不是很复杂,但在此程序设计过程也是一个学习过程,更是对复杂程序一个学习过程,还能培养我们数抽象能力。所以,我们认为这次课程设计是很有意义,能为我们以后学习面向过程程序设计作部分铺垫。
2.设计目标和任务
本课程设计所要求达成目标和任务:经过Java程序设计部分关键理论基础来实现“日历记事本”“日历”和“记事本”双重功效。并经过此次课程设计训练,使学生巩固和加深对Java这门课程了解,经过利用所学到计算科学理论知识,提升处理实际问题能力,增强运算、编程和使用技术资料技能,经过实际问题分析设计、编程和调试,掌握应用软件分析方法和工程设计方法,能正确叙述设计和试验结果。经过这次课程设计,培养实事求是、认真、严谨科学态度和刻苦钻研不停创新精神,逐步建立正确全局观念。
3.设计方案
3.1 总体设计
(1)问题定义:创建日历记事本,实现对某日期事情进行统计这关键功效,并能显示设置图片和时钟,增加美观。
(2)问题分析:经过对“日历记事本”这一题材分析,我需要四个类来实现其“日历”和“记事本”这两大功效。经过主类CalendWindow创建动日历记事本软件主窗口,该类含有main方法,程序从该类开始实施。再用余下CalendarPad、CalendarMessage 、NotePad类来显示并改变日期和实现记事本功效。而CalendarImage和Clock这两个类用来显示图片和时钟。
(3)研究意义:经过此次课程设计,我们掌握了Java语言基础利用,提升了理论结合实际能力。
3.2设计要求
(1)界面左侧是日历和一幅图。该日历能够按年前后翻动,用鼠标鼠标单击“上年”按钮时,目前日历年份将减一;当鼠标左键单击“下年”按钮,目前日历年份将加一。该日历还能够在某年内按月前月后翻动,当鼠标左键单击“上月”按钮时,目前日历月份将减一;当鼠标左键单击“下月” 目前日历表月份将加一。图片是为了增加美观而加进去。
(2)系统界面右侧是记事本和一个闹钟。用鼠标单击日历上日期,就能够经过该记事本编辑相关日志,并将日志保留到一个文件,该文件名字由该日期组成字符序列命名。用户能够查看,删除某个日期日志,也能够继续向某个日志添加新内容。
时钟能够实时显示目前时间。
(3)当某个日期有日志时,在日历表该日期外观上就会出现“yes”标识,表明这个日期有日志,当用户删除某个日期日志后,该日期外观上“yes”标志就会消失。
3.3系统关键功效
(1)能够对个人日志进行添加、查阅、删除;
(2)能够方便地在任何日期记载个人日志和查看某个日期记载日志 ;
(3)能够显示目前日期和时间。
3.4各个类组合结构图
CalendarWindow
CalendarMessage
CalendarImage
CalendarPad
JTextField
File
NotePad
JTextArea
Clock
3.5 各个类说明
(1)主函数CalendarWindow类
该类是整个程序主框架,是javax.swing包中Jframe一个子类。并实现了ActionListener、MouseListener和FocusListener接口。以下是该类相关数听说明!
1) 组员变量
l year,month和day是int型变量。它们值分别确定年份、月份和日期。
l calendarMessage是CalnedarMessage对象,该对象用来处理和日期相关数据。
l calendarPad是CalendarPad对象,该对象能够显示和日期相关数据。
l notPad是NotPad对象。含有编辑、读取、保留和删除日志功效。
l showYear和showMonth是JtextField类创建文本框,用来显示年月。
l showDay数组每个单元是JtextField类创建用来显示日期文本框。
l calendarImage是CalendarImage创建对象,用来显示图像。
l clock是Clock创建对象,用来显示时钟。
l nextYear,PreviousYear,nextMonth和PreviousMonth是JButton创建按钮对象,名字依次为“下年、上年、下月、上月”。这些按钮全部将目前窗口注册为自己ActionEvent事件监视器。
l savaDailyRecord,deleteDailyRecord和readDailyRecord是JButton创建按钮对象,名字依次为“保留日志、删除日志、读取日志”。这些按钮全部将目前窗口注册为自己ActionEvent事件监视器。
2) 方法
l CalendarWindow()是结构方法,负责完成窗口初始化。
l actionPerformed(ActionEvent)方法是CalendarWindow类实现ActionListener接口中方法。CalendarWindow创建窗口是nextYear,previousYear,nextMonth,previousMonth,saveDailyRecord,deleteDailyRecord和readDailyRecord按钮ActionEvent事件监视器,当用户单击其中按钮时,窗口将实施actionPerformed(ActionEvent)方法进行对应操作。
l mousePressed(MouseEvent)方法是CalendarWindow类实现MouseListener接口中方法。CalendarWindow创建窗口时showDay数组中JtextField文本框MouseEvent事件监视器,当用户在某个显示日期文本框上按下鼠标左键时,窗口将实施mousePress(MouseEvent)方法进行对应操作。
l focusGained(FocusEvent)和focusLost(FocusEvent)方法是CalendarWindow类实现FocusListener接口中方法。CalendarWindow创建窗口是showDay数组中JtextField文本框FocusEvent事件监视器,当用户操作造成某个显示日期文本框焦点发生改变时,窗口将实施focusGained(FocusEvent)或focusLost(FocusEvent)方法进行对应操作。
l doMark()方法负责对有日志日期作出标志。
l main方法是程序运行入口方法。
具体代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
public class CalendarWindow extends JFrame implements ActionListener,
MouseListener,FocusListener
{
int year,month,day;
CalendarMessage calendarMessage;
CalendarPad calendarPad;
NotePad notePad;
JTextField showYear,showMonth;
JTextField showDay[];
CalendarImage calendarImage;
Clock clock;
JButton nextYear,previousYear,nextMonth,previousMonth;
JButton saveDailyRecord,deleteDailyRecord,readDailyRecord;
File dir;
Color backColor=Color.white;
public CalendarWindow()
{
dir= new File("./dailyRecord");
dir.mkdir();
showDay = new JTextField[42];
for(int i=0;i<showDay.length;i++)
{
showDay[i]=new JTextField();
showDay[i].setBackground(backColor);
showDay[i].setLayout(new GridLayout(3,3));
showDay[i].addMouseListener(this);
showDay[i].addFocusListener(this);
}
calendarMessage = new CalendarMessage();
calendarPad = new CalendarPad();
notePad = new NotePad();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH)+1;
day = calendar.get(Calendar.DAY_OF_MONTH);
calendarMessage.setYear(year);
calendarMessage.setMonth(month);
calendarMessage.setDay(day);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.setShowDayTextField(showDay);
notePad.setShowMessage(year,month,day);
calendarPad.showMonthCalendar();
doMark();
calendarImage = new CalendarImage();
calendarImage.setImageFile(new File("flower.jpg"));
clock = new Clock();
JSplitPane splitV1 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,calendarPad,calendarImage);
JSplitPane splitV2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT,notePad,clock);
JSplitPane splitH = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,splitV1,splitV2);
add(splitH,BorderLayout.CENTER);
showYear = new JTextField(""+year,6);
showYear.setFont(new Font("TimesRoman",Font.BOLD,12));
showYear.setHorizontalAlignment(JTextField.CENTER);
showMonth = new JTextField(""+month,4);
showMonth.setFont(new Font("TimesRoman",Font.BOLD,12));
showMonth.setHorizontalAlignment(JTextField.CENTER);
nextYear = new JButton("下年");
previousYear = new JButton("上年");
nextMonth = new JButton("下月");
previousMonth = new JButton("上月");
nextYear.addActionListener(this);
previousYear.addActionListener(this);
nextMonth.addActionListener(this);
previousMonth.addActionListener(this);
showYear.addActionListener(this);
JPanel north = new JPanel();
north.add(previousYear);
north.add(showYear);
north.add(nextYear);
north.add(previousMonth);
north.add(showMonth);
north.add(nextMonth);
add(north,BorderLayout.NORTH);
saveDailyRecord = new JButton("保留日志");
deleteDailyRecord = new JButton("删除日志");
readDailyRecord = new JButton("读取日志");
saveDailyRecord.addActionListener(this);
deleteDailyRecord.addActionListener(this);
readDailyRecord.addActionListener(this);
JPanel pSouth = new JPanel();
pSouth.add(saveDailyRecord);
pSouth.add(deleteDailyRecord);
pSouth.add(readDailyRecord);
add(pSouth,BorderLayout.SOUTH);
setVisible(true);
setBounds(70,70,770,500);
validate();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource()==nextYear)
{
year++;
showYear.setText(""+year);
calendarMessage.setYear(year);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.showMonthCalendar();
notePad.setShowMessage(year,month,day);
doMark();
}
else if (e.getSource()==previousYear)
{
year--;
showYear.setText(""+year);
calendarMessage.setYear(year);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.showMonthCalendar();
notePad.setShowMessage(year,month,day);
doMark();
}
else if (e.getSource()==nextMonth)
{
month++;
if(month>12) month=1;
showMonth.setText(""+month);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.showMonthCalendar();
notePad.setShowMessage(year,month,day);
doMark();
}
else if (e.getSource()==previousMonth)
{
month--;
if(month<1) month=12;
showMonth.setText(""+month);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.showMonthCalendar();
notePad.setShowMessage(year,month,day);
doMark();
}
else if (e.getSource()==showYear)
{
String s = showYear.getText().trim();
char a[] = s.toCharArray();
boolean boo = false;
for(int i = 0;i < a.length;i++)
{
if(!(Character.isDigit(a[i])))
boo = true;
}
if(boo==true)
JOptionPane.showMessageDialog(this,"你输入了非法年份","警告!",
JOptionPane.WARNING_MESSAGE);
else if(boo==false)
year = Integer.parseInt(s);
showYear.setText(""+year);
calendarMessage.setYear(year);
calendarPad.setCalendarMessage(calendarMessage);
calendarPad.showMonthCalendar();
notePad.setShowMessage(year,month,day);
doMark();
}
else if (e.getSource()== saveDailyRecord)
{
notePad.save(dir,year,month,day);
doMark();
}
else if(e.getSource()==deleteDailyRecord)
{
notePad.delete(dir,year,month,day);
doMark();
}
else if (e.getSource()==readDailyRecord)
{
notePad.read(dir,year,month,day);
doMark();
}
}
public void mousePressed(MouseEvent e)
{
JTextField text = (JTextField)e.getSource();
String str = text.getText().trim();
try
{
day = Integer.parseInt(str);
}
catch (NumberFormatException exp)
{}
calendarMessage.setDay(day);
notePad.setShowMessage(year,month,day);
}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void focusGained(FocusEvent e)
{
Component com = (Component)e.getSource();
com.setBackground(Color.pink);
}
public void focusLost(FocusEvent e)
{
Component com = (Component)e.getSource();
com.setBackground(backColor);
}
public void doMark()
{
for(int i=0;i<showDay.length;i++)
{
showDay[i].removeAll();
String str = showDay[i].getText().trim();
try
{
int n = Integer.parseInt(str);
if(isHaveDailyRecord(n)==true)
{
JLabel mess = new JLabel("yes");
mess.setFont(new Font("TimesRoman",Font.PLAIN,11));
mess.setForeground(Color.blue);
showDay[i].add(mess);
}
}
catch (Exception exp){}
}
calendarPad.repaint();
calendarPad.validate();
}
public boolean isHaveDailyRecord(int n)
{
String key = ""+year+""+month+""+n;
String []dayFile = dir.list();
boolean boo = false;
for(int k = 0;k<dayFile.length;k++)
{
if(dayFile[k].equals(key+".txt"))
{
boo = true;
break;
}
}
return boo;
}
public static void main(String args[])
{
new CalendarWindow();
}
}
(2)CalendarMessage类
CalendarMessage类创建对象calendarMessage是CalendarWindow窗口关键组员对象之一,负责处理和日期相关数据。该类相关数听说明以下:
1) 组员变量
year,month,day是int型数据,它们值分别确定年份、月份和日期。
2) 方法
l setYear(int)和getYear()方法分别用来设置year和获取year值。
l setMonth(int)和getMonth()方法分别用来设置month和获取month值。
l setDay(int)和getDay()方法分别用来设置和获取day值。
l getMonthCalendar()方法是用来处理日期数据,使其按着习惯来显示。即日历牌中每行第一列为“星期天”。getMonthCalendar()方法依据year,month和day值返回一个存放着“日历”数据String类型数组,比如,假如某月有30天,而且该月第一天是星期三,那么返回String类型数组是:“”,“”,“”,“1”,“2”,·····,“30”。
具体代码:
import java.util.Calendar;
public class CalendarMessage{
int year=-1,month=-1,day=-1;
public void setYear(int year){
this.year=year;
}
public int getYear(){
return year;
}
public void setMonth(int month){
if(month<=12&&month>=1)
this.month=month;
else
this.month=1;
}
public int getMonth(){
return month;
}
public void setDay(int day){
this.day=day;
}
public int getday()
{
return day;
}
public String [] getMonthCalendar(){
String [] day=new String[42];
Calendar rili=Calendar.getInstance();
rili.set(year,month-1,1);//将日历翻到year年month月1日
int 星期几=rili.get(Calendar.DAY_OF_WEEK)-1;
int dayAmount=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
dayAmount=31;
if(month==4||month==6||month==9||month==11)
dayAmount=30;
if(month==2)
if(((year%4==0)&&(year%100!=0))||year%400==0)
dayAmount=29;
else
dayAmount=28;
for(int i=0;i<星期几;i++)
day[i]=" ";
for(int i=星期几,n=1;i<星期几+dayAmount;i++){
day[i]=String.valueOf(n);
n++;
}
for (int i=星期几+dayAmount;i<42;i++ )
day[i]=" ";
return day;
}
}
(3)CalendarPad类
CalendarPad类是javax.swing包中Jpanel容器子类,所创建对象:calendarPad是CalendarWindow类中最关键组员之一,负责显示经CalendarMessage类处理后日期数据,被添加到CalendarWindow窗口左上侧。以下是该类相关说明:
1) 组员变量
l year,month和day是int型数据,它们值分别确定年份、月份和日期
l calendarMessage是CalendarMessage对象,该对象能够处理和日期相关数据。
l showDay数组每个单元是JtextField类创建用来显示日期文本框。
l “星期”是String数组,单元值依次为“SUN日”、“MON一”、“TUE二”、“WED三”、“THU四”、“FRI五”、“SAT六”。
2) 方法
l CalendarPad()是结构方法,用来创建calendarPad对象。
l setShowDayTextField(JtextField[])方法负责设置showDay数组。
l setCalendarMessage(CalendarMessage)方法负责设置calendarMessage对象。
l showMonthCalendar()方法负责显示“日历”。
具体代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class CalendarPad extends JPanel{
int year,month,day;
CalendarMessage calendarMessage;
JTextField []showDay;
JLabel title [];
String [] 星期={"SUN 日","MON 一","TUE 二","WED 三","THU 四","FRI 五","SAT 六"};
JPanel north,center;
public CalendarPad(){
setLayout(new BorderLayout());
north=new JPanel();
north.setLayout(new GridLayout(1,7));
center=new JPanel();
center.setLayout(new GridLayout(6,7));
add(center,BorderLayout.CENTER);
add(north,BorderLayout.NORTH);
title=new JLabel[7];
for(int j=0;j<7;j++){
title[j]=new JLabel();
title[j].setFont(new Font("TimesRoman",Font.BOLD,12));
title[j].setText(星期[j]);
title[j].setHorizontalAlignment(JLabel.CENTER);
title[j].setBorder(BorderFactory.createRaisedBevelBorder());
north.add(title[j]);
}
title[0].setForeground(Color.red);
title[6].setForeground(Color.blue);
}
public void setShowDayTextField(JTextField [] text){
showDay=text;
for(int i=0;i<showDay.length;i++){
showDay[i].setFont(new Font("TimesRoman",Font.BOLD,15));
showDay[i].setHorizontalAlignment(JTextField.CENTER);
showDay[i].setEditable(false);
center.add(showDay[i]);
展开阅读全文