杭州师范大学
钱江学院
课程设计
目 录
一.概述 …………………………………………………………………………..1
二.总体方案设计 …………………………………………………………………2
三.详细设计 ………………………………………………………………………3
四.最终输出 ………………………………………………………………………7
五.课程设计总结 ………………………………………………………………….8
参考文献 …………………………………………………………………………...9
一、概述
1. 课程设计的目的
通过显示年日历程序的设计,培养学生综合利用java语言进行程序设计的能力,加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力。
通过本项课程设计,可以培养独立思考、 综合运用所学有关相应知识的能力,能更好的巩固《java语言程序设计》课程学习的内容,掌握 工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了java语言的好处和其可用性!
2. 课程设计的要求
2.1
输入查询的年份与月份,单击“更新”按扭,则可得到相应的日历。本实验是对图形用户界面,布局管理器的综合运用。要掌握APPLET容器中添加组件的方法,理解JAVA的事件处理机制,编写独立的运行窗口。
2.2 输出形式
使用独立的运行窗口进行显示。界面主要由两部分组成——查询输入部分和结果显示部分。查询输入部分包括两个文本域,一个用于输入年份:一个用于选择月份:一个更新按扭,用来触发查询事件。
二 总体方案设计
1. 程序开发环境
a. 开发环境:eclipse
b. 系统环境:windows xp/7
c. 设计工具:Microsoft office 2003
2. 整体流程图
图1 流程图
3. 功能模块图
图2 结构图
三.详细设计
3.1导入的包
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
3.2 Applet的初始化
public void init(){
Label L1 = new Label("输入年份");
Label L2 = new Label("输入月份");
TextField F1 = new TextField(5);
TextField F2 = new TextField(5);
Button B1 = new Button("查询");
int arr = newint[12];
add(L1);
add(F1);
add(L2);
add(F2);
add(B1);
Date date = new Date();
F1.setText(String.valueOf(date.getYear() + 1900));
F2.setText(String.valueOf(date.getMonth() + 1));
B1.addActionListener(this);
arr[0] = arr[2] = arr[4] = arr[6] = arr[7] = arr[9] = arr[11] = 31;
arr[3] = arr[5] = arr[8] = arr[10] = 30;
date.setDate(1);//设置每月第一天
var = date.getDay();//得到每月最后一天
}
3.3监听器
publicvoid actionPerformed(ActionEvent e) {
int x = Integer.parseInt(F1.getText()), i = Integer.parseInt(F2
.getText()) - 1, s = 0;
if(F1.getText().isEmpty()||F2.getText().isEmpty())
{
JOptionPane.showMessageDialog(null,"输入不能为空!");
}
Date date = new Date();
date.setYear(x - 1900);
date.setMonth(i);
date.setDate(1);
var = date.getDay();
repaint();
}
3.3 paint()
publicvoid paint(Graphics g) {
int xpos, ypos;
//arr[0] = arr[2] = arr[4] = arr[6] = arr[7] = arr[9] = arr[11] = 31;
//arr[3] = arr[5] = arr[8] = arr[10] = 30;
int x = Integer.parseInt(F1.getText()), i = Integer.parseInt(F2
.getText()) - 1;
if ((x % 4 == 0 && x % 100 != 0) || (x % 400 == 0))
arr[1] = 29;
else
arr[1] = 28;
g.drawString("星期一", 50, 50);
g.drawString("星期二", 100, 50);
g.drawString("星期三", 150, 50);
g.drawString("星期四", 200, 50);
g.drawString("星期五", 250, 50);
g.drawString("星期六", 300, 50);
g.drawString("星期日", 350, 50);
ARR = new String[arr[i]];
int j = 0, k = 1;
while (k <= arr[i]) {
ARR[j] = String.valueOf(k);//获得每个月日期
k ++;
j ++;
}
int line = 0;
for (int m = 0 ; m < ARR.length ; m ++) {
//设置日期显示的位置
ypos = 50 + 50 * (line + 1);
xpos = (var * 50 + 50 * (m % 7)) % 350;
if (xpos == 0) {
xpos = 350;
line ++;
}
g.drawString(ARR[m], xpos, ypos);
}
}
}
四.最终输出
1.输入年月界面
2.显示界面
4. 输入为空情况
五.课程设计总结
在最初设计这个程序的时候走了不少弯路,一开始对Applet程序没有深入理解,就把初始化部分写到构造函数里去了,后来在老师的提醒下,自己修改过来了。我认为这个程序并的难点有两个:一个是如何将万年历漂亮的排版出来,一个是算出某年某月第一天是星期几。
处理排版我时想到了Applet程序里的drawString()方法,通过设置X轴的位置来显示日期位置,每7天换一行。至于算出某年某月第一天是星期几,我第一个想到是和1900年1月1日去比较,先查出该天是星期几,再算出输入的日期比该天晚多少天就可以很轻松的知道想要的答案。但是如果输入的时间早于1900年,那就要出问题了。于是我在上网查资料的时候发现了有setDay()和getDay()这两个方法,可以直接用来获取每月第一天,这样就大大方便了我的编程。
另外,在编这个程序也有比较遗憾的地方,比如输入是字母的话程序会出错,我本想用抛出异常来解决,但是每个方法都没法throws我自己写的异常,不知道怎么解决,只能放弃。
附录一: 参考文献
[1] Java程序设计之网络编程(第二版) 清华大学出版社 李芝兴 杨瑞龙
[2] 数据库系统概论(第四版) 王珊 萨师煊 高等教育出版社
第二篇:Java万年历课程设计报告
Java课程设计
设计题目:万年历
系 别: 计算机科学与工程学院
专 业: 信息管理与信息系统
学 号: 1100340116
姓 名: 岑少兵
指导教师: 汪华澄
时 间: 20##-6-29
目 录
摘要……………………………………………………………………………………3
系统功能结构图………………………………………………………………………3
1 系统模块设计………………………………………………………………………4
1.1 需求设计………………………………………………………………………4
1.2 开发和运行环境………………………………………………………………4
1.3 功能设计………………………………………………………………………4
2 万年历详细设计思路………………………………………………………………4
2.1 程序设计思路…………………………………………………………………5
2.2 程序运行主界面………………………………………………………………5
2.3 流程图…………………………………………………………………………6
3 各模块功能实现及代码说明………………………………………………………6
3.1 MainFramel类…………………………………………………………………6
3.2 Lunar类………………………………………………………………………14
3.3 national类……………………………………………………………………22
3.4 SetClock类……………………………………………………………………26
4 小结……………………………………………………………………………… 34
5 参考文献………………………………………………………………………… 34
基于Myeclipse的万年历
摘要:万年历是日常生活中不可或缺的小工具,用万年历我们可以准确地查到当前,以后或是过去的日期,极大地方便了我们的生活。在万年历上添加了显示本地时间以后会更加准确地显示时间。无论是对于我们学生还是上班族或是自由职业者需要经常查看和查找万年历来规划自己将要做得一些事情,或是回忆在过去的时间里已经做过的事情,使之更加有利于提升我们的学习或是工作进度。
系统功能结构图:主要描述系统要实现的各个模块的功能。
1系统模块设计
1.1需求分析
本程序的要求为:1.使用图形用户界面
2.能够实现日期与星期的查询
3.能够显示农历
4.能够查看世界时间
5.能够添加闹钟
1.2开发和运行环境
开发工具:Myeclipse
运行环境: windows 7
1.3功能设计
本程序要构建的万年历程序,其功能有以下几个方面:
(1) 通过MainFrame类,实现图形界面和公历日期。
(2) 提供年份、月份的下拉形式菜单来选择年份和月份。
(3) 通过Lunar类实现农历日期。
(4) 通过national类实现世界时间。
(5) 能以月历形式显示日期与星期。
(6) 通过SetClock类来实现闹钟功能。
(7) 通过点击世界时间按钮查询世界时间
(8) 通过点击闹钟按钮设置闹钟
(9) 显示系统当前时间和日期。
(10) 显示作者信息。
2 万年历详细设计思路
2.1程序设计思路
1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
2. 输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
3. 算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
4. 如果年份小于1900年则程序不予判断。
2.2程序运行主界面
2.3流程图
3各模块功能实现及代码说明
3.1 MainFrame类
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import aa.Lunar;
public class MainFrame extends JFrame implements ItemListener//建立主界面
{
JPanel panel=new JPanel(new BorderLayout());//建立中层容器并布局
JPanel panel1=new JPanel();
JPanel panel2=new JPanel(new GridLayout(8,7));
JPanel panel3=new JPanel(new GridLayout(4,1));
JLabel[] label=new JLabel[49];//标签
JLabel y_label=new JLabel("年");
JLabel m_label=new JLabel("月");
JLabel dashao =new JLabel("时间总是在不经意间溜走,我们还得向前走",JLabel.CENTER);
JLabel bing =new JLabel("希望在回首时候,不带任何遗憾!",JLabel.CENTER);
JLabel feng =new JLabel("桂电大烧饼制作!",JLabel.CENTER);
JLabel labelTime=new JLabel("",JLabel.CENTER);
JComboBox com1=new JComboBox();//下拉窗口
JComboBox com2=new JComboBox();
JButton but1=new JButton("闹钟"); //按钮
JButton but2=new JButton("世界时间");
Calendar now=Calendar.getInstance();
public MainFrame()//设置主界面,并添加各组件
{
super("大烧饼万年历");
setSize(500,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1.add(but1);
panel1.add(y_label);
panel1.add(com1);
panel1.add(m_label);
panel1.add(com2);
panel1.add(but2);
panel3.add(dashao);
panel3.add(bing);
panel3.add(feng);
panel3.add(labelTime);
for(int i=0;i<49;i++)//日期标签
{
label[i]=new JLabel("",JLabel.CENTER);
panel2.add(label[i]);
}
panel.add(panel1,BorderLayout.NORTH);//中层容器布局
panel.add(panel2,BorderLayout.CENTER);
panel.add(panel3,BorderLayout.SOUTH);
setContentPane(panel);
setVisible(true);
init();
com1.addItemListener(this);//对下拉组件监听
com2.addItemListener(this);
but1.addActionListener(new ActionListener() {//按钮动作监听
public void actionPerformed(ActionEvent e) {
new aa.SetClock(); //闹钟类
}
});
but2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new aa.national();//世界时间类
}
});
Timer timer = new Timer(1000, new ActionListener()//获得系统时间,并将其显示在主界面下方
{
public void actionPerformed(ActionEvent evt)
{
String s1= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
labelTime.setText("现在时间是:"+s1);
}
});
timer.start();//线程启动
}
public void init()//设置日期标签函数
{
int year,month,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.red);//将星期六设置为红色
}
for(int i=1800;i<=2100;i++)//将年份的下拉设置为1800-2100年
{
com1.addItem(""+i);
}
for(int i=1;i<13;i++)//讲月份下拉设置为12月
{
com2.addItem(""+i);
}
first_day_num=(int)(now.get(Calendar.DAY_OF_WEEK));//获得日期
month=(int)(now.get(Calendar.MONTH));//获得月份
year=(int)(now.get(Calendar.YEAR));//获得年份
com1.setSelectedIndex(year-1800);//将年份设置为当前年份
com2.setSelectedIndex(month);//将月份设置为当前月
Resetday(first_day_num,year,month);//调用Resetday函数
}
public int use(int year2,int month2)//use函数
{
int first_day;
now.set(year2, month2,1);
first_day=(int)(now.get(Calendar.DAY_OF_WEEK));
return first_day;
}
public void stateChanged()
{
int year3,month3,week3;
year3=Integer.parseInt(com1.getSelectedItem().toString());
month3=Integer.parseInt(com2.getSelectedItem().toString())-1;
week3=use(year3,month3);
Resetday(week3,year3,month3);//调用函数
}
public void Resetday(int week_log, int year_log, int month_log) {//Resetday函数
int month_day_score; // 存储月份的天数
int count;
Lunar lunar;//定义lunar
int month_day;
String[] LunarDate=new String[49];//农历标签
month_day_score = 0;
count = 1;
for (int i = 0; i < 49; i ++) {//将农历跟公历一起显示
for(int j=0;j<49;j=j+7)
{
if(i!=j&&i!=j+6)
label[i].setForeground(Color.black);
}
for(int j=0;i<49;i=i+7)
{
label[i].setForeground(Color.red);
}
for(int j=6;i<49;i=i+7)
{
label[i].setForeground(Color.red);
}
}
Date date = new Date(year_log, month_log + 1, 1); // now MONTH是从0开始的, 对于一月第几天来说,DAY_OF_MONTH第一天就是1. 对于一年第几个月来说,MONTH一月份是0,二月份是1...
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1); // 前个月
month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
month_day=month_day_score;
for (int i = 7; i < 49; i++) { // 初始化标签
label[i].setText("");
}
week_log = week_log + 6; // 将星期数加6,使显示正确
month_day_score = month_day_score + week_log;
lunar=new aa.Lunar();//调用Lunar类
for(int i=0;i<month_day;i++)
{
LunarDate[i]=lunar.getLunarDate( year_log, month_log+1, i+1);//农历的实现
}
for (int i = week_log; i < month_day_score; i++, count++) {//一些假期
if(month_log==9&&count==1)
{
label[i].setText(count +"国庆" );
label[i].setForeground(Color.red);
}
else if(month_log==0&&count==1)
{
label[i].setText(count +"元旦" );
label[i].setForeground(Color.red);
}
else if(month_log==11&&count==24)
{
label[i].setText(count +"平安夜" );
label[i].setForeground(Color.red);
}
else if(month_log==11&&count==25)
{
label[i].setText(count +"圣诞" );
label[i].setForeground(Color.red);
}
else if(month_log==1&&count==14)
{
label[i].setText(count +"情人节" );
label[i].setForeground(Color.red);
}
else if(month_log==4&&count==1)
{
label[i].setText(count +"劳动节" );
label[i].setForeground(Color.red);
}
else if(LunarDate[i-week_log].equals("春节")||LunarDate[i-week_log].equals("元宵")||LunarDate[i-week_log].equals("端午")||LunarDate[i-week_log].equals("中秋"))
{
label[i].setText("\n"+count +LunarDate[i-week_log] );
label[i].setForeground(Color.red);
}
else
label[i].setText(count +LunarDate[i-week_log] );
}
}
public void itemStateChanged(ItemEvent e)
{
stateChanged();//调用函数
}
public static void main(String [] args)//主函数
{
new MainFrame();
}
}
3.2 Lunar类
package aa;
import java.awt.Color;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class Lunar {
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = {"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"};
static SimpleDateFormat chineseDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
final static long[] lunarInfo = new long[]
{0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2,
0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977,
0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,
0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950,
0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557,
0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950, 0x06aa0,
0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0,
0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 0x195a6,
0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570,
0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,
0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5,
0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930,
0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,
0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45,
0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0};
//====== 传回农历 y年的总天数
final private static int yearDays(int y) {
int i, sum = 348;
for (i = 0x8000; i > 0x8; i >>= 1) {
if ((lunarInfo[y - 1900] & i) != 0) sum += 1;
}
return (sum + leapDays(y));
}
//====== 传回农历 y年闰月的天数
final private static int leapDays(int y) {
if (leapMonth(y) != 0) {
if ((lunarInfo[y - 1900] & 0x10000) != 0)
return 30;
else
return 29;
} else
return 0;
}
//====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
final private static int leapMonth(int y) {
return (int) (lunarInfo[y - 1900] & 0xf);
}
//====== 传回农历 y年m月的总天数
final private static int monthDays(int y, int m) {
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
return 29;
else
return 30;
}
//====== 传回农历 y年的生肖
final public String animalsYear() {
final String[] Animals = new String[]{"鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪"};
return Animals[(year - 4) % 12];
}
//====== 传入 月日的offset 传回干支, 0=甲子
final private static String cyclicalm(int num) {
final String[] Gan = new String[]{"甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"};
final String[] Zhi = new String[]{"子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"};
return (Gan[num % 10] + Zhi[num % 12]);
}
//====== 传入 offset 传回干支, 0=甲子
final public String cyclical() {
int num = year - 1900 + 36;
return (cyclicalm(num));
}
public static String getChinaDayString(int day) {
String chineseTen[] = {"初", "十", "廿", "卅"};
int n = day % 10 == 0 ? 9 : day % 10 - 1;
if (day > 30)
return "";
if (day == 10)
return "初十";
else
return chineseTen[day / 10] + chineseNumber[n];
}
/** *//**
* 传出y年m月d日对应的农历.
* yearCyl3:农历年与1864的相差数 ?
* monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
* @param cal
* @return
*/
public String getLunarDate(int year_log, int month_log, int day_log) {
//@SuppressWarnings("unused")
int yearCyl, monCyl, dayCyl;
int leapMonth = 0;
String nowadays;
Date baseDate = null;
Date nowaday=null;
try {
baseDate = chineseDateFormat.parse("1900年1月31日");
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
}
nowadays=year_log+"年"+month_log+"月"+day_log+"日";
try {
nowaday = chineseDateFormat.parse(nowadays);
} catch (ParseException e) {
e.printStackTrace(); //To change body of catch statement use Options | File Templates.
}
//求出和1900年1月31日相差的天数
int offset = (int) ((nowaday.getTime() - baseDate.getTime()) / 86400000L);
dayCyl = offset + 40;
monCyl = 14;
//用offset减去每农历年的天数
// 计算当天是农历第几天
//i最终结果是农历的年份
//offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 10000 && offset > 0; iYear++) {
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
monCyl -= 12;
}
//农历年份
year = iYear;
yearCyl = iYear - 1864;
leapMonth = leapMonth(iYear); //闰哪个月,1-12
leap = false;
//用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
int iMonth, daysOfMonth = 0;
for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
//闰月
if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
--iMonth;
leap = true;
daysOfMonth = leapDays(year);
} else
daysOfMonth = monthDays(year, iMonth);
offset -= daysOfMonth;
//解除闰月
if (leap && iMonth == (leapMonth + 1)) leap = false;
if (!leap) monCyl++;
}
//offset为0时,并且刚才计算的月份是闰月,要校正
if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
if (leap) {
leap = false;
} else {
leap = true;
--iMonth;
--monCyl;
}
}
//offset小于0时,也要校正
if (offset < 0) {
offset += daysOfMonth;
--iMonth;
--monCyl;
}
month = iMonth;
day = offset + 1;
if(((month)==1)&&day==1){
return "春节";
}
else if(((month)==1)&&day==15){
return "元宵";
}
else if(((month)==5)&&day==5)
return "端午";
else if(((month)==8)&&day==15)
return "中秋";
else if(day==1)
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
}
public String toString() {
if(chineseNumber[month - 1]=="一"&&getChinaDayString(day)=="初一")
return "农历"+year + "年";
else if(getChinaDayString(day)=="初一")
return chineseNumber[month - 1] + "月";
else
return getChinaDayString(day);
//return year + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] + "月" + getChinaDayString(day);
}
}
3.3 national类
package aa;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class national {
public national() {
ComboBoxFrame frame = new ComboBoxFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
class ComboBoxFrame extends JFrame {
public static final int DEFAULT_WIDTH = 430;//设置窗口大小
public static final int DEFAULT_HEIGHT = 200;
public ComboBoxFrame() {
setTitle("世界时间");//标题
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
// add panel to frame
ComboBoxPanel panel = new ComboBoxPanel();
Container contentPane = getContentPane();
contentPane.add(panel);
Thread t = new Thread(panel);//线程
t.start();//线程启动
}
}
class ComboBoxPanel extends JPanel implements Runnable {
JLabel label1 = null;//定义各组件
JLabel label2 = null;
JLabel label3 = null;
JLabel label4 = null;
JLabel label5 = null;
JComboBox combo1 = null;
JComboBox combo2 = null;
JComboBox combo3 = null;
//默认时间,北京、纽约、东京
private String timeZone1 = "Etc/GMT-8";//北京时间
private String timeZone2 = "America/New_York";//纽约时间
private String timeZone3 = "Asia/Tokyo";//东京时间
public ComboBoxPanel() {
label1 = new JLabel();
label2 = new JLabel();
label3 = new JLabel();
label4 = new JLabel("下面的时间默认为北京,纽约,东京的时间,下拉选择其他地方时间");//添加标签
label5 = new JLabel("同一个世界,同一个梦想",JLabel.CENTER);
label1.setFont(new Font("Dialog", Font.BOLD, 12));//设置字体
label2.setFont(new Font("Dialog", Font.BOLD, 12));
label3.setFont(new Font("Dialog", Font.BOLD, 12));
combo1 = new JComboBox(TimeZone.getAvailableIDs());//下拉组件
combo2 = new JComboBox(TimeZone.getAvailableIDs());
combo3 = new JComboBox(TimeZone.getAvailableIDs());
Clock();
add(label4);
add(label1);
add(combo1);
add(label2);
add(combo2);
add(label3);
add(combo3);
add(label5);
JComboBoxAction combo11Action = new JComboBoxAction(1);
JComboBoxAction combo12Action = new JComboBoxAction(2);
JComboBoxAction combo13Action = new JComboBoxAction(3);
combo1.addActionListener(combo11Action);//监听下拉组件
combo2.addActionListener(combo12Action);
combo3.addActionListener(combo13Action);
}
private class JComboBoxAction implements ActionListener {//实现下拉组件监听
int Type = 0;
public JComboBoxAction(int type) {
Type = type;
}
public void actionPerformed(ActionEvent event) {
if(Type == 1){
timeZone1 = (String)combo1.getSelectedItem();
} else if(Type == 2){
timeZone2 = (String)combo2.getSelectedItem();
} else if(Type == 3){
timeZone3 = (String)combo3.getSelectedItem();
}
}
}
private void Clock() {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置时间输出格式
sd.setTimeZone(TimeZone.getTimeZone(timeZone1));//初始化标签
String strDate = sd.format(new Date());
label1.setText(strDate);
sd.setTimeZone(TimeZone.getTimeZone(timeZone2));
strDate = sd.format(new Date());
label2.setText(strDate);
sd.setTimeZone(TimeZone.getTimeZone(timeZone3));
strDate = sd.format(new Date());
label3.setText(strDate);
}
public void run() {//实现方法
while (true) {
Clock();//调用函数
try {
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}
3.4 SetClock类
package aa;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.*;
import java.io.File;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;
public class SetClock extends JFrame implements Runnable {
JLabel ri, shi, fen, miao, dangqian, guanji;
JButton queding, dakai;
JTextField music, RI, SHI, FEN, MIAO;
int h = 0, f = 0, m = 0, r = 0;
boolean fo = false, foo = false;
public AudioClip soumd1;
int riqi, shizhong, fenzhong, miaozhong;
public SetClock() {
Container c = getContentPane();
c.setLayout(new GridLayout(4, 1));
JPanel jp = new JPanel();
dangqian = new JLabel();
jp.add(dangqian);
c.add(jp);
JPanel jp3 = new JPanel();
guanji = new JLabel("离闹铃时间:0日0时0分0秒");
jp3.add(guanji);
c.add(jp3);
JPanel jp1 = new JPanel();
music = new JTextField(20);
dakai = new JButton("选择闹铃音乐");
jp1.add(music);
jp1.add(dakai);
c.add(jp1);
ri = new JLabel("日");
RI = new JTextField(4);
shi = new JLabel("时");
SHI = new JTextField(4);
fen = new JLabel("分");
FEN = new JTextField(4);
miao = new JLabel("秒");
MIAO = new JTextField(4);
JPanel jp2 = new JPanel();
jp2.add(ri);
jp2.add(RI);
jp2.add(shi);
jp2.add(SHI);
jp2.add(fen);
jp2.add(FEN);
jp2.add(miao);
jp2.add(MIAO);
queding = new JButton("确定");
jp2.add(queding);
c.add(jp2);
setSize(400, 160);
setVisible(true);
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)";
}
});
if (fileChooser.showOpenDialog(SetClock.this) == JFileChooser.APPROVE_OPTION) { // 弹出文件选择器,并判断是否点击了打开按钮
String fileName = fileChooser.getSelectedFile().getAbsolutePath(); // 得到选择文件或目录的绝对路径
music.setText(fileName);
}
}
});
queding.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (queding.getText().equals("确定")) {
try
{
r = Integer.parseInt(RI.getText());
h = Integer.parseInt(SHI.getText());
f = Integer.parseInt(FEN.getText());
m = Integer.parseInt(MIAO.getText());
if (1 <= r && r<= 31 && 0 <= h && h <= 23 && 0 <= f && f <= 59 && 0 <= m && m <= 59)
{
Date now = new Date();
SimpleDateFormat ri = new SimpleDateFormat("dd");
if (RI.getText() == null || RI.getText().equals(""))
{
r = Integer.parseInt(ri.format(now));
RI.setText(ri.format(now));
}
else
r = Integer.parseInt(RI.getText());
fo = true;
}
else
JOptionPane.showMessageDialog(null, "输入时间错误");
}
catch (Exception e)
{
JOptionPane.showMessageDialog(null," 请输入正确的时间");
}
}
else
{
try
{
fo = false;
RI.setEditable(true);
SHI.setEditable(true);
FEN.setEditable(true);
MIAO.setEditable(true);
queding.setText("确定");
soumd1.stop();
}
catch(Exception E)
{
JOptionPane.showMessageDialog(null," 已关闭!");
}
}
}
});
}
public void Set()
{
//SetClock s = new SetClock();
Thread t1 = new Thread(this);
t1.start();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void run() {
while(true){
Date now = new Date();
dangqian.setText("当前时间: " + now.toString());
if (foo)
{
if (h == 0||h - shizhong<0)
{
h += 24;
r = r - 1;
}
if (f == 0||f - fenzhong<0)
{
f += 60;
h -= 1;
}
if (m == 0||m - miaozhong<0)
{
m += 60;
f -= 1;
}
guanji.setText("离闹铃时间: " + (r - riqi) + "日" + (h - shizhong)+ "时" + (f - fenzhong) + "分" + (m - miaozhong-1) + "秒");
if(r<riqi)
{
foo=false;
guanji.setText("离闹铃时间:0日0时0分0秒");
}
else if(r<=riqi&&h<shizhong)
{
foo=false;
guanji.setText("离闹铃时间:0日0时0分0秒");
}
else if(r<=riqi&&h<=shizhong&&f<fenzhong)
{
foo=false;
guanji.setText("离闹铃时间:0日0时0分0秒");
}
else if(r<=riqi&&h<=shizhong&&f<=fenzhong&&m<miaozhong)
{
foo=false;
guanji.setText("离闹铃时间:0日0时0分0秒");
}
}
if (fo)
{
foo = true;
RI.setEditable(false);
SHI.setEditable(false);
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) {
}
}
}
}
4小结
(1)选题目的:对于给定的题目,我觉得就学生成绩管理系统和万年历相对比较简单,但鉴于学生成绩管理系统有很多人选了,所以我就选择万年历了。对于设计一个万年历图形界面程序,由于其功能简单设计也相对较易,通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。
(2)对于本程序的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。
经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于基本完成了整个课程设计,虽然还有些功能没有实现,但已经是我所能做到的最好的了。在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对JAVA语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。
通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。总之,在通过真正动手之后,我java语言设计和有关它的操作方面都获益匪浅,但离真正的系统开发软件设计还是很有差别的,需要我们不断学习新的知识扩充自己才能做好这一工作。学无止境,我们现在了解的东西还很少,更别说很好的掌握自己的专业知识,要谦虚的积极认真学习,不断的增强自身的能力提高个人素质,向一个真正的软件人发展。
5 参考文献:
[1] 耿祥义,张跃平.java面向对象程序设计.北京:清华大学出版社