Java打印月历GUI

17 篇文章 0 订阅

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;
 }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值