前言:总是喜欢看日历,看多了突然萌发出来自己想做个日历出来的想法。本来自己是个程序员(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,【农历显示错误】我做了一下修改;上面主程序日历代码也有所变更,想查看更改后的效果:请下载“附件更改”的附件,两个附件是对应之前的;源代码就不贴出来了,请自己看附件吧……
相关推荐
小程序日历组件,可显示农历!休假补班!自定义提醒
可在指定日期上显示任意内容,有农历,公历多种显示。
vue日历组件,支持农历以及假期展示,可以自定义可选择日期范围 用法 <calendar @choiseDay="chosieDayCallBack" @close="showCalendar = false" :currectDays="dateParams" :showCalendar="showCalendar"></...
)微信小程序酒店选择区间日历组件版,可通过参数实现是否显示农历日期。 博客:https://blog.csdn.net/qq_40591925/article/details/84834692 ( ios显示问题解决: 将:var startWeek = new Date('' + year + '...
-机关事业单位人员带薪年休假请假条 --条据书信.docx
bootstrap-datetimepicker显示农历节假日、万年历信息扩展插件
休假申请管理系统,使用java jsp 技术实现,调试通过
事业单位年休假请假条_单位年休假请假条怎么写-条据书信.docx
微信小程序可滑动周日历组件,供大家参考,具体内容如下 看网上周日历组件比较少,自己弄了一个,和大家分享一下。 如果样式变形,请检查是否有共用样式起冲突 展示一下效果图 在components组件文件夹下新建...
砂场考勤、休假管理-安全管理-安全管理制度-矿山安全.docx
论文研究--策略工作休假.pdf, 考虑N-策略M/M/1排队,休假期间服务员并未停止工作而是以较低的速率为顾客服务.系统的决策主体是顾客,基于“收益-成本”结构,利用...
论文研究-基于多重休假的min(.pdf, 运用全概率分解技术和拉普拉斯变换工具,研究了基于服务员多重休假的min(N,V)-策略M/G/1排队系统,其中N是预设的休假终止的门限值...
Vue中使用Fullcalendar日历开发日程安排代码完整版(项目示例)
论文研究-一类休假的Geo.pdf, 考虑单重休假、Bernoulli反馈和可变输入率的离散时间GeoX/G/1可修排队.顾客的批到达速率与服务器的休假有关.刚服务完的顾客以概率1-θ进入...
SPC《员工手册》之《休假及加班管理规》-2013-02-24.doc
为了研究带启动-关闭期和N策略的单重休假M/G/1排队系统,考虑顾客服务完成后离去时刻系统中的顾客数,推导出其嵌入马尔可夫链的状态转移概率矩阵;再利用拟生灭过程与矩阵几何解的方法,给出稳态队长的母函数及其数学...
(不能自动销假就做成管理员审核的,要有同意和不同意的框) 查询请假记录页面信息:请假记录,请假时间,实际休假时间 4.管理员登陆时,审批请假界面显示学生请假条消息,选择是否同意请假 审批销假界面显示学生...
Java毕业设计-基于SSM框架的公司人力资源管理系统.rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:216】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 本V公司...
表格模板-年度机关工作人员年休假安排表.ett
为研究更一般的休假排队,在单重休假和多重休假排队基础上研究带有不耐烦顾客的M/G/1 K-重休假排队,其中顾客的不耐烦时间服从定长分布;利用母函数法和Laplace-Stieltjes变换的方法,得出该系统平均休假期长度和平均忙...