java 万年历 程序

【实验要求】编写一个程序,有一个窗口,该窗口为BorderLayout布局。窗口的中心添加一个Panel容器:pCenter,pCenter的布局是7行7列的GridLayout布局,pCenter的中放置49个标签,用来显示日历。窗口北面添加一个Panel容器pNorth,其布局是FlowLayout布局,pNorth放置两个按钮:nextMonth和previousMonth按钮,单击nextMonth,可以显示当前月的下一个月的日历;单击previousMonth按钮,可以显示当前月的上一个月的日历。窗口的南面添加一个Panel容器pSouth,其布局是FlowLayout布局,pSouth中放置一个标签用来显示一些信息。运行结果如图所示。

【实验代码】package Calendar;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;

public class Calendarshowing {
 static Calendar  c   =  Calendar.getInstance();
 static int year = c.get(Calendar.YEAR), month = c.get(Calendar.MONTH)+1,monthday = 0;
 static String[] weekdaystr = { "日", "一", "二", "三", "四", "五", "六" };
 JFrame frame = new JFrame("日历表");
// JPanel panel = new JPanel();
 static JLabel[]dayLabel = new JLabel[49];
 static JPanel showPanel;
 JButton Prebutton = new JButton("上一月");
 JButton Nextbutton = new JButton("下一月");
 JLabel showLabel =  new JLabel();
 static Border Border01 = BorderFactory.createLineBorder(Color.BLUE, 1);
 public Calendarshowing() {
  //frame.setResizable(false);
  showPanel = new JPanel();
  frame.setBounds(450, 200, 500, 400);
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  Container content = frame.getContentPane();
  final JPanel buttonPanel = new JPanel();
  buttonPanel.setLayout(new FlowLayout());
  
  Prebutton.addActionListener(new PressButton());
  
  Nextbutton.addActionListener(new PressButton());
  buttonPanel.add(Prebutton);
  buttonPanel.add(Nextbutton);
  content.add(buttonPanel, BorderLayout.NORTH);
  
  final GridLayout gridLayout = new GridLayout(0, 7);
  gridLayout.setHgap(10);
  gridLayout.setVgap(10);
  showPanel.setLayout(gridLayout);
  showLabel.setHorizontalAlignment(JLabel.CENTER);
  showLabel.setText("<html><Font size = '6',color = 'RED'>"+"日历: "+"<html><Font size='4',color='Green'>"+year+"年"+month+"月"+"</Font></html>");
  showLabel.setToolTipText("今天是公元"+c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DATE)+"日");
  content.add(showLabel,BorderLayout.SOUTH);
  content.add(showPanel, BorderLayout.CENTER);
  frame.setVisible(true);
 }

 public class PressButton implements ActionListener {

  @Override
  public void actionPerformed(ActionEvent e) {
   // TODO Auto-generated method stub
   JButton button = (JButton)e.getSource();
   if (button == Prebutton)
   {
    month--;
    if (month <= 0){
     year--;
     month+=12;
    }
   }
   else{
    month++;
    if (month > 12){
     year++;
     month-=12;
    }
   }
   showPanel.removeAll();
   showPanel.updateUI();
   new showing();
   showLabel.setHorizontalAlignment(JLabel.CENTER);
   showLabel.setText("<html><Font size = '6',color = 'RED'>"+"日历: "+"<html><Font size='4',color='Green'>"+year+"年"+month+"月"+"</Font></html>");
   showLabel.setToolTipText("今天是公元"+c.get(Calendar.YEAR)+"年"+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DATE)+"日");
  }
 }
 
 static class showing{
  
  public boolean isLeapYear(int year1) // 判断是否是闰年
  {
   return ((year1 % 4 == 0 && year1 % 100 != 0) || (year1 % 400 == 0));
  }

  public  int firstDay() // 计算该年第一天是星期几
  {
   long n = year * 365;
   for (int i = 1; i < year; i++){
    if (isLeapYear(i)){
     n++;
    }
   }
   return (int)n%7;
  }

  public void printWeek() // 设置表头
  {
   for (int i = 0; i < 7; i++) {
    dayLabel[i] = new JLabel(weekdaystr[i],JLabel.CENTER);
    dayLabel[i].setBackground(Color.BLACK);
    dayLabel[i].setForeground(Color.RED);
    showPanel.add(dayLabel[i]);
   }
  }

  public int getMonthDay(int m) // 获取每个月的天数
  {
   switch (m) {
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12:
    return 31;
   case 4:
   case 6:
   case 9:
   case 11:
    return 30;
   case 2:
    if (isLeapYear(year))
     return 29;
    else
     return 28;
   default:
    return 0;
   }
  }
  
  public  int getDays(){
   monthday = 0;
   for (int i = 1;i<month;i++)
    monthday+=getMonthDay(i);
   return (firstDay()+(monthday%7))%7;
  }
  
  public showing(){
   int n =1 ;
   printWeek();
   int k = getDays();
   int   Year   =   c.get(Calendar.YEAR); 
   int   Month   =   c.get(Calendar.MONTH);
   Month += 1;
   int   Date   =   c.get(Calendar.DATE);
   for (int j = 7;n<=getMonthDay(month);j++){
    if (j < k+7){
    dayLabel[j] = new JLabel();
    showPanel.add(dayLabel[j]);
    }
    else{
    dayLabel[j] = new JLabel(""+n,JLabel.CENTER);
    dayLabel[j].setToolTipText("星期"+weekdaystr[(j)%7]);
    if (Year == year&&Month==month&&Date == n){
     dayLabel[j].setText("<html><Font size = '6',color = 'BLUE'>"+n+"</Font></html>");
     dayLabel[(Date-1)%7].setForeground(Color.BLUE);
    }
    showPanel.add(dayLabel[j]);
    n++;
    }
   }
   showPanel.setBorder(Border01);
  }
 }
 
 public static void main(String[] args) {
  Calendarshowing c = new Calendarshowing();
  showing s = new Calendarshowing.showing();
 }
}

【实验效果】

java <wbr>万年历 <wbr>程序

图3.显示当前月份的日历和当前日期

java <wbr>万年历 <wbr>程序

图4.显示每个日期的星期数

你可能感兴趣的:(java 万年历 程序)