`
feng5199
  • 浏览: 10917 次
  • 性别: Icon_minigender_1
  • 来自: 海上漂
社区版块
存档分类
最新评论

(有图片&&最新修改—显示节日、休假)----Java写出来的日历(有显示农历)

阅读更多


  前言:总是喜欢看日历,看多了突然萌发出来自己想做个日历出来的想法。本来自己是个程序员(java),目前上班空闲时间也算多;于是从网络上看了看有关怎样用java来实现日历的相关示例及文章,自己就开始动手操作了!{不过现在做出来还是有点bug:就是程序初始化运行之后,系统当前日期的颜色突出显示问题;当我更换月份、或者是年份后再回到当前的时间,突出显示当前(今天的)时间的颜色会随鼠标的移动而消失;这个让我不解,试了好多种方式都没弄好!希望javaeye的高手们看了后,能帮我解决这个问题}--此bug已修正……好了废话不多说,马上把源代码贴出。。。(注:Java日历.rar附件是用exe4j打包出来的exe可执行文件,如本机安装了JDK或是有不是安装版JDK的环境变量;都可以直接双击运行查看效果。JDK版本1.6+!上图为最新修改版的效果。。。)

           

package org.cal;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.swing.ImageIcon;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * @author  作 者:xfeng 
 * @version 创建时间:2010-5-25 上午11:19:15
 */
@SuppressWarnings("serial")
class DateWin extends JFrame implements ItemListener {
	private Calendar cd = null;
	private int years;
	private int months;
	private int row;
	private int column;
	private int tcr_row;
	private int tcr_column;
	private int listen_tcr_row;
	private int listen_tcr_column;
	private boolean is_in_listener = false;
	private String xingqi = null;
	private JTable table;
	private Object date[][];
	private Object name[] = { "日", "一", "二", "三", "四", "五", "六" };
	private JComboBox year = new JComboBox();
	private JComboBox month = new JComboBox();
	private JLabel label1;
	private JLabel label2;
	private JLabel label3;
	private JLabel label4;
	private JLabel label5;
	private JPanel panel;
	private JPanel rights_panel = forAddEndPanel();
	static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
			"yyyy年MM月dd日");

	protected void toCenter() {
		Toolkit kit = Toolkit.getDefaultToolkit(); // 定义工具包
		Dimension screenSize = kit.getScreenSize(); // 获取屏幕的尺寸
		int screenWidth = screenSize.width / 2; // 获取屏幕的宽
		int screenHeight = screenSize.height / 2; // 获取屏幕的高
		int height = this.getHeight();
		int width = this.getWidth();
		setLocation(screenWidth - width / 2, screenHeight - height / 2);
	}

	public void getDateWin(String s) {
		ImageIcon title = new ImageIcon("images/title_xiong.gif");
		setIconImage(title.getImage());
		setTitle(s);
		setSize(410, 202);
		toCenter();
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		int startYear=1900;
		int endYear=2050;
		cd=Calendar.getInstance();
		int sysYear=cd.get(Calendar.YEAR);
		for (int i = startYear; i < endYear; i++) {
			int years = i;
			if(endYear==sysYear){
				endYear+=10;
			}
			year.addItem(years);
		}
		for (int i = 1; i < 13; i++) {
			month.addItem(i);
		}
		label1 = new JLabel("当前查看:公历 ");
		label2 = new JLabel("年");
		label3 = new JLabel("月");
		panel = new JPanel();
		panel.add(label1);
		panel.add(year);
		panel.add(label2);
		panel.add(month);
		panel.add(label3);
		Container con = getContentPane();
		con.setLayout(new BorderLayout());
		con.add(panel, BorderLayout.NORTH);
		con.add(rights_panel, BorderLayout.SOUTH);
		cd = new GregorianCalendar();
		Calendar cal = Calendar.getInstance();
		years = cd.get(Calendar.YEAR);
		year.setSelectedItem(years);
		months = cd.get(Calendar.MONTH) + 1;
		month.setSelectedItem(months);
		cd.set(Calendar.DATE, 1);
		int dateNumber = cd.getActualMaximum(Calendar.DATE);
		int firstDay = cd.get(Calendar.DAY_OF_WEEK) - 1;
		int count = 1;
		int is_today = cal.get(Calendar.DATE);
		date = new Object[6][7];
		Lunar lunar = null;
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 7; j++) {
				if (count == is_today) {
					tcr_row = i;
					tcr_column = j;
				}
				if (count > dateNumber)
					break;
				else {
					if ((i * 7 + j) < firstDay)
						continue;
					else {
						String today = years + "年" + months + "月" + count + "日";
						Calendar currentDay = Calendar.getInstance();
						try {
							currentDay.setTime(chineseDateFormat.parse(today));
						} catch (ParseException e) {
							e.printStackTrace();
						}
						lunar = new Lunar(currentDay);
						String currentDate = lunar.toString();
						int startIndex = currentDate.length() - 2;
						String showMonth = currentDate.substring(0, startIndex);
						String showDay = currentDate.substring(startIndex);
						if (showDay.equals("初一")) {
							date[i][j] = count + "/" + showMonth;
						} else {
							date[i][j] = count + "/" + showDay;
						}
						count++;
					}
				}
			}
		}
		final String cyclical = "星期" + name[tcr_column] + " 农历"
				+ lunar.cyclical() + "年";
		final String animalsYear = "【" + lunar.animalsYear() + "年】";
		label4 = new JLabel(cyclical);
		label5 = new JLabel(animalsYear);
		panel.add(label4);
		panel.add(label5);
		table = new JTable(date, name);
		table.setRowHeight(15);
		table.setEnabled(false);
		// 设置不能重新调整列宽
		table.getTableHeader().setResizingAllowed(false);
		// 设置不能重新排序各列
		table.getTableHeader().setReorderingAllowed(false);
		con.add(new JScrollPane(table), BorderLayout.CENTER);
		// 标识系统当前时间高亮显示
		DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int row, int column) {
				Component cell = super.getTableCellRendererComponent(table,
						value, isSelected, hasFocus, row, column);
				if (row == tcr_row && column == tcr_column
						&& cell.isBackgroundSet()) {// 设置变色的单元格
					cell.setBackground(Color.red);
				} else {
					cell.setBackground(Color.WHITE);
				}
				return cell;
			}
		};
		// 设置表格单元格内容居中显示
		tcr.setHorizontalAlignment(SwingConstants.CENTER);
		for (int i = 0; i < name.length; i++) {
			table.getColumn(name[i]).setCellRenderer(tcr);
		}
		year.addItemListener(this);
		month.addItemListener(this);
		foMmouseListener(true);
		con.validate();
		validate();
	}

	public void itemStateChanged(ItemEvent e) {
		Calendar cal = Calendar.getInstance();
		years = Integer.parseInt(year.getSelectedItem().toString());
		months = Integer.parseInt(month.getSelectedItem().toString()) - 1;
		cd = new GregorianCalendar(years, months, 1);
		int dateNumber = cd.getActualMaximum(Calendar.DATE);
		int firstDay = cd.get(Calendar.DAY_OF_WEEK) - 1;
		int count = 1;
		int is_year = cal.get(Calendar.YEAR);
		int is_month = cal.get(Calendar.MONTH);
		int is_day = cal.get(Calendar.DAY_OF_MONTH);
		date = new Object[6][7];
		Lunar lunar = null;
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 7; j++) {
				if (years == is_year && months == is_month && count == is_day) {
					is_in_listener = true;
					listen_tcr_row = i;
					listen_tcr_column = j;
					xingqi = "星期" + name[tcr_column] + " ";
				}
				if (count > dateNumber)
					break;
				else {
					if ((i * 7 + j) < firstDay)
						continue;
					else {
						String today = years + "年" + (months + 1) + "月" + count
								+ "日";
						Calendar currentDay = Calendar.getInstance();
						try {
							currentDay.setTime(chineseDateFormat.parse(today));
						} catch (ParseException ex) {
							ex.printStackTrace();
						}
						lunar = new Lunar(currentDay);
						String currentDate = lunar.toString();
						int startIndex = currentDate.length() - 2;
						String showMonth = currentDate.substring(0, startIndex);
						String showDay = currentDate.substring(startIndex);
						if (showDay.equals("初一")) {
							date[i][j] = count + "/" + showMonth;
						} else {
							date[i][j] = count + "/" + showDay;
						}
						count++;
					}
				}
			}
		}
		panel.remove(label4);
		panel.remove(label5);
		final String cyclical = "农历" + lunar.cyclical() + "年";
		final String animalsYear = "【" + lunar.animalsYear() + "年】";
		if (years != is_year || months != is_month) {
			xingqi = null;
		}
		label4 = new JLabel((xingqi == null ? "" : xingqi) + cyclical);
		label5 = new JLabel(animalsYear);
		panel.add(label4);
		panel.add(label5);
		table = new JTable(date, name);
		table.setRowHeight(15);
		table.setEnabled(false);
		// 设置不能重新调整列宽
		table.getTableHeader().setResizingAllowed(false);
		// 设置不能重新排序各列
		table.getTableHeader().setReorderingAllowed(false);
		getContentPane().removeAll();
		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(panel, BorderLayout.NORTH);
		getContentPane().add(rights_panel, BorderLayout.SOUTH);
		getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		// 标识系统当前时间高亮显示
		DefaultTableCellRenderer tcr = new DefaultTableCellRenderer() {
			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int _row, int _column) {
				Component cell = super.getTableCellRendererComponent(table,
						value, isSelected, hasFocus, _row, _column);
				if (is_in_listener && _row == listen_tcr_row
						&& _column == listen_tcr_column
						&& cell.isBackgroundSet()) {// 设置变色的单元格
					cell.setBackground(Color.red);
					is_in_listener = false;
				} else {
					cell.setBackground(Color.white);
				}
				return cell;
			}
		};
		// 设置表格单元格内容居中显示
		tcr.setHorizontalAlignment(SwingConstants.CENTER);
		for (int i = 0; i < name.length; i++) {
			table.getColumn(name[i]).setCellRenderer(tcr);
		}
		foMmouseListener(false);
		getContentPane().validate();
		validate();
	}

	private void foMmouseListener(final boolean is_in_listener) {
		table.addMouseMotionListener(new MouseMotionListener() {
			public void mouseDragged(MouseEvent e) {

			}

			public void mouseMoved(MouseEvent e) {
				Point point = e.getPoint();
				int x = table.rowAtPoint(point);
				int y = table.columnAtPoint(point);
				if (x != row || y != column) {
					row = x;
					column = y;
				}
				Object tip = table.getValueAt(row, column);
				if (tip != null) {
					String tip_str = tip.toString();
					String date_yangli_tip = tip_str.substring(0, tip_str
							.lastIndexOf("/"));
					StringBuffer tipText = new StringBuffer();
					StringBuffer move_currentDay_str = new StringBuffer();
					move_currentDay_str.append(years);
					move_currentDay_str.append("年");
					if (is_in_listener) {
						move_currentDay_str.append(months);
					} else {
						move_currentDay_str.append((months + 1));
					}
					move_currentDay_str.append("月");
					move_currentDay_str.append(date_yangli_tip);
					move_currentDay_str.append("日 ");
					Calendar move_currentDay = Calendar.getInstance();
					try {
						move_currentDay.setTime(chineseDateFormat
								.parse(move_currentDay_str.toString()));
					} catch (ParseException ex) {
						ex.printStackTrace();
					}
					Lunar move_lunar = new Lunar(move_currentDay);
					tipText.append(move_currentDay_str);
					tipText.append("星期");
					tipText.append(name[column] + " ");
					tipText.append("农历");
					tipText.append(move_lunar.toString());
					table.setToolTipText(tipText.toString());
				} else {
					table.setToolTipText("");
				}
			}
		});
	}

	private JPanel forAddEndPanel() {
		JPanel rights_panel = new JPanel();
		JLabel contact_label = new JLabel("联系方式:xiong_jx@foxmail.com");
		JLabel design_name_label = new JLabel("作者:Design By xfeng ");
		contact_label.setFont(new Font("宋体", 0, 12));
		design_name_label.setFont(new Font("宋体", 0, 12));
		contact_label.setForeground(Color.blue);
		design_name_label.setForeground(Color.blue);
		contact_label.setPreferredSize(new java.awt.Dimension(206, 13));
		rights_panel.add(contact_label);
		rights_panel.add(design_name_label);
		return rights_panel;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*----------设置成系统风格---------*/
		try {
			String laf = UIManager.getSystemLookAndFeelClassName();
			UIManager.setLookAndFeel(laf);
		} catch (Exception e) {
			e.printStackTrace();
		}
		DateWin dateWin = new DateWin();
		dateWin.getDateWin("Java日历  - 【xfeng】");
	}
}

 农历显示的类文件是从网上找到的,在这里感谢那位提供者!附件MainCal.rar中的Lunar.java就是提供显示农历的java类;解压MainCal.rar在Myeclipse中直接运行MainDate.java类,也可以查看效果…

  注:根据网友回馈的bug,【农历显示错误】我做了一下修改;上面主程序日历代码也有所变更,想查看更改后的效果:请下载“附件更改”的附件,两个附件是对应之前的;源代码就不贴出来了,请自己看附件吧……

  • 大小: 55.5 KB
  • Maincal.rar (9.2 KB)
  • 描述: MainCal.rar附件更改
  • 下载次数: 358
  • Java日历.rar (173.3 KB)
  • 描述: Java日历.rar附件更改
  • 下载次数: 520
分享到:
评论
17 楼 zhibaichuan 2010-08-14  
学习了。。。刚入门不久
16 楼 xinshou 2010-08-13  
放到Eclipse里就能执行,单击Java日历.exe就不行,
15 楼 royboy 2010-08-13  
显示节日更完美,呵
14 楼 王斯开 2010-08-13  
好像有Bug啊!呵呵  你看看1989-6-1农历是4.27  正确的应该是4.28啊
13 楼 feng5199 2010-08-13  
string2020 写道
那个EXE可执行文件,我双击,怎么打不开。。

这个要有安装的JDK或者是有不是安装版的JDK但有JDK环境变量配置,就可以双击运行…
12 楼 feng5199 2010-08-13  
need_faith 写道


需要哪个版本的jdk

1.5吧以上版本就行,因为里面用了Annotation
11 楼 xiaolong0211 2010-08-13  
学习了!~~~~~~
10 楼 need_faith 2010-08-13  
报错,
java.lang.UnsupportedClassVersionError: Bad version number in .class file
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at com.exe4j.runtime.LauncherEngine.launch(Unknown Source)
at com.exe4j.runtime.WinLauncher.main(Unknown Source)

需要哪个版本的jdk
9 楼 love_smallbear 2010-08-13  
LZ和我本家人啊..
8 楼 zzc_zj 2010-08-13  
用的是哪个版本的jdk啊?
7 楼 kerrysk 2010-08-13  
万年历不准
6 楼 JE帐号 2010-08-12  
写个与GUI无关的功能对象更好.
GUI层面直接掉用相应的方法即可.
5 楼 dongisland 2010-08-12  
LZ,我测试你说的那个问题没有发现有BUG啊,再试试吧,我试的还可以。
意见:要是系统时间换的话,软件时间也跟着换就最好不过了,意见而已。
4 楼 IcedCoffee 2010-08-12  
报错了...
3 楼 string2020 2010-08-12  
那个EXE可执行文件,我双击,怎么打不开。。
2 楼 xiaobo109 2010-08-12  
看到好多都没用到过,值得看看.
我是JAVA初学者,过来学习学习....
1 楼 myloveiscomealone 2010-08-12  
写得很不错.我记得跟你同学的时候写过一个坦克大战的游戏.呵呵.好多东西,好多包我都没有再用了.看了一下,回忆很多!

相关推荐

    小程序日历组件,可显示农历!休假补班!自定义提醒

    本文将详细解析如何在小程序中实现一个具备农历显示、休假补班功能以及自定义提醒的日历组件。 一、日历组件基础 1. 日历组件结构:日历组件通常由一个月的日历视图构成,每个日期格子可以包含日期数字、星期以及...

    多功能日历,可自定义日期说明,节日说明,有农历显示

    “有农历显示”是针对中国用户的特色功能,因为在中国,农历在很多传统节日和日常生活中仍然有着重要的地位。农历显示功能使得用户能够在同一界面下同时查看公历和农历,方便那些需要参考两种历法的人。 标签“日历...

    02-【休假】-02-员工休假年假登记表.xlsx

    根据给定文件信息,“02-【休假】-02-员工休假年假登记表.xlsx”这份文件很可能是一份企业内部使用的表格文档,用于记录员工的年假安排。从标题和描述来看,文件的主要内容包括员工的休假日期、休假时长、休假期间的...

    bootstrap-datetimepicker显示农历节假日信息扩展插件

    在描述中提到的“显示农历节假日、万年历信息扩展插件”,意味着该版本的Bootstrap-Datetimepicker已经进行了功能增强,能够不仅显示公历日期,还支持显示农历日期,并且包含了节假日信息,这对于中国的用户来说尤其...

    02-【休假】-01-员工休假申请表.xlsx

    员工休假申请表是企业内部用于规范员工休假流程的正式文件,其目的在于对员工提出的休假需求进行记录、审批和存档,确保企业人力资源的合理配置及员工个人权益的保障。一份标准的员工休假申请表通常包含以下几个核心...

    01-【请休假】-17-员工休假年假登记表.xlsx

    在现代社会中,员工的休假管理是人力资源管理工作中的重要一环。对于企业而言,合理地安排和记录员工的年假,不仅是对员工权益的保障,也是提升员工满意度、维持企业高效运转的关键措施。文件“01-【请休假】-17-...

    微信小程序酒店选择区间日历组件版(可通过参数实现是否显示农历日期)

    )微信小程序酒店选择区间日历组件版,可通过参数实现是否显示农历日期。 博客:https://blog.csdn.net/qq_40591925/article/details/84834692 ( ios显示问题解决: 将:var startWeek = new Date('' + year + '...

    fullcalendar支持农历 年历

    全历插件FullCalendar是一款广泛使用的JavaScript日历库,它为网页应用提供了强大的日程管理功能。这个插件以其灵活性和可定制性而受到开发者们的青睐。标题提及的"fullcalendar支持农历 年历"意味着它不仅限于公历...

    01-【请休假】-18-员工产假休假管理表.xlsx

    根据文件标题“01-【请休假】-18-员工产假休假管理表.xlsx”,我们可以推断该文档是一个专门用于管理企业内部员工产假请假流程的表格文件。产假作为女性员工生育前后的一种法定休假权利,在中国,根据《中华人民...

    01-【请休假】-17-员工休假申请表.xlsx

    在现代企业管理中,员工的休假管理是一项重要的行政任务,而休假申请表是员工向公司提出休假请求的主要文件。一个合理的休假申请表通常需要包含以下几个方面的内容: 1. 基本信息:休假申请表中必须首先记录员工的...

    01-【请休假】-16-员工休假统计表.xlsx

    员工休假统计表是企业人力资源管理中的一项重要文档,它主要用于记录和统计员工的休假情况。这张表单通常包含了员工的基本信息,包括但不限于员工姓名、职位、部门等;休假的类型,比如年假、病假、事假、婚假、产假...

    -机关事业单位人员带薪年休假请假条 --条据书信.docx

    3. **特殊规定**:不同地区或单位可能会有不同的具体规定,如特殊情况下的休假政策调整等,需留意并遵守。 4. **记录管理**:对于每一次的请假记录,都应当妥善保存,便于日后查询和统计。 通过上述知识点的梳理,...

    01-【请休假】-06-员工考勤请假表-请假时间计算.xlsx

    这张表格的标题“01-【请休假】-06-员工考勤请假表-请假时间计算.xlsx”表明了这是一个系列文件中的一个特定文档,文件编号为06,专门用于计算员工的请假时间。 请假类型通常包括事假、病假、年假、婚假、产假、陪...

    01-【请休假】-05-员工月度请假登记表.xlsx

    【01-【请休假】-05-员工月度请假登记表】所含知识点详解: 1. 月度请假登记表的基本概念:该表格是用于企业在某个月份内对员工的请休假情况进行详细记录的管理工具。它有助于企业管理员工的出勤情况,合理安排工作...

    休假申请管理系统(java jsp)

    《休假申请管理系统——Java JSP 实现详解》 在信息化高度发展的今天,企业对内部管理系统的依赖日益增强,其中休假申请管理系统是企业人力资源管理的重要组成部分。本文将详细探讨一款基于Java JSP技术实现的休假...

    01-【请休假】-19-员工休假明细统计表.xlsx

    员工休假明细统计表是企业人力资源管理中的重要文档,它记录了企业员工在一定时期内的请假情况,包括请假类型、请假天数、请假时间及原因等详细信息。这张表格对于企业来说有着重要的管理意义,具体表现在以下几个...

    01-【请休假】-12-员工请假申请审批表.xlsx.xls

    根据标题“01-【请休假】-12-员工请假申请审批表.xlsx.xls”,仅可推测该文档为员工用以申请请假的正式表格,通常包含员工信息、请假类型、请假时间、请假原因、审批流程等字段。请假类型可能涵盖事假、病假、年假等...

    事业单位年休假请假条_单位年休假请假条怎么写-条据书信.docx

    ### 事业单位年休假请假条写作指南 在事业单位工作的人们,享受年休假是其法定权利之一。正确书写年休假请假条不仅能够体现个人的职业素养,也是确保顺利获得休假审批的关键步骤。本文将从请假条的基本格式、内容...

    01-【请休假】-04-员工月度请假统计表.xlsx

    由于给定的文件信息只包含了标题和描述,而标题和描述是相同的,没有提供具体的内容和标签,所以无法从给定信息中生成具体的知识点。...如果有更详细的内容提供,我们可以进一步分析并生成更加具体的知识点。

    2022年工作日历(A4打印清晰版-PDF).pdf

    2022年工作日历是中国在2022年发布的官方日历文件,主要用途为个人、公司或机构的日常安排参考,其中包含了国家法定节假日、工作日以及农历日期等信息,方便用户进行日程规划和时间管理。该文件以PDF格式提供,可...

Global site tag (gtag.js) - Google Analytics