JAVA《万年历系统》课程设计报告附源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2013-2014学年第二学期《面向对象程序设计》
课程设计报告
题目:万年历系统
专业:计算机科学与技术
班级:
姓名:
学号:
指导教师:
成绩:
计算机与信息工程系
2014年6月6日
目录
1 设计内容及要求 (1)
1.1设计内容 (1)
1.2设计任务及具体要求 (1)
2 概要设计 (2)
2.1程序设计思路 (2)
2.2 总体程序框图 (3)
3 设计过程或程序代码 (4)
3.1各个模块的程序流程图及运行界面 (4)
3.2对关键代码加以分析说明 (7)
4 设计结果与分析 (13)
4.1程序调试的结果 (13)
4.2程序设计分析 (13)
5 小结 (14)
致谢 (15)
参考文献 (16)
源程序 (17)
1 设计内容及要求
1.1设计内容
万年历,实际上就是记录一定时间范围内(比如100年或更多)的具体阳历或阴历的日期的年历,方便有需要的人查询使用。
在我设计的万年历中主要有:(1)使用图形用户界面来查询用用户所需的日期信息,符合日常软件使用规范。
(2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。
(3)并且添加了重大节日与星座等信息,界面采用日常的星期与月份结合的格式,方便查看与使用。
(4)编写万年历的课程设计,是为了使同学们更加了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具备初步的高级语言程序设计能力。
为后续各门计算机课程的学习和毕业设计打下坚实基础。
1.2设计任务及具体要求
利用JAVA语言编写的万年历系统采用了多种JAVA语句来实现多种功能。
用户可以通过本程序的applet运行界面来查找一整年某月的农历和阳历,可以查找用户所想了解的某一天具体为星期几,并且可以看到一些重大节日的具体时间。
要求:满足设计万年历系统的目的,即当用户查询年份与月份时,系统就要将这一年的某一月份的阴历与阳历全部显示出来,并且附带这一月份的重大节日。
当用户随意改动年份或月份时系统自动显示与星期对应的日期。
用户点击日期时系统会显示具体星座信息。
2 概要设计
2.1程序设计思路
(1)总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为365。
然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。
(2)输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。
(3)算出输出月份第一天为星期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。
(4)如果年份小于1900年则程序不予判断。
(5)公历与农历的换算。
公历年对应的农历数据,每年三字节,格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期但如果是在闰年又不到3 月份上述之和要减一天再除7星期数为0。
阴历月份计算:4\6\9\11几个小月返回29天,2月经过判断是否为闰年,选择返回28或29天,其余月份为大月,返回31天。
(6)系统时间的设置。
直接从系统得到时间,设置字体,背景,显示框架等等,绘图就好了。
2.2 总体程序框图
图1 总体程序框图
3 设计过程或程序代码3.1各个模块的程序流程图及运行界面
(1)公历转农历流程图与运行界面
①流程图
图2 公历转农历流程图
②运行界面
图3 公农历运行图
(2)时间调整程序流程图
①流程图
图4 时间调整流程图
②运行界面
图5 万年历运行图
3.2对关键代码加以分析说明
(1)本次程序设计共用了class MainCal extends JFrame implements,class CurrTimeLabel和class Lunar三个大类,用于绘制万年历,显示万年历的系统时间和完成农历与公历的换算。
这些类中又运用了许多函数,来完成月份的输出,背景的设置,特定日期的标注等等。
引用的类有:
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
(2)农历的显示:要算出某年某月某日的农历日期,只能采用逐日递推的方式,这里以1900年1月31的日期为依据,它的农历日期为一九零零年大年初一,调用日历类可以算出所求日期与1900年1月31日相差多少天,设这个差值为offset,则用offset与1900~2100的农历年天数逐个相减,当offset<=0时,可以确定当前农历年份。
再用相减后得到的offset与得到的年份的农历月天数逐个相减,同理,当offset<=0时可以确定农历月份。
最后,Offset加上当前月份的天数就可以得到农历日期了,至此,阳历与农历的转换算法得以实现。
在排列阳历日期时,调用阳历与农历的转换算法得到相应农历日期,将对应阳历日期标签下的内容设为农历日期,主要源代码如下:
public Lunar(Calendar cal) {
// cal.add(cal.get(Calendar.DAY_OF_MONTH),1);
int monCyl;
int leapMonth = 0;
Date baseDate = null;
try {
baseDate = chineseDateFormat.parse(" 1900年1月31日");
} catch (ParseException e) {
e.printStackTrace(); // To change body of catch statement use
// Options | File Templates.
}
// 求出和1900年1月31日相差的天数
int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
monCyl = 14;
// 用offset减去每农历年的天数
// 计算当天是农历第几天
// i最终结果是农历的年份
// offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
monCyl -= 12;
}
// 农历年份
year = iYear;
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;
}
(3)当前系统时间的显示:java.swing.Timer这个类可以方便地实现对时钟时间的操作,Timer类大多用于计划功能,这里用于刷新系统时间的显示,javax.swing.Timer.Timer(int delay,ActionListener listener)delay可以设置隔多长时间执行任务,listener即用于监听的事件,每隔一定时间执行一次,这里delay 以毫秒为单位,设为1000,实际上就是一秒,这样闹钟就能每秒钟刷新一次,保证时间显示正确。
它的部分源代码如下:
public class CurrTimeLabel extends JLabel{
private static final long serialVersionUID = 1L;
/**
* Define a second
*/
private final static int ONE_SECOND=1000;
/**
* Timer Object,use to refresh label's text
*/
Timer timer=new Timer(ONE_SECOND,new ActionListener(){
public void actionPerformed(ActionEvent evt){
setCurrTimeToText();
}
});
/**
* Constructor
* @param strText
*/
public CurrTimeLabel(String strText){
super(strText);
timer.start();
}
/**
* Set current time to label's text
*
*/
private void setCurrTimeToText(){
this.setText(getCurrTime());
this.setFont(new Font( "宋体", Font.BOLD, 18));
}
/**
* Get current time,format is yyyy/MM/dd HH:mm:ss
* @return current time String
*/
private String getCurrTime(){
Calendar cal= Calendar.getInstance();
SimpleDateFormat fromatter=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String strCurrTime=fromatter.format(cal.getTime());
return strCurrTime;
}
}
(4)节日的显示:节日的分布是固定的,较之节气来说,更容易操作和实现,我假设每个月份三个节日,在排列中,只需取出每个月的三个节日的日期比较一下,相等就把日历信息修改一下。
部分源代码如下:
if((i-initWeek+1)==sFtvDay){
if(sFtv[month-1][k]!=null){
labelDay[a1+1][a2].setText(sFtv[month-1][k++]);
labelDay[a1+1][a2].setFont(new Font("黑体", Font.BOLD, 8));
}
if(k<=2)sFtvDay=sFtvDate[month-1][k];
}
4 设计结果与分析
4.1程序调试的结果
本程序经过设计并成功的调试了万年历系统的程序并且满足了万年历系统应该有的功能,例如:通过本程序的applet运行界面来查找一整年某月的农历和阳历,某一年某一月的日历,并且还是实现了重大节日的查询功能。
这样一来能更快的查询我们所需要的信息,程序调试结果如下图所示。
图6 万年历调试结果
4.2程序设计分析
在设计此程序时,即使会满足我们设计的要求但同时也存在小缺陷:
(1)此万年历的功能不够强大,调试后只能显示一些重大的节日而不能所有的节日都显示出来。
(2)设计这个万年历系统还有一个很大的遗憾就是没能添加二十四节气,这是美中不足的地方。
(3)万年历本应能查询一万年的日历,但在此程序中只是能查询一百多年的日历。
5 小结
在这次课程设计中,主要是运用Java语言来编写,并可运用其他的技术。
在我的系统中,还采用了Swing控件、输入输出流等技术,而这些知识都是我们没有学过的,这就要求我们去查阅相关书籍。
正因为这样,才锻炼了我的自学能力,为以后的学习打下了基础。
此外,我还深刻感受到了面向对象语言中类库的强大功能,掌握了运用Java中的类实现某些基本功能,并学会了自己查询使用类的方法,为以后的面向对象语言的自学奠定了基础。
万年历系统程序的设计成功会让快节奏的社会上的感到方便,因为现在的社会离不开时间。
他们只需要呆在家里就可以清楚的知道某一天的日期。
并且对人们的工作也有所帮助,方便他们查询某年某月的资料以及制作报表。
因此,我认为万年历在今后的发展空间很大,如果包装成简易软件会有很高的利用价值,我们可以随时随地查阅。
致谢
在这次JAVA高级语言课程设计中,我的老师和同学给了我及大的帮助。
特别是我的指导老师兼授课教师陈磊老师,在此,我对他们表示感谢。
感谢他们在我面对困难时给了我帮助和支持,,也感谢那些给我帮助的所有同学。
参考文献
[1] 牛晓太.Java程序设计教程[M],北京:清华大学出版社,2013.
[2] 朱福喜,傅建明.JAVA项目设计与开发范例[M],北京:电子工业出版社,2005.
[3] 刘宝林.JAVA程序设计与案例[M].北京:高等教育出版社,2006.
[4] 刘亚峰,纪超.JavaSE6.编程指南[M].北京:人民邮电出版社,2007.11
[5] Walter Savitch. Java完美编程[M]. 清华大学出版社.第三版
[6] Philip Heller. 零起点Java应用编程[M]. 电子工业出版社
[7] Deitlel. Java大学英语教程[M]. 电子工业出版社
[8] Cay S.Horstmann. Java核心技术[M]. 电子工业出版社
[9] 汪晓平. 精通Java网络编程[M]. 清华大学出版社. 2005
[10] 孙一平,陈立. Java网络编程实例[M]. 清华大学出版社. 2004
[11] 袁海燕,王文涛. Java实用程序设计[M]. 人民邮电出版社. 2005
[12] 郑阿奇. Java实用教程[M]. 电子工业出版社. 2006
[13] 罗依. Java Swing[M]. 清华大学出版社. 2006
[14] 王涛,刘继光. Java2 API大全[M]. 电子工业出版社
[15] Joseph L.Weber. Using Java2[m]. 电子工业出版社
附录1:
源程序
(1)MainCal.java
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.Window;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.util.*;
public class MainCal extends JFrame implements ActionListener { private static final long serialVersionUID = -1414990677727455448L;
private JLabel datas[][] = new JLabel[6][7];// 显示一月的日期
private JLabel label = null;
private JPanel panel_Header, panel_Week, panel_Calendar;
private Calendar calendar = null;
private JComboBox year_box = null;
private JComboBox month_box = null;
private int today;
public MainCal() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setTitle(" 万年历(邱丽丽JA V A课程设计2014-06-10)");
boundsWindowOnScreen(this,0.7,0.8);
setVisible(true);
calendar = Calendar.getInstance();
today = calendar.get(Calendar.DAY_OF_MONTH);
panel_Header = initializtion_Header();
panel_Week = initializtion_Week();
panel_Calendar = initializtion_Calendar();
setLayout(new BorderLayout());
add(panel_Header,BorderLayout.NORTH);
JPanel pan=new JPanel();
add(pan,BorderLayout.CENTER);
pan.setLayout(new BorderLayout());
pan.add(panel_Week,BorderLayout.NORTH);
pan.add(panel_Calendar,BorderLayout.CENTER);
initializtion_Data(calendar);
}
private JPanel initializtion_Header() {// 显示表头的panel
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0, 43));
year_box = new JComboBox();
month_box = new JComboBox();
JPanel panel_l = new JPanel();
JPanel panel_r = new JPanel();
JLabel label=new JLabel(" 当前时间:");
CurrTimeLabel ct =new CurrTimeLabel("current time");
panel_r.add(label);
panel_r.add(ct);
//panel.setBorder(new EtchedBorder(5, Color.red, Color.BLUE));
JLabel year_l = new JLabel("请您选择年份: ", JLabel.RIGHT);
JLabel month_l = new JLabel("月份: ", JLabel.RIGHT);
panel.setSize(525, 45);
for (int i = 1900; i < 2050; i++)
year_box.addItem(i);
for (int j = 1; j <= 12; j++)
month_box.addItem(""+j);
year_box.setSelectedIndex(calendar.get(Calendar.YEAR) - 1900);
month_box.setSelectedIndex(calendar.get(Calendar.MONTH));
panel_l.add(year_l);
panel_l.add(year_box);
panel_l.add(month_l);
panel_l.add(month_box);
panel.add(panel_l,BorderLayout.WEST);
panel.add(panel_r,BorderLayout.EAST);
year_box.addActionListener(this);
month_box.addActionListener(this);
return panel;
}
private JPanel initializtion_Week() {// 显示星期的panel
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(0, 33));
panel.setLayout(new GridLayout(1, 7));
String columnNames[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五","星期六" };
JLabel label = null;
for (int i = 0; i < 7; i++) {
label = new JLabel(columnNames[i], JLabel.CENTER);
if (i == 0 || i == 6)
label.setForeground(Color.RED);
label.setBorder(new LineBorder(new Color(70, 130, 180)));
panel.add(label);
}
return panel;
}
private JPanel initializtion_Calendar() {// 显示日期的panel JPanel panel = new JPanel();
panel.setLayout(new GridLayout(6, 7));
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 7; j++) {
label = new JLabel("", JLabel.CENTER);
datas[i][j] = label;
label.setBorder(new LineBorder(new Color(70, 130, 180)));
if (j == 0 || j == 6)
label.setForeground(Color.RED);
datas[i][j].addMouseListener(new List_MouseListener());
panel.add(label);
}
}
return panel;
}
public void clear_Data() {// 清空内容的
for (int i = 0; i < 6; i++)
for (int j = 0; j < 7; j++) {
datas[i][j].setText("");
if (j == 0 || j == 6)
datas[i][j].setForeground(Color.RED);
else
datas[i][j].setForeground(null);
}
}
public void initializtion_Data(Calendar calendar) {// 初始化函数// //////////////////////////////////////////////////
// //////////////////////////////////////////////////////////
/*
* 节日和纪念日格式:起始年(yyyy)+月(mm)+日(dd)
*
*
*
* 0000表示起始年不明
*/
HashMap<String, String> sFestival = new HashMap<String, String>();
// String []sFestival_={
sFestival.put("0101", " 元旦");
sFestival.put("0214", "情人节");
sFestival.put("0308", "妇女节");
sFestival.put("0312", "植树节");
sFestival.put("0401", "愚人节");
sFestival.put("0501", "劳动节");
sFestival.put("0504", "青年节");
sFestival.put("0601", "儿童节");
sFestival.put("0701", "建党节");
sFestival.put("0801", "建军节");
sFestival.put("0910", "教师节");
sFestival.put("1001", "国庆节");
sFestival.put("1031", "万圣节");
sFestival.put("1112", "孙中山诞辰");
sFestival.put("1225", "圣诞节");
sFestival.put("1226", "毛泽东诞辰");
// };
// 某月第几个星期几
// 起始年(4位)+月(2位)+第几个(1位)+星期几(1位)
HashMap<String, String> wFestival = new HashMap<String, String>(); // String []wFestival={
wFestival.put("0520", "母亲节");
wFestival.put("0620", "父亲节");
wFestival.put("1144", "感恩节");
// };
// 农历99表示月最后一天
HashMap<String, String> lFestival = new HashMap<String, String>(); // String []lFestival={
lFestival.put("0101", "春节");
lFestival.put("0102", "大年初二");
lFestival.put("0103", "大年初三");
lFestival.put("0115", "元宵节");
lFestival.put("0505", "端午节");
lFestival.put("0707", "七夕");
lFestival.put("0815", "中秋节");
lFestival.put("0909", "重阳节");
lFestival.put("1208", "腊八节");
lFestival.put("1299", "除夕");
// };
// ///////////////////////////////////////////////////////////
// //////////////////////////////////////////////////
this.calendar = calendar;
today = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH);
int weekindexDay;
int weekindexMonth;
calendar.set(Calendar.DATE, 1);
while (calendar.get(Calendar.MONTH) == month) {
weekindexMonth = calendar.get(Calendar.WEEK_OF_MONTH) - 1;
weekindexDay = calendar.get(Calendar.DAY_OF_WEEK) - 1;
int day = calendar.get(Calendar.DAY_OF_MONTH);
// /////////////////////////////////////////////
String today_, month_;
today_ = day < 10 ? "0" + day : "" + day;
month_ = month < 10 ? "0" + (month + 1) : "" + (month + 1);
Lunar lunar = new Lunar(calendar);
String lunar_ = lunar.toString();
// /////////////////////////////////////////
if (null != sFestival.get(month_ + today_))
lunar_ = "<font color=red>" + sFestival.get(month_ + today_);
// /////
String wFestival_ = month_ + (weekindexMonth) + (weekindexDay);
if (null != wFestival.get(wFestival_)) {
lunar_ = "<font color=red>" + wFestival.get(wFestival_);
//System.out.println(wFestival_);
}
if (null != lFestival.get(lunar.numeric_md()))
lunar_ = "<font color=red>" + lFestival.get(lunar.numeric_md());
// 计算除夕
Calendar temp_calendar = Calendar.getInstance();
temp_calendar.set(calendar.get(Calendar.YEAR), month, day + 1);
// temp_calendar.add(Calendar.DAY_OF_MONTH,1);
Lunar temp_lunar = new Lunar(temp_calendar);
String temp_str = temp_lunar.numeric_md();
if (temp_str.equals("0101"))
lunar_ = "<font color=red>" + lFestival.get("1299");
// /计算除夕结束
// ////////////////////////////////////////
String day_str;
if (day < 10)
day_str = "<html><center><font size=6>" + today_;
else
day_str = "<html><center><font size=6>" + today_;
day_str += "</font><br>" + lunar_;
if (day == today)
datas[weekindexMonth][weekindexDay].setForeground(Color.GREEN);
datas[weekindexMonth][weekindexDay].setText(day_str);
calendar.add(Calendar.DATE, 1);
}
// ///////////////////////////////////////////////
}
public void actionPerformed(ActionEvent e) {// 日期和年份的选择更新int year = Integer.parseInt(year_box.getSelectedItem().toString());
int month = Integer.parseInt(month_box.getSelectedItem().toString()) - 1;
calendar.set(year, month, today);
clear_Data();
Initializtion_Data(calendar);
}
class List_MouseListener implements MouseListener {// 鼠标移入时显示的信息
JLabel labe = null;
String weeks[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
public String constellation(Calendar cal) {
String[][] con = { { "水瓶座", "0122", "0221" },
{ "双鱼座", "0222", "0321" }, { "白羊座", "0322", "0420" },
{ "金牛座", "0421", "0521" }, { "双子座", "0522", "0621" },
{ "巨蟹座", "0621", "0721" }, { "狮子座", "0722", "0821" },
{ "处女座", "0822", "0921" }, { "天秤座", "0922", "1021" },
{ "天蝎座", "1022", "1121" }, { "射手座", "1122", "1221" },
{ "摩羯座", "1222", "0121" } };
int month = cal.get(Calendar.MONTH) + 1;
int today = cal.get(Calendar.DAY_OF_MONTH);
String month_str = month < 10 ? "0" + month : "" + month;
String today_str = today < 10 ? "0" + today : "" + today;
String str = month_str + today_str;
for (int i = 0; i < con.length - 1; i++) {
if (Integer.parseInt(str) >= Integer.parseInt(con[i][1])
&& Integer.parseInt(str) <= Integer.parseInt(con[i][2]))
return con[i][0];
}
if ((Integer.parseInt(str) >= Integer.parseInt(con[11][1])
&& Integer.parseInt(str) < 1232) || Integer.parseInt(str) <=
Integer.parseInt(con[11][2]))
return con[11][0];
return "error!";
}
public void mouseClicked(MouseEvent e) {// 鼠标按键在组件上单击(按下并释放)时调用。
}
public void mouseEntered(MouseEvent e) {// 鼠标进入到组件上时调用。
labe = (JLabel) e.getSource();
String lab = labe.getText();
if (lab != "") {
labe.setBackground(Color.red);
String day = lab.substring(lab.indexOf("size=6>") + 7, lab
.indexOf("</font>"));
// String lun=lab.substring(lab.indexOf("<br>")+4);
String message = "<html><body><center>公元"
+ year_box.getSelectedItem() + "年"
+ month_box.getSelectedItem() + "月"
+ Integer.parseInt(day) + "日";
calendar.set(Integer.parseInt(year_box.getSelectedItem()
.toString()), Integer.parseInt(month_box
.getSelectedItem().toString()) - 1, Integer
.parseInt(day));
Lunar lunar = new Lunar(calendar);
message += "<br><font color=red>"
+ weeks[(calendar.get(Calendar.DAY_OF_WEEK) - 1)];
message += " " +
constellation(calendar)
+ "</font><br>农历";
message += lunar.get_month() + "月" + lunar.get_Big_Or_Small()
+ " " + lunar.get_date() + "日";
// message+=lunar.get_JQ();
labe.setToolTipText(message);
labe.setBackground(new Color(112, 128, 144));
labe.setOpaque(true);
// System.out.println(day+":"+lun);
}
}
public void mouseExited(MouseEvent e) {// 鼠标离开组件时调用。
labe.setBackground(null);
labe.setOpaque(true);
}
public void mousePressed(MouseEvent e) {// 鼠标按键在组件上按下时调用。
}
public void mouseReleased(MouseEvent e) {// 鼠标按钮在组件上释放时调用。
}
}
static public void boundsWindowOnScreen(Window window, double ratioX, double ratioY) {
Toolkit tk = window.getToolkit();
Dimension scrn = tk.getScreenSize();
int left=(int)(scrn.width/2-scrn.width*ratioX/2);
int up=(int)((scrn.height-scrn.height*ratioY)/3);
window.setBounds(left,
up, (int) (scrn.width * ratioX),
(int) (scrn.height * ratioY));
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainCal();
//SwingConsole.run(mc, 0.7, 0.8);
//boundsWindowOnScreen(new MainCal(),0.7,0.8);
}
}
(2)Lunar.java
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[] = { "一", "二", "三", "四", "五", "六", "七","八", "九", "十", "十一", "十二" };
final static String Big_Or_Small[] = { "大", "小", "大", "小", "大", "小", "大","大", "小", "大", "小", "大" };
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));
}
/** */
/**
* 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数? monCyl4:从1900年1月31日以来,闰月数
* dayCyl5:与1900年1月31日相差的天数,再加40 ?
*
* @param cal
* @return
*/
public Lunar(Calendar cal) {
// cal.add(cal.get(Calendar.DAY_OF_MONTH),1);
int monCyl;
int leapMonth = 0;
Date baseDate = null;
try {
baseDate = chineseDateFormat.parse(" 1900年1月31日");
} catch (ParseException e) {
e.printStackTrace(); // To change body of catch statement use
// Options | File Templates.
}
// 求出和1900年1月31日相差的天数
int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
monCyl = 14;
// 用offset减去每农历年的天数
// 计算当天是农历第几天
// i最终结果是农历的年份
// offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {
daysOfYear = yearDays(iYear);
offset -= daysOfYear;
monCyl += 12;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
monCyl -= 12;
}
// 农历年份
year = iYear;
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;
}
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];
}
public String toString() {
return /* cyclical() + "年" + */(leap ? "闰" : "")
+ chineseNumber[month - 1] + "月" + getChinaDayString(day);
}
public String numeric_md() {// 返回阿拉伯数字的阴历日期
String temp_day;
String temp_mon;
temp_mon = month < 10 ? "0" + month : "" + month;
temp_day = day < 10 ? "0" + day : "" + day;
return temp_mon + temp_day;
}
public String get_month() {// 返回阴历的月份
return chineseNumber[month - 1];
}
public String get_date() {// 返回阴历的天
return getChinaDayString(day);
}
public String get_Big_Or_Small() {// 返回的月份的大或小
return Big_Or_Small[month - 1];
}
}
(3)CurrTimeLable.java
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.JLabel;
import javax.swing.Timer;
/**
* This class is use to show current time,can auto refresh
*
*@authorjunglesong(******************)
* @since 1.0.0 2005/06/27PM
* @version 1.0.0 2005/06/27PM
*/
public class CurrTimeLabel extends JLabel{
private static final long serialVersionUID = 1L;
/**
* Define a second
*/
private final static int ONE_SECOND=1000;
/**
* Timer Object,use to refresh label's text
*/
Timer timer=new Timer(ONE_SECOND,new ActionListener(){ public void actionPerformed(ActionEvent evt){
setCurrTimeToText();
}
});
/**
* Constructor
* @param strText
*/。