import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;
public class h_main1 extends JFrame implements ActionListener, MouseListener {
private Calendar cld = Calendar.getInstance();//获取一个Calendar类的实例对象
private String[] astr = { "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日" };
private DefaultTableModel dtm = new DefaultTableModel(null, astr);
private JTable table = new JTable(dtm);
private JScrollPane sp = new JScrollPane(table);
private JButton bLastYear = new JButton("上一年");
private JButton bNextYear = new JButton("下一年");
private JButton bLastMonth = new JButton("上月");
private JButton bNextMonth = new JButton("下月");
private JButton bAddClock = new JButton("确定");
private JPanel p1 = new JPanel(); // 装入控制日期的按钮模块
private JPanel p2 = new JPanel(new GridLayout(3,2));
private JPanel p3 = new JPanel(new BorderLayout());
private JPanel p4 = new JPanel(new GridLayout(2,1));
private JPanel p5 = new JPanel(new BorderLayout());
private JPanel p6 = new JPanel(new GridLayout(2,2));
private JPanel p7 = new JPanel(new GridLayout(2,1));
private JPanel p8 = new JPanel(new BorderLayout());
private JComboBox timeBox = new JComboBox(TimeZone.getAvailableIDs());//对所有支持时区进行迭代,获取所有的id;
private JTextField jtfYear = new JTextField(5);// jtfYeaar年份显示输入框
private JTextField jtfMonth = new JTextField(2);// jtfMouth月份显示输入框
private JTextField timeField=new JTextField();
private JTextField h1=new JTextField(5);
private JTextField m1=new JTextField(5);
private static JTextArea jta = new JTextArea(10,5);
private JScrollPane jsp = new JScrollPane(jta);
private JTextArea jta1 = new JTextArea(5,4);
private JScrollPane jsp1 = new JScrollPane(jta1);
private JLabel l = new JLabel("你可以向年份输入框中输入年份,提高查询效率");
private JLabel lt = new JLabel();
private JLabel ld = new JLabel();
private JLabel ts=new JLabel("请在右边下拉菜单选择你要选择的城市");
private JLabel clock= new JLabel("闹钟");
private JLabel notice= new JLabel("备忘录");
private JLabel hour = new JLabel("小时");
private JLabel minute= new JLabel("分钟");
private JLabel lu = new JLabel("农历和节气");
private JLabel null1=new JLabel();
private int lastTime;
private String localTime = null;
private String s = null;
private SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
public h_main1() {
super("My Calender");// 框架命名
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 窗口关闭函数
this.getContentPane().setLayout(new BorderLayout(5, 5));
jta.setLineWrap(true);// 长度大于分配长度时候则换行
table.setGridColor(Color.GRAY);// 星期之间的网格线是灰色的
table.setColumnSelectionAllowed(true);// 将table中的列设置为可选择的
table.setSelectionBackground(Color.GRAY);// 当选定某一天时背景颜色为黑色
table.setSelectionForeground(Color.GREEN);
table.setBackground(new Color(184,207, 229));// 日期显示表格为浅蓝色
table.setFont(new Font("黑体", Font.BOLD, 24));// 日期数字字体格式
table.setRowHeight(30);// 表格的高度
table.addMouseListener(this); // 鼠标监听器
jtfYear.addActionListener(this);// 可输入年份的文本框
// 为各个按钮添加监听函数
bLastYear.addActionListener(this);
bNextYear.addActionListener(this);
bLastMonth.addActionListener(this);
bNextMonth.addActionListener(this);
bAddClock.addActionListener(this);
timeBox.addItemListener(new TimeSelectedChangedListener());
// 将按钮添加到Jpane上
p1.add(bLastYear);
p1.add(jtfYear);// 年份输入文本框
p1.add(bNextYear);
p1.add(bLastMonth);
p1.add(jtfMonth);
p1.add(bNextMonth);
p2.add(clock);
p2.add(bAddClock);
p2.add(hour);
p2.add(h1);
p2.add(minute);
p2.add(m1);
p3.add(jsp, BorderLayout.SOUTH);
p3.add(lu,BorderLayout.CENTER);
p3.add(ld, BorderLayout.NORTH);
p4.add(l);
p4.add(lt);
p5.add(p4, BorderLayout.SOUTH);
p5.add(sp, BorderLayout.CENTER);
p5.add(p1, BorderLayout.NORTH);
p6.add(ts);
p6.add(timeBox);
p6.add(null1);
p6.add(timeField);
p7.add(notice);
p7.add(jsp1);
p8.add(p2,BorderLayout.CENTER);
p8.add(p7,BorderLayout.SOUTH);
this.getContentPane().add(p3, BorderLayout.EAST);
this.getContentPane().add(p5, BorderLayout.CENTER);
this.getContentPane().add(p6,BorderLayout.SOUTH);
this.getContentPane().add(p8,BorderLayout.WEST);
String[] strDate = DateFormat.getDateInstance().format(new Date())
.split("-");// 获取日期
cld.set(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1]) - 1,0);
showCalendar(Integer.parseInt(strDate[0]),
Integer.parseInt(strDate[1]), cld);
jtfMonth.setEditable(false);// 设置月份文本框为不可编辑
jtfYear.setText(strDate[0]);
jtfMonth.setText(strDate[1]);
this.showTextArea(strDate[2]);
ld.setFont(new Font("新宋体", Font.BOLD, 24));
new Timer(lt).start();
new TimeThread().start();
this.setBounds(200, 200, 700, 350);
this.setResizable(false);
this.setVisible(true);
}
public void showCalendar(int localYear, int localMonth, Calendar cld)
{
int Days = getDaysOfMonth(localYear, localMonth) + cld.get(Calendar.DAY_OF_WEEK) -2;
Object [] ai = new Object[7];
lastTime = 0;
for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i <= Days; i++)
{
ai[i%7] = String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2));
if (i%7 == 6)
{
dtm.addRow(ai);
ai = new Object[7];
lastTime++;
}
}
dtm.addRow(ai);
}
public int getDaysOfMonth(int Year, int Month) {
if(Month==1||Month==3||Month==5||Month==7||Month==8||Month==10||Month==12)
{
return 31;
}
if(Month==4||Month==6||Month==9||Month==11)
{
return 30;
}
if(Year%4==0&&Year%100!=0||Year%400==0)//闰年
{
return 29;
}
else {
return 28;
}
}
public void actionPerformed(ActionEvent e)
{
if(e.getSource() == jtfYear || e.getSource() == bLastYear || e.getSource() == bNextYear ||
e.getSource() == bLastMonth || e.getSource() == bNextMonth||e.getSource()==bAddClock)
{
int m, y;
try//控制输入的年份正确,异常控制
{
if (jtfYear.getText().length() != 4)
{
throw new NumberFormatException();
}
y = Integer.parseInt(jtfYear.getText());
m = Integer.parseInt(jtfMonth.getText());
}
catch (NumberFormatException ex)
{
JOptionPane.showMessageDialog(this, "请输入4位0-9的数字!", "年份有误", JOptionPane.ERROR_MESSAGE);
return;
}
ld.setText("没有选择日期");
for (int i = 0; i < lastTime+1; i++){ dtm.removeRow(0);}
if(e.getSource() == bLastYear){ jtfYear.setText(String.valueOf(--y)); }
if(e.getSource() == bNextYear){jtfYear.setText(String.valueOf(++y)); }
if(e.getSource() == bLastMonth)
{
if(m == 1)
{
jtfYear.setText(String.valueOf(--y));
m = 12;
jtfMonth.setText(String.valueOf(m));
}
else
{
jtfMonth.setText(String.valueOf(--m));
}
}
if(e.getSource() == bNextMonth)
{
if(m == 12)
{
jtfYear.setText(String.valueOf(++y));
m = 1;
jtfMonth.setText(String.valueOf(m));
}
else
{
jtfMonth.setText(String.valueOf(++m));
}
}
cld.set(y, m-1, 0);
showCalendar(y, m, cld);
}
if(e.getSource()==bAddClock){
try{
Clock clock=new Clock();
clock.start();
if(Integer.parseInt(h1.getText())<0||Integer.parseInt(h1.getText())>23||
Integer.parseInt(m1.getText())<0||Integer.parseInt(m1.getText())>59)
{
throw(new Exception());
}
}
catch(Exception ex){
JOptionPane.showMessageDialog(this, "时数应该为0——23,分钟数应该为0——59", "时间有误", JOptionPane.ERROR_MESSAGE);
}
}
}
public void mouseClicked(MouseEvent e)
{
jta.setText(null);
int r = table.getSelectedRow();
int c = table.getSelectedColumn();
if (table.getValueAt(r,c) == null)
{
ld.setText("没有选择日期");
}
else
{
this.showTextArea(table.getValueAt(r,c));
}
}
private void showTextArea(Object selected)
{ //在这里将公历化为农历
ld.setText(jtfYear.getText()+"年"+jtfMonth.getText()+"月"+selected+"日");
}
public static void main(String[] args)
{
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
new h_main1();
jta.setText(today());
}
private void updateTimeText(String timeZoneId) {
if(timeZoneId != null){
TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);
dateFormat.setTimeZone(timeZone);
Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(timeZone);
timeField.setText(dateFormat.format(calendar.getTime()));
}else{
timeField.setText(null);
}
}
private class TimeSelectedChangedListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange()==ItemEvent.SELECTED) {
if (e.getItem() instanceof String) {
s = e.getItem().toString();
}
}
}
}
private class TimeThread extends Thread{
public void run(){
while(true){
updateTimeText(s);
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
class Clock extends Thread //闹钟线程
{
public void run(){
while(true){
Calendar now=Calendar.getInstance();
int h=now.get(Calendar.HOUR_OF_DAY);//获取小时
int mi=now.get(Calendar.MINUTE);//获取分钟
int s=now.get(Calendar.SECOND);//获取秒钟
int ss=h*3600+mi*60+s;
if(ss>(Integer.parseInt(h1.getText())*3600+Integer.parseInt(m1.getText())*60+0)
&&ss<Integer.parseInt(h1.getText())*3600+(Integer.parseInt(m1.getText()+5)*60+0))
{
jta1.setText("闹钟启动");
}
else{
jta1.setText("没有正在提示的闹钟");
}
}
}
}
class Timer extends Thread //显示系统时间
{
private JLabel lt;
private SimpleDateFormat fy = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z");
private boolean b=true;
public Timer(JLabel lt)
{
this.lt=lt;
}
public void run()
{
while(true){
try{
lt.setText(fy.format(new Date()));
this.sleep(1000);
}
catch(InterruptedException ex)
{
ex.printStackTrace();
}
}
}
}
final private 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 };
final private static int[] year20 = new int[] { 1, 4, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
final private static int[] year19 = new int[] { 0, 3, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0 };
final private static int[] year2000 = new int[] { 0, 3, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1 };
public final static String[] nStr1 = new String[] { "", "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一",
"十二" };
private final static String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸" };
private final static String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥" };
private final static String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊", "猴", "鸡", "狗", "猪" };
private final static String[] solarTerm = new String[] { "小寒", "大寒", "立春", "雨水", "惊蛰", "春分", "清明", "谷雨", "立夏",
"小满", "芒种", "夏至", "小暑", "大暑", "立秋", "处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
private final static String[] sFtv = new String[] { "0101*元旦", "0214 情人节", "0308 妇女节", "0312 植树节", "0315 消费者权益日",
"0401 愚人节", "0501 劳动节", "0504 青年节", "0512 护士节", "0601 儿童节", "0701 建党节", "0801 建军节", "0808 父亲节",
"0909 毛泽东逝世纪念", "0910 教师节", "0928 孔子诞辰", "1001*国庆节", "1006 老人节", "1024 联合国日", "1112 孙中山诞辰", "1220 澳门回归",
"1225 圣诞节", "1226 毛泽东诞辰" };
private final static String[] lFtv = new String[] { "0101*农历春节", "0115 元宵节", "0505 端午节", "0707 七夕情人节", "0815 中秋节",
"0909 重阳节", "1208 腊八节", "1224 小年", "0100*除夕" };
/**
* 传回农历 y年的总天数
*
* @param y
* @return
*/
final private static int lYearDays(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年闰月的天数
*
* @param y
* @return
*/
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
*
* @param y
* @return
*/
final private static int leapMonth(int y) {
return (int) (lunarInfo[y - 1900] & 0xf);
}
/**
* 传回农历 y年m月的总天数
*
* @param y
* @param m
* @return
*/
final private static int monthDays(int y, int m) {
if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
return 29;
else
return 30;
}
/**
* 传回农历 y年的生肖
*
* @param y
* @return
*/
final public static String AnimalsYear(int y) {
return Animals[(y - 4) % 12];
}
/**
* 传入 月日的offset 传回干支,0=甲子
*
* @param num
* @return
*/
final private static String cyclicalm(int num) {
return (Gan[num % 10] + Zhi[num % 12]);
}
/**
* 传入 offset 传回干支, 0=甲子
*
* @param y
* @return
*/
final public static String cyclical(int y) {
int num = y - 1900 + 36;
return (cyclicalm(num));
}
/**
* 传出农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
*
* @param y
* @param m
* @return
*/
final private long[] Lunar(int y, int m) {
long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
Date baseDate = new GregorianCalendar(1900 + 1900, 1, 31).getTime();
Date objDate = new GregorianCalendar(y + 1900, m, 1).getTime();
long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;
if (y < 2000)
offset += year19[m - 1];
if (y > 2000)
offset += year20[m - 1];
if (y == 2000)
offset += year2000[m - 1];
nongDate[5] = offset + 40;
nongDate[4] = 14;
for (i = 1900; i < 20## && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0) {
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); // 闰哪个月
nongDate[6] = 0;
for (i = 1; i < 13 && offset > 0; i++) {
// 闰月
if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {
--i;
nongDate[6] = 1;
temp = leapDays((int) nongDate[0]);
} else {
temp = monthDays((int) nongDate[0], i);
}
// 解除闰月
if (nongDate[6] == 1 && i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 && i == leap + 1) {
if (nongDate[6] == 1) {
nongDate[6] = 0;
} else {
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0) {
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
/**
* 传出y年m月d日对应的农历.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6
*
* @param y
* @param m
* @param d
* @return
*/
final public static long[] calElement(int y, int m, int d) {
long[] nongDate = new long[7];
int i = 0, temp = 0, leap = 0;
Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime();
Date objDate = new GregorianCalendar(y, m - 1, d).getTime();
long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;
nongDate[5] = offset + 40;
nongDate[4] = 14;
for (i = 1900; i < 20## && offset > 0; i++) {
temp = lYearDays(i);
offset -= temp;
nongDate[4] += 12;
}
if (offset < 0) {
offset += temp;
i--;
nongDate[4] -= 12;
}
nongDate[0] = i;
nongDate[3] = i - 1864;
leap = leapMonth(i); // 闰哪个月
nongDate[6] = 0;
for (i = 1; i < 13 && offset > 0; i++) {
// 闰月
if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {
--i;
nongDate[6] = 1;
temp = leapDays((int) nongDate[0]);
} else {
temp = monthDays((int) nongDate[0], i);
}
// 解除闰月
if (nongDate[6] == 1 && i == (leap + 1))
nongDate[6] = 0;
offset -= temp;
if (nongDate[6] == 0)
nongDate[4]++;
}
if (offset == 0 && leap > 0 && i == leap + 1) {
if (nongDate[6] == 1) {
nongDate[6] = 0;
} else {
nongDate[6] = 1;
--i;
--nongDate[4];
}
}
if (offset < 0) {
offset += temp;
--i;
--nongDate[4];
}
nongDate[1] = i;
nongDate[2] = offset + 1;
return nongDate;
}
public final static String getChinaDate(int day) {
String a = "";
if (day == 10)
return "初十";
if (day == 20)
return "二十";
if (day == 30)
return "三十";
int two = (int) ((day) / 10);
if (two == 0)
a = "初";
if (two == 1)
a = "十";
if (two == 2)
a = "廿";
if (two == 3)
a = "三";
int one = (int) (day % 10);
switch (one) {
case 1:
a += "一";
break;
case 2:
a += "二";
break;
case 3:
a += "三";
break;
case 4:
a += "四";
break;
case 5:
a += "五";
break;
case 6:
a += "六";
break;
case 7:
a += "七";
break;
case 8:
a += "八";
break;
case 9:
a += "九";
break;
}
return a;
}
public static String today() {
Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
int year = today.get(Calendar.YEAR);
int month = today.get(Calendar.MONTH) + 1;
int date = today.get(Calendar.DATE);
long[] l = calElement(year, month, date);
StringBuffer sToday = new StringBuffer();
try {
sToday.append(sdf.format(today.getTime()));
sToday.append(" 农历");
sToday.append(cyclical(year));
sToday.append('(');
sToday.append(AnimalsYear(year));
sToday.append(")年");
sToday.append(nStr1[(int) l[1]]);
sToday.append("月");
sToday.append(getChinaDate((int) (l[2])));
return sToday.toString();
} finally {
sToday = null;
}
}
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 EEEEE");
/**
* 农历日历工具使用演示
*
* @param args
*/
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}