📄 calendarframe.java
字号:
}
thisYear--;
// 试探修改后的日期是否为合法日期,如不合法则往前递推
String str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString() + "-"
+ new Integer(thisDay).toString();
if (!(isDate(str, "yyyy.MM.dd") | isDate(str, "yyyy-MM-dd"))) {
thisDay--;
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
} else {
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
}
}
else if (isChecked.equals("MM"))// 月被选中
{
if(thisMonth==1&&thisYear==1)
{
JOptionPane.showMessageDialog(null, "你莫非对公元前的事感兴趣?那翻别的日历吧");
dispose();
}
if (thisMonth == 1) {
thisMonth = 12;
thisYear--;
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
} else {
thisMonth--;
// 试探修改后的日期是否为合法日期,如不合法则往前递推,直到遇到合法日期
String str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString() + "-"
+ new Integer(thisDay).toString();
while (!(isDate(str, "yyyy.MM.dd") | isDate(str,
"yyyy-MM-dd"))) {
thisDay--;
str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString() + "-"
+ new Integer(thisDay).toString();
}
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
}
}
else if (isChecked.equals("DD"))// 天被选中
{
if(thisMonth==1&&thisYear==1&&thisDay==1)
{
JOptionPane.showMessageDialog(null, "你莫非对公元前的事感兴趣?那翻别的日历吧");
dispose();
}
if (thisDay == 1) {
if (thisMonth == 1)// 某年的1月1号被选中
{
thisDay = 31;
thisMonth = 12;
thisYear--;
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
} else {
thisMonth--;// 某年的非1月的1号被选中
thisDay = 31;
// 从31号开始,试探修改后的日期是否为合法日期,如不合法则往前递推,直到遇到合法日期
String str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString() + "-"
+ new Integer(thisDay).toString();
while (!(isDate(str, "yyyy.MM.dd") | isDate(str,
"yyyy-MM-dd"))) {
thisDay--;
// thisMonth++;
str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString()
+ "-" + new Integer(thisDay).toString();
}
clearAll(thisYear, thisMonth, thisDay);// 刷新日期
}
}
else// 非1号,更改标题栏显示,不刷新
{
thisDay--;
YYYY.setText(new Integer(thisYear).toString());
MM.setText(new Integer(thisMonth).toString());
DD.setText(new Integer(thisDay).toString());
}
}
}
});
// 设置显示日期的控件的位置及初始值
for (int i = 0; i < 42; i++) {
dayLabel[i] = new JTextField();
dayLabel[i].setBackground(SystemColor.control);
// dayLabel[i].setBackground(SystemColor.control);
dayLabel[i].setForeground(Color.black);
dayLabel[i].setFont(new java.awt.Font("宋体", Font.PLAIN, 16));
dayLabel[i].setBorder(null);
dayLabel[i].setEditable(false);
dayLabel[i].setText("");
dayLabel[i].setBounds(new Rectangle(115 + 42 * (i % 7),
150 + 20 * (i / 7), 20, 15));
}
// 给这些显示日期的控件注册鼠标单击及双击事件
for (int i = 0; i < 42; i++) {
dayLabel[i].addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
int index = 66;
for (int i = 0; i < 42; i++) {
if (e.getSource().equals(dayLabel[i]))// 某个日期被选中
{
index = i;
break;
}
}
// 改变其它控件及被选中控件的背景色
for (int j = 0; j < 42; j++) {
if (j != index) {
dayLabel[j].setBackground(SystemColor.control);
} else
continue;
}
if (!dayLabel[index].getText().equals("")) {
dayLabel[index].setBackground(Color.PINK);
DD.setText(dayLabel[index].getText());
}
// 注册双击事件
if (e.getClickCount() == 2) {
JOptionPane
.showMessageDialog(null, YYYY.getText() + "年"
+ MM.getText() + "月" + DD.getText()
+ "日");
dispose();
}
}
});
}
contentPane.add(jButton1);
contentPane.add(jButton2);
contentPane.add(jLabel1);
contentPane.add(DD);
contentPane.add(jLabel2);
contentPane.add(MM);
contentPane.add(YYYY);
contentPane.add(jLabel3);
contentPane.add(jLabel4);
contentPane.add(jLabel5);
contentPane.add(jLabel6);
for (int i = 0; i < 42; i++) {
contentPane.add(dayLabel[i]);
}
contentPane.setVisible(true);
setResizable(false);
setVisible(true);
month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份
year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份
System.out.println("Right now the year is :" + year + " month is "
+ month_num);
String toYYYY = new Integer(year).toString();
String toMM = new Integer(month_num + 1).toString();// 计算机中的月份为0-11,所以实际显示时应加1
YYYY.setText(toYYYY);
MM.setText(toMM);
DD.setText(new Integer(now.get(Calendar.DAY_OF_MONTH)).toString());
first_day_num = use(year, month_num, 1);// 获取当月的第一天日期
Resetday(first_day_num, year, month_num);// 初始化日期
}
/**
* This function is used for Painting.
* Component initialization.
* @param Graphics g
* @return 空
* @throws java.lang.Exception
*/
public void paint(Graphics g) {
super.paint(g);
g.drawRect(50, 60, 400, 50);
g.drawRect(50, 130, 400, 220);
g.setColor(Color.blue);
g.fillRect(90, 140, 320, 30);
g.setFont(new Font("Helvetica", Font.BOLD, 14));
g.setColor(Color.black);
String weekName[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
for (int i = 0; i <= 6; i++) {
g.drawString(weekName[i], 115 + i * 42, 160);
}
}
/**
* This function is used to get the week number of the first day in the month.
* Component initialization.
* @param 年,月,日
* @return 整型,某年月第一天的星期
*
*/
public int use(int reyear, int remonth, int day) {
int week_num;
now.set(reyear, remonth, day); // 设置时间为所要查询的年月的第一天
week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期
// System.out.println("in use:week_num is "+week_num);
return week_num;
}
/**
* This function is used to reset the day.
* Component initialization.
* @param 年,月,日
* @return 空
*
*/
public void Resetday(int week_log, int year_log, int month_log) {
int month_day_score; // 存储月份的天数
int count;
month_day_score = 0;
count = 1;
Date date = new Date(year_log, month_log + 1, 1); // now
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, -1); // 前个月
month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
for (int i = 0; i < 42; i++) { // 初始化标签
dayLabel[i].setText("");
}
week_log = week_log + 6; // 将星期数加6,使显示正确
month_day_score = month_day_score + week_log;
for (int i = week_log - 7; i < month_day_score - 7; i++, count++) {
dayLabel[i].setText(count + "");
}
}
/**
* This function is used to reset the day and reset the display title.
* Component initialization.
* @param 年,月,日
* @return 空
*
*/
public void clearAll(int thisYear, int thisMonth, int thisDay)// 刷新日期
{
int dayNum;
String str = new Integer(thisYear).toString() + "-"
+ new Integer(thisMonth).toString() + "-"
+ new Integer(thisDay).toString();
// System.out.println(str);
if (isDate(str, "yyyy.MM.dd") | isDate(str, "yyyy-MM-dd"))// 合法日期
{
System.out.println("isdate!");
String toYYYY = new Integer(thisYear).toString();
String toMM = new Integer(thisMonth).toString();
YYYY.setText(toYYYY);
MM.setText(toMM);
DD.setText(new Integer(thisDay).toString());
dayNum = use(thisYear, thisMonth - 1, 1);
Resetday(dayNum, thisYear, thisMonth - 1);
for (int i = 0; i < 42; i++) {
dayLabel[i].setBackground(SystemColor.control);
}
// isChecked = null;
} else// 非法日期
{
System.out.println("notdate!");
}
}
/**
* This function is used to judge if the date is validate.
* Component initialization.
* @param datefomat"YYYY-MM-DD" ,"YYYY.MM.DD"
* @return 合法返回true,非法返回false
*
*/
//判断日期是否合法,合法返回true,否则返回false
public static boolean isDate(String str_input, String rDateFormat) {
if (!isNull(str_input)) {
SimpleDateFormat formatter = new SimpleDateFormat(rDateFormat);
formatter.setLenient(false);
try {
formatter.format(formatter.parse(str_input));
} catch (Exception e) {
return false;
}
return true;
}
return false;
}
/**
* This function is used to judge if the string is null.
* Component initialization.
* @param string str
* @return 空返回true,非空返回false
*
*/
//判断字符是否空
public static boolean isNull(String str) {
if (str == null)
return true;
else
return false;
}
//main函数
public static void main(String[] args) {
new CalendarFrame();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -