Java程序设计
课程设计报告
设计题目:电子日历设计
班级:
学号:
姓名:
--目录--
一 需求分析. 2
二 概要设计. 3
三 详细设计. 3
四 程序代码. 9
五 运行结果. 16
六 设计总结. 17
一 需求分析
对于万年历系统,其主要功能是:查看当日日期(年、月、日)、查看当时时间、查看其他年月的月历。主要使用流程是:查看万年历系统,查看其他月份或年份日历,选中其他日期查看,查看当日日期。主要功能的用例描述如下:
1.查看万年历
(1)、进入万年历系统;
(2)、系统获取当日日期并设置日历为当月,黑框选中当日日期;
2.查询当月其他年份
改变年份的方法是选择年份。
(1)、点击选择年份的下拉菜单,选择年份;
(2)、系统获取已选择的年份;
(3)、系统设置为已选年份当月的月历并显示在界面显示。
3.查询当年的其他月份
改变月份的方法是选择月份。
(1)、点击选择月份的下拉菜单,选择年份;
(2)、系统获取已选择的月份;
(3)、系统设置已选月份为当年的月历并在界面显示。
4.选择其他日期查看
(1)、点击其他日期;
(2)、系统对所有日期的label进行监听,判断点击的那个label;
(3)、返回被点击的label的数组下标;
(4)、对该下标的label设置蓝色边框,表示选中。
二 概要设计
(1)可以通过图形界面显示日历。
(2)能以月历形式显示日期与星期。
(3)支持用户自己输入年份,可以通过上一年,下一年等按钮来选择年份和月份。
三 详细设计
1.总天数的算法:
首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2.输出月份第一天为星期几的算法:
使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3.算出输出月份第一天为星期几的算法:
算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4.输出年份介于1970-2100
5.显示系统时间。
6.功能实现
7.关键技术
(1)界面的绘制与显示
public class CalendarSample extends JFrame implements
ActionListener,ItemListener{
int width,height;
static int year=1990, month=1;
JButton jl1,jl2;
JLabel endfield;
JPanel jp;
Choice chyear;
JTable table;
Object tab[][];
CalendarBean ca;
String[] a;
Object name[]={"日","一","二","三","四","五","六"};
public static void main(String[] args) {
new CalendarSample();
}
public CalendarSample(){
jp=new JPanel();
ca= new CalendarBean();
year=ca.getYear();
month=ca.getMonth();
jl1=new JButton("上月");
jl2=new JButton("下月");
chyear=new Choice();
for(int i=1970;i<2100;i++){
chyear.add(String.valueOf(i));
}
tab=new Object[6][7];
jl1.addActionListener(this);
jl1.setActionCommand("left");
jl2.addActionListener(this);
jl2.setActionCommand("right");
chyear.addItemListener(this);
chyear.setName("c1");
endfield= new JLabel(""+year+"年
"+month+"月",JLabel.CENTER);
update();
jp.add(jl1);
jp.add(jl2);
jp.add(new JScrollPane(table),BorderLayout.CENTER);
this.add(chyear,BorderLayout.NORTH);
this.add(jp,BorderLayout.CENTER);
this.add(endfield,BorderLayout.SOUTH);
width=500;
height=210;
this.setTitle("日历");
this.setResizable(false);
this.setSize(width, height);
Dimension screenSize = Toolkit.getDefaultToolkit
().getScreenSize();
this.setLocation((screenSize.width-width)/2,
(screenSize.height-height)/2);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("left")){
if(month==1){
year-=1;
month=12;
}else{
month--;
}
}else if(e.getActionCommand().equals("right")){
if(month==12){
year+=1;
month=1;
}else{
month++;
}
}
update();
validate();
}
public void itemStateChanged(ItemEvent e) {
Choice tmp = (Choice) e.getSource();
if(tmp.getName().equals("c1")){
year= Integer.parseInt((String) e.getItem());
}
update();
validate();
}
public void update(){
ca.setYear(year);
ca.setMonth(month);
endfield.setText(""+year+"年 "+month+"月");
chyear.select(String.valueOf(year));
int n=0;
a = ca.getCalendar();
for(int i=0;i<6;i++){
for(int j=0;j<7;j++){
if(!(""+a[n]).equals(""+null)){
tab[i][j]=""+a[n];
}else{tab[i][j]="";}
n++;
}
}
table=new JTable(tab,name);
getContentPane().removeAll();
this.add(chyear,BorderLayout.NORTH);
this.add(jp,BorderLayout.CENTER);
this.add(endfield,BorderLayout.SOUTH);
validate();
}
}
(2)根据月份判断每个月的天数以及判断是否为闰年来判断2月的天数
public int getDaysOfMonth(int year, int Month) //显示所选月份的天数
{
if(Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12)
{
return 31;
}
if(Month == 4 || Month == 6 || Month == 9 || Month == 11)
{
return 30;
}
if(year%4 == 0 && year%100 != 0 || year%400 == 0)//闰年
{
return 29;
}
else
{
return 28;
}
}
四 程序代码
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Calendar;
import java.util.Date;
public class CalendarSample extends JFrame implements
ActionListener,ItemListener{
int width,height;
static int year=1990, month=1;
JButton jl1,jl2;
JLabel endfield;
JPanel jp;
Choice chyear;
JTable table;
Object tab[][];
CalendarBean ca;
String[] a;
Object name[]={"日","一","二","三","四","五","六"};
public static void main(String[] args) {
new CalendarSample();
}
public CalendarSample(){
jp=new JPanel();
ca= new CalendarBean();
year=ca.getYear();
month=ca.getMonth();
jl1=new JButton("上月");
jl2=new JButton("下月");
chyear=new Choice();
for(int i=1970;i<2100;i++){
chyear.add(String.valueOf(i));
}
tab=new Object[6][7];
jl1.addActionListener(this);
jl1.setActionCommand("left");
jl2.addActionListener(this);
jl2.setActionCommand("right");
chyear.addItemListener(this);
chyear.setName("c1");
endfield= new JLabel(""+year+"年
"+month+"月",JLabel.CENTER);
update();
jp.add(jl1);
jp.add(jl2);
jp.add(new JScrollPane(table),BorderLayout.CENTER);
this.add(chyear,BorderLayout.NORTH);
this.add(jp,BorderLayout.CENTER);
this.add(endfield,BorderLayout.SOUTH);
width=500;
height=210;
this.setTitle("日历");
this.setResizable(false);
this.setSize(width, height);
Dimension screenSize = Toolkit.getDefaultToolkit
().getScreenSize();
this.setLocation((screenSize.width-width)/2,
(screenSize.height-height)/2);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
validate();
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("left")){
if(month==1){
year-=1;
month=12;
}else{
month--;
}
}else if(e.getActionCommand().equals("right")){
if(month==12){
year+=1;
month=1;
}else{
month++;
}
}
update();
validate();
}
public void itemStateChanged(ItemEvent e) {
Choice tmp = (Choice) e.getSource();
if(tmp.getName().equals("c1")){
year= Integer.parseInt((String) e.getItem());
}
update();
validate();
}
public void update(){
ca.setYear(year);
ca.setMonth(month);
endfield.setText(""+year+"年 "+month+"月");
chyear.select(String.valueOf(year));
int n=0;
a = ca.getCalendar();
for(int i=0;i<6;i++){
for(int j=0;j<7;j++){
if(!(""+a[n]).equals(""+null)){
tab[i][j]=""+a[n];
}else{tab[i][j]="";}
n++;
}
}
table=new JTable(tab,name);
getContentPane().removeAll();
this.add(chyear,BorderLayout.NORTH);
this.add(jp,BorderLayout.CENTER);
this.add(endfield,BorderLayout.SOUTH);
validate();
}
}
class CalendarBean {
String day[];
Calendar kalendar;
int year = 1990, month = 1;
{
kalendar = Calendar.getInstance();
kalendar.setTime(new Date());
month = kalendar.get(Calendar.MONTH)+1;
year = kalendar.get(Calendar.YEAR);
}
public void setYear(int year) {
this.year = year;
}
public int getYear() {
return year;
}
public void setMonth(int month) {
this.month = month;
}
public int getMonth() {
return month;
}
public String[] getCalendar() {
String a[] = new String[42];
kalendar.set(year, month - 1, 1);
int week = kalendar.get(Calendar.DAY_OF_WEEK) - 1;
int day = 0;
if (month == 1 || month == 3 || month == 5 || month == 7 || month
== 8 || month == 10 || month == 12) {
day = 31;
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
day = 30;
}
if (month == 2) {
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
{
day = 29;
} else {
day = 28;
}
}
for (int i = week, n = 1; i < week + day; i++) {
a[i] = String.valueOf(n);
n++;
}
return a;
}
}
class Look extends JDialog implements ItemListener{
Choice skin;
public Look(){
skin=new Choice();
skin.add("");
skin.add("");
skin.add("");
skin.addItemListener(this);
this.add(skin);
this.setSize(200, 150);
Dimension screenSize = Toolkit.getDefaultToolkit
().getScreenSize();
this.setLocation((screenSize.width-200)/2,
(screenSize.height-150)/2);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
validate();
}
public void itemStateChanged(ItemEvent arg0) {
// TODO Auto-generated method stub
}
}
五 运行结果
1.在下拉列表中选择20##年,选择12月30日后点击查看情况:
2.选择20##年12月30日后点击上月按钮查看情况:
3. 选择20##年12月30日后点击下月按钮查看情况:
六 设计总结
1 Java 语言是解释执行的高级编程语言,是面向对象的程序设计语言,功能强大,它是解释执行的,能跨平台使用,具有较高的性能和高度的安全性。经过了一个学期对《Java程序设计》的学习,我们学习了理论知识,了解了Java语言程序设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。
2经过这次课程设计使我对JAVA图形用户界面的有关知识有了更深入了解,如几种布局管理器的使用方法,事件的处理机制,SWING的基本体系结构,SWING组件的使用方法,多媒体的实现手段等知识。完成了简单的万年历功能。
3本次课程设计的主要内容就是设计一个可以查询日期的程序,通过选择下拉列表中的年份以及月份来实现日期的查询,及按键改变年月通过它可以查询到日期的一些具体信息,可以查询所选日期是星期几,还对星期六与星期日有特殊颜色的标记,方便查看。此外,还可以实现显示数字时间的功能,简单实用。
4通过课程设计,能够达到全面、深入理解和掌握所学内容,能够进行简单的分析和判断。此次课程设计一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足之处和薄弱环节,加以弥补和加强。是对自己学习的一次很好的检验。能完成这次的课程设计,和身边的同学和老师的帮助分不开的。在此对指导老师表示感谢,还有帮助过我的一些同学,在此也表示谢意。在今后的学习中我也会更加努力的。