import javax.swing.JOptionPane;
public class PrintCalendarGUI {
public static void main(String[] args) {
//得用户的输入年数和月份数
int year; //年
int month; //月
do{
year = getYear();
}while(year==0);
do{
month = getMonth();
}while(month==0);
//定义一个String类型来保存月历的主体部分
String bodyStr = "";
bodyStr = getMonthTitle(year,month)+getMonthBody(year,month);
//输出显示
JOptionPane.showMessageDialog(null, bodyStr,getMonthName(month)+"月历",-1);
}
private static String getMonthBody(int year, int month) {
StringBuilder sb = new StringBuilder();
//得到要打印的这个月份的第一天是星期几
int startDay = getStartDay(year,month);
//得到这个月共有多少天
int monthOfDays = getNumberOfDaysInMonth(year,month);
//是星期几则要把前几个空开
for(int i=1;i<startDay;i++)
sb.append(" ");
for(int i = 1;i<=monthOfDays;i++){
sb.append((i>=10)?(" "+i):(" "+i));
if((i+startDay-1)%7==0)
sb.append("\n");
}
return sb.toString();
}
private static int getStartDay(int year, int month) {
final int START_DAY_FOR_JAN_1_1800 = 3;
int totalNumberOfDays = getTotalNumberOfDays(year, month);
return (totalNumberOfDays + START_DAY_FOR_JAN_1_1800) % 7;
}
private static int getTotalNumberOfDays(int year, int month) {
int total = 0;
for (int i = 1800; i < year; i++)
if (isLeapYear(i))
total = total + 366;
else
total = total + 365;
for (int i = 1; i < month; i++)
total = total + getNumberOfDaysInMonth(year, i);
return total;
}
private static int getNumberOfDaysInMonth(int year, int i) {
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10
|| i == 12)
return 31;
if (i == 4 || i == 6 || i == 9 || i == 11)
return 30;
if (i == 2)
return isLeapYear(year) ? 29 : 28;
return 0;
}
private static boolean isLeapYear(int i) {
return i % 400 == 0 || (i % 4 == 0 && i % 100 != 0);
}
private static String getMonthTitle(int year, int month) {
StringBuilder sb = new StringBuilder();
sb.append(" " + year + "年 ");
sb.append(getMonthName(month)+"\n");
sb.append("---------------------------------------------------------------------------\n");
sb.append(" 一 二 三 四 五 六 日 \n");
return sb.toString();
}
private static String getMonthName(int month) {
String monthName = "";
switch (month) {
case 1:
monthName = "一月";
break;
case 2:
monthName = "二月";
break;
case 3:
monthName = "三月";
break;
case 4:
monthName = "四月";
break;
case 5:
monthName = "五月";
break;
case 6:
monthName = "六月";
break;
case 7:
monthName = "七月";
break;
case 8:
monthName = "八月";
break;
case 9:
monthName = "九月";
break;
case 10:
monthName = "十月";
break;
case 11:
monthName = "十一月";
break;
case 12:
monthName = "十二月";
break;
}
return monthName;
}
private static int getMonth() {
String monthStr = JOptionPane.showInputDialog(null, "请输入月份(1~12)");
if(monthStr == null)
System.exit(0); //输入取消则退出
int month;
try {
month = Integer.parseInt(monthStr);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "你输入的月份有误,请重新输入!", "提 示",
JOptionPane.WARNING_MESSAGE);
return 0;
}
if(month<1 || month>12){
JOptionPane.showMessageDialog(null, "你输入的月份有误,请重新输入!", "提 示",
JOptionPane.WARNING_MESSAGE);
return 0;
}else
return month;
}
private static int getYear() {
String yearStr = JOptionPane.showInputDialog(null, "请输入年份(如:2013)");
if(yearStr == null)
System.exit(0); //输入取消则退出
int year;
try {
year = Integer.parseInt(yearStr);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "你输入的年份有误,请重新输入!", "提 示",
JOptionPane.WARNING_MESSAGE);
return 0;
}
if(year<1800 || year>9999){
JOptionPane.showMessageDialog(null, "你输入的年份有误,请重新输入!", "提 示",
JOptionPane.WARNING_MESSAGE);
return 0;
}else
return year;
}
}