用java语言编写一个万年历程序,要求只显示阳历、节日、还有农历年、闰年

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用java语言编写一个万年历程序,要求只显示阳历、节日、还有农历年、闰年相关的知识,希望对你有一定的参考价值。

/**
* @(#)AidyCalender.java
*
*
* @author
* @version 1.00 2008/7/19
*/
import java.awt.*;
import java.awt.event.*;
import java.lang.StringBuffer;
import javax.swing.*;
import java.util.*;
import javax.swing.Timer;
import javax.swing.border.*;

public class AidyCalender extends JFrame implements ActionListener,ItemListener

Date date = new Date();
private GregorianCalendar gregorianCalendar = new GregorianCalendar();
//定义中英文字符数组存储星期信息,用于转换显示
private String[] stringWeekEn = new String[] "SUN", "MON", "TUE", "WED",
"THU", "FRI", "SAT" ;
private String[] stringWeekCn = new String[] "星期日", "星期一", "星期二", "星期三",
"星期四", "星期五", "星期六" ;
//定义存储月份的信息数组,用于转换显示方示
private String[] stringMonthEn = new String[] "Jan", "Feb", "Mar", "Apr",
"May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec" ;
private String[] stringMonthCn = "一月","二月","三月","四月","五月","六月",
"七月","八月","九月","十月","十一月","十二月";

private String[] sysNowTime = new String[6];//sysNowTime 用于存储系统时间的变量
private String[] sysRunTime = new String[6];
private JLabel []labelWeek = new JLabel[7];
private JLabel []labelDay = new JLabel[42];
private JLabel labelTime = new JLabel();

private JPanel panel1 = new JPanel();
private JPanel panel2 = new JPanel();
private JPanel panel3 = new JPanel();
private JComboBox combo1 = new JComboBox();
private JComboBox combo2 = new JComboBox();
private JButton buttonToday = new JButton();

private Border border = BorderFactory.createRaisedBevelBorder();
private Border border1 = BorderFactory.createLineBorder(Color.cyan,3);

public AidyCalender(String title)
super(title);

for (int y = 1900; y < 2101; y++)
combo1.addItem(" " + new Integer(y).toString()+"年");

for (int m = 0;m<12;m++)
combo2.addItem(" "+stringMonthCn[m]);

buttonToday.setText("今 天");
setLayout(new FlowLayout());
add(panel1);
add(panel2);
add(panel3);
panel1.setLayout(new GridLayout(1,3,10,0));
panel1.add(combo1);
combo1.addItemListener(this);
panel1.add(combo2);
combo2.addItemListener(this);
panel1.add(buttonToday);
buttonToday.addActionListener(this);
labelTime.setFont(new Font("宋体",Font.PLAIN,16));
labelTime.setForeground(Color.MAGENTA);
panel1.add(labelTime);
Timer time = new Timer(1000,new TimerListener());
time.addActionListener(new TimerListener());
//time.setRepeats(true);
time.start();

//labelTime.addAncestorListener(new TimerListener());

panel2.setLayout(new GridLayout(7,7,0,10));
panel2.setBackground(Color.white);

for(int i=0;i<7;i++)
labelWeek[i] = new JLabel();
labelWeek[i].setHorizontalAlignment(0);
if(i==0||i==6)
labelWeek[i].setBackground(Color.blue);
labelWeek[i].setForeground(Color.RED);
labelWeek[i].setFont(new Font("黑体",Font.BOLD,14));


else
labelWeek[i].setForeground(Color.BLACK);
labelWeek[i].setFont(new Font("新宋体",Font.PLAIN,14));


labelWeek[i].setText(stringWeekCn[i]);
panel2.add(labelWeek[i]);


for(int i= 0;i<42;i++)
labelDay[i] = new JLabel();
labelDay[i].setHorizontalAlignment(0);
labelDay[i].setText("");
panel2.add(labelDay[i]);


addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
System.exit(0);

);

setSize(300,300);
setBounds(250, 200, 400, 360);
setVisible(true);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

getSysDate();
setNowDate();


public void actionPerformed(ActionEvent ae)
if(ae.getSource()==buttonToday)
setNowDate();



public void itemStateChanged(ItemEvent aa)
setChangeDate();



public int turnWeek(String week)
int i;
for(i=0;i<7;i++)
if(week.equalsIgnoreCase(stringWeekEn[i]))
break;
return i;


public int turnMonth(String month)
/**
*int turnMonth(String month)
*@month 系统日期中的月,诸如Jan\Feb
*@return int
*返回一个整数值,用于寻找stringMonthCn[]数组中对应的中文月份
*/
int i;
for(i=0;i<12;i++)
if(month.equalsIgnoreCase(stringMonthEn[i]))
break;
return i;

/**
*setNowDate()
*设置当前系统日期
*/
public void setNowDate()

