这是一个Java写的万年历,功能很简单。
源码
/**
* @#MyCalendar.jar 2010-8-25
* Copyright(c)Ice Spring 2010
*/
package util;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
* Java万年历
* @author Ice Spring
* @version 1.0.0
*/
public class MyCalendar extends Thread implements MouseListener,ActionListener
{
private JFrame f;
private JComboBox yearCb,monCb;
private JLabel l1, l2,l3,l4,l5,l6,l7,l8,l9;
private JMenuBar mainMb;
private JMenuItem aboutMi,timeMi;
private JButton returnBt;
private JLabel[][] dayLb;
private String title = “Java万年历”;
/**
* 表示年份
*/
public static final int YEAR = 1 ;
/**
* 表示月份
*
与Java官方月份是从0开始的表示形式不同,这里的月份是从1开始的。
与Java官方月份是从0开始的表示形式不同,这里的月份是从1开始的。
*/
public static final int MONTH = 2;
/**
* 表示某月中的某天(即年月日中的“日”)
*/
public static final int DAY_OF_MONTH= 3;
/**
* 表示星期几
*/
public static final int DAY_OF_WEEK = 9;
public MyCalendar()
{
this.load();
}
/**
* 构造方法
* @param title 标题
*/
public MyCalendar(String title)
{
this.title = title;
this.load();
}
/**
* 主流程控制方法
*/
private void load()
{
this.instantiate();
this.init();
this.setUI();
this.addAction();
this.start();
this.f.setVisible(true);
}
/**
* 实例化所有对象的方法
*/
private void instantiate()
{
this.f = new JFrame(title);
this.yearCb = new JComboBox();
this.monCb = new JComboBox();
this.returnBt = new JButton(“回到今天”);
this.l1 = new JLabel(“年”);
this.l2 = new JLabel(“月”);
this.l3 = new JLabel(“日”);
this.l4 = new JLabel(“一”);
this.l5 = new JLabel(“二”);
this.l6 = new JLabel(“三”);
this.l7 = new JLabel(“四”);
this.l8 = new JLabel(“五”);
this.l9 = new JLabel(“六”);
this.mainMb = new JMenuBar();
this.aboutMi = new JMenuItem(“关于”);
this.timeMi = new JMenuItem(“”);
this.dayLb = new JLabel[5][7];
for(int i = 0; i<5;i++)
{
for(int j=0;j<7;j++)
{
this.dayLb[i][j] = new JLabel(“”);
}
}
}
/**
* 初始化方法
*/
private void init()
{
//设置年份下拉框
for(int i = 1900 ; i<=2038 ; i++)
{
this.yearCb.addItem(i);
}
this.yearCb.setSelectedItem(getNow(YEAR));
//设置月份下拉框
for(int i = 1;i<=12;i++)
{
this.monCb.addItem(i);
}
this.monCb.setSelectedItem(getNow(MONTH));
this.refresh();
}
/**
* 设置界面方法
*/
private void setUI()
{
this.f.setSize(300,300);
this.f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.f.setLocation(150,100);
this.f.setJMenuBar(this.mainMb);
this.mainMb.add(this.aboutMi);
this.mainMb.add(this.timeMi);
JPanel p1 = new JPanel();
p1.setLayout( new FlowLayout());
p1.add(this.yearCb);
p1.add(this.l1);
p1.add(this.monCb);
p1.add(this.l2);
p1.add(this.returnBt);
this.f.add(p1,BorderLayout.NORTH);
JPanel p2 = new JPanel();
p2.setBorder(BorderFactory.createLineBorder(Color.GRAY, 1));
p2.setLayout(new GridLayout(6,7));
p2.add(l3);
p2.add(l4);
p2.add(l5);
p2.add(l6);
p2.add(l7);
p2.add(l8);
p2.add(l9);
for(int i = 0; i<5;i++)
{
for(int j=0;j<7;j++)
{
p2.add(this.dayLb[i][j]);
}
}
this.f.add(p2,BorderLayout.CENTER);
}
/**
* 添加动作方法
*/
private void addAction()
{
for(int i=0 ;i<5;i++)
{
for(int j = 0;j<7;j++)
{
this.dayLb[i][j].addMouseListener(this);
}
}
this.returnBt.addActionListener(this);
this.yearCb.addActionListener(this);
this.monCb.addActionListener(this);
this.aboutMi.addActionListener(this);
}
/**
* 线程执行方法
*/
public void run()
{
//死循环,每隔一秒刷新一次时间
for(;;)
{
this.timeMi.setText(“现在时间:”+new SimpleDateFormat(“HH:mm:ss”).format(new Date()));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/**
* 更新日历的方法
*/
private void refresh()
{
int year = Integer.parseInt(this.yearCb.getSelectedItem()+”");
int month = Integer.parseInt(this.monCb.getSelectedItem()+”");
int first = this.theFirstDay(year, month);
int days = this.getDaysOfMonth(year, month);
int z = 1;
//遍历每一个位置
for(int i = 0 ;i<35;i++)
{
//控制位置
int j = i/7;
int k = i%7;
//前几天是空的
if(i
{
this.dayLb[j][k].setText(“”);
}
//在该添加的地方添加
else if(i>(days+first-1))
{
this.dayLb[j][k].setText(“”);
}
//后几天也是空的
else
{
this.dayLb[j][k].setText((z++)+”");
}
}
this.changeColor(“this day”);
}
/**
* 改变日历颜色的方法
* @param text 需要改变的日期
*/
private void changeColor(String text)
{
//还原为原始颜色
for(int i=0 ;i<5;i++)
{
for(int j = 0;j<7;j++)
{
this.dayLb[i][j].setForeground(Color.BLACK);
}
}
//遍历日期数组
for(int i = 0;i<5;i++)
{
for(int j=0 ; j<7 ;j++)
{
//如果是当前月份的日历
if(this.yearCb.getSelectedItem().equals(this.getNow(MyCalendar.YEAR))&&this.monCb.getSelectedItem().equals(this.getNow(MyCalendar.MONTH)))
{
//将今天置为红色
if(this.dayLb[i][j].getText().equals(this.getNow(MyCalendar.DAY_OF_MONTH)+”"))
{
this.dayLb[i][j].setForeground(Color.RED);
}
}
//如果不是今天(红色)
if(this.dayLb[i][j].getForeground()!=Color.RED)
{
//而且是要改变的日期
if(this.dayLb[i][j].getText().equals(text))
{
//置为蓝色
this.dayLb[i][j].setForeground(Color.BLUE);
}
else
{
//什么也不做
}
}
}
}
}
/**
* 获取某月的第一天是星期几
* @param year 年
* @param month 月
* @return 星期几
*/
private int theFirstDay(int year , int month)
{
GregorianCalendar gc =new GregorianCalendar(year,month-1,1,1,1,1);
return gc.get(Calendar.DAY_OF_WEEK)-1;
}
/**
* 获取某个月的天数
* @param year 年
* @param month 月
* @return 这个月的天数
*/
private int getDaysOfMonth(int year , int month)
{
if( (year%4==0&&year%100!=0)||(year%400==0))
{
if(month == 2)
return 29;
}
if(month ==1||month ==3||month ==5||month ==7||month ==8||month ==10||month ==12)
{
return 31;
}
else if(month == 2) return 28;
else return 30;
}
/**
* 获取当前系统时间的某个部分,如年份,月份等等
*
目前可以提取到的部分:年、月、日、时、分、秒、毫秒、星期几
目前可以提取到的部分:年、月、日、时、分、秒、毫秒、星期几
*
如果需要提取的部分不存在,则返回0
如果需要提取的部分不存在,则返回0
* @param type 需要获取的部分,这个常量可以从本类中获取
* @return
如果需要提取的部分不存在,则返回0
int
类型 获取到的部分如果需要提取的部分不存在,则返回0
*/
public int getNow(int type)
{
GregorianCalendar gc = new GregorianCalendar();
switch(type)
{
case MyCalendar.YEAR:
return gc.get(Calendar.YEAR);
case MyCalendar.MONTH:
return gc.get(Calendar.MONTH)+1;
case MyCalendar.DAY_OF_MONTH:
return gc.get(Calendar.DAY_OF_MONTH);
case MyCalendar.DAY_OF_WEEK:
return ((gc.get(Calendar.DAY_OF_WEEK))-1);
default : return 0;
}
}
/**
* 发生动作方法(ActionListener监听器)
*/
public void actionPerformed(ActionEvent arg0)
{
Object e = arg0.getSource();
if(e == this.returnBt)
{
this.yearCb.setSelectedItem(this.getNow(YEAR));
this.monCb.setSelectedItem(this.getNow(MONTH));
this.refresh();
}
else if(e instanceof JComboBox)
{
this.refresh();
}
else if(e == this.aboutMi)
{
JOptionPane.showMessageDialog(f, “这是一个使用Java写的最基本的万年历\n” +
“版本:1.0.0\n” +
“作者:Ice Spring\n” +
“主页:http://www.javaliang.com\n” +
“1.2版本将加入农历,敬请期待”, “关于Java万年历”, JOptionPane.INFORMATION_MESSAGE);
}
}
/**
* 鼠标单击方法(MouseListener监听器)
*/
public void mouseClicked(MouseEvent e1) {
Object e = e1.getSource();
if(e instanceof JLabel)
{
JLabel l = (JLabel)e;
this.changeColor(l.getText());
}
}
public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
public static void main(String[] arg)
{
new MyCalendar();
}
}