setSysDate(getNowYear(),getNowMonth());
getSysRunDate();
setDateNull();
combo1.setSelectedIndex(getShowYear() - 1900);
combo2.setSelectedIndex(getShowMonth());
setDays(getMonthDays(getNowYear(),getNowMonth()),getInitWeek(sysRunTime[0]),getNowDay());
//labelTime.setText(sysNowTime[3]);
//labelTime.setHorizontalAlignment(0);


/**Integer getShowYear()
*获取组合框中应该显示的年份
*/

public void setSysDate(int year,int month)
gregorianCalendar.set(year,month,1);

public void setDateNull()
for(int i=0;i<42;i++)
labelDay[i].setText("");


public void setChangeDate()
setSysDate(getComboYear(),getComboMonth());
getSysRunDate();
setDateNull();
setDays(getMonthDays(getComboYear(),getComboMonth()),getInitWeek(sysRunTime[0]),-1);


public int getMonthDays(int year, int month)
/**
*返回所选年月的天数,因为数组中的数值从0开始,所以3\5\8\10分别代表4\6\9\11几个小月.
*而1代表2月,经过是否为闰年判断,选择返回28或29天.
*其余月份为大月,返回31天.
**/
switch (month)
case 3:
case 5:
case 8:
case 10:
return 30;//小月返回30天
case 1:
if (gregorianCalendar.isLeapYear(year))
//isLeapYear(year)确定当前纪元中的指定年份是否为闰年。
return 29;
else
return 28;
//闰年的二月返回29天,平年返回28天
default:
return 31;
//大月返回31天


/**
*int getComboYear()
*获取组合框中的年份
*/
public void getSysDate()
date = gregorianCalendar.getTime();
sysNowTime = (date.toString()).split(" ");

public void getSysRunDate()
date = gregorianCalendar.getTime();
sysRunTime = (date.toString()).split(" ");

public int getComboYear()
return combo1.getSelectedIndex()+1900;


/**
*int getComboMonth()
*获取月组合框中的整数值,
*/
public int getComboMonth()
return combo2.getSelectedIndex();


public int getInitWeek(String initWeek)
/**
*getWeekNow(String initWeek)
*@para nowWeek 系统日期中的星期
*返回当月中的1号是从星期几开始
*/
int nowWeek = 0 ;
for(int i = 0;i<7;i++)
if(initWeek.equalsIgnoreCase(stringWeekEn[i]))

nowWeek = i;
break;


return nowWeek;

public int getNowYear()
return Integer.parseInt(sysNowTime[5]);

public int getNowMonth()
int nowMonth=0;
for(int i=0;i<12;i++)
if(sysNowTime[1].equalsIgnoreCase(stringMonthEn[i]));
nowMonth=i;
break;

return nowMonth;

public int getNowDay()
return Integer.parseInt(sysNowTime[2]);


public Integer getShowYear()
return Integer.parseInt(sysNowTime[5]);


public Integer getShowMonth()
/**
*Integer getShowMonth()
*获取在组给框中显示的中文格式月份:如七月\八月等
*/
return turnMonth(sysNowTime[1]);


public void setDays(int monthDays,int initWeek,int day)
/**
*void setDays(int monthDays,int initWeek,int day)
*@para monthDays 本月天数
*@para initWeek 初始星期
*@para day 今天日
*设置月历
*/
setDateNull();
for(int i=initWeek;i<initWeek+monthDays+1;i++)
if((i-initWeek+1)==day)
labelDay[i].setBorder(border1);
labelDay[i].setForeground(Color.BLUE);
labelDay[i].setFont(new Font("黑体",Font.BOLD,20));
else if((i%7==0)||(i%7==6))
labelDay[i].setForeground(Color.RED);
else
labelDay[i].setForeground(Color.BLACK);

labelDay[i].setText(String.valueOf(i-initWeek+1));

for(int i=initWeek+monthDays;i<42;i++)
labelDay[i].setText("");


class TimerListener implements ActionListener
//AdapterDemo var=new AdapterDemo("万年历程序--Aidy");

public void actionPerformed(ActionEvent e)

GregorianCalendar g = new GregorianCalendar();
String clock = new String((g.getTime().toString().split(" "))[3]);
labelTime.setText(clock);



public static void main(String args[])

try
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch(Exception e)
throw new RuntimeException(e);

AidyCalender var=new AidyCalender("万年历程序--Aidy");





本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aidydream/archive/2008/07/19/2678664.aspx
参考技术A 我现在还没有学这么深呢。但是上面这回答有点不好。自己不能控制日,只能控制年和月,要是在能控制日那就好啦

以上是关于用java语言编写一个万年历程序,要求只显示阳历、节日、还有农历年、闰年的主要内容,如果未能解决你的问题,请参考以下文章

求高手编写一个万年历的C语言程序

JAVA线程万年历(阳历+阴历+节日+时间)

JAVA线程万年历(阳历+阴历+节日+时间)

谁知道怎么用C语言编写万年历啊

用Java编写一个日期查询程序

万年历公历农历查询