package wannianli;

import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class WanNianLi extends JFrame implements ActionListener {
	private Calendar cal= Calendar.getInstance();
	private String [] str = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
	private DefaultTableModel dtm = new DefaultTableModel(null,str);
	private JTable table = new JTable(dtm); 
	private JScrollPane sp = new JScrollPane(table);
	private JButton bLastMonth = new JButton("上月");
	private JButton bNextMonth = new JButton("下月");
	private JTextField Year = new JTextField(4);
	private JLabel jla=new JLabel("年");
		
	private JTextField jtfMonth = new JTextField(2);
	private JPanel p1 = new JPanel(); 
	private JPanel p2 = new JPanel();
	private JPanel p3 = new JPanel(new BorderLayout());
	private JPanel p4 = new JPanel(new GridLayout(2,1));
	private JPanel p5 = new JPanel(new BorderLayout());
	private JLabel lt = new JLabel();
	private int lastTime;

	public WanNianLi(){
		super("万年历"); 
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.getContentPane().setLayout(new BorderLayout(10, 0));

		table.setGridColor(Color.black); 
		table.setColumnSelectionAllowed(true);
		table.setSelectionBackground(Color.BLACK);
		table.setSelectionForeground(Color.green);
		table.setBackground(new Color(184,207,229));
		table.setFont(new Font("黑体",Font.BOLD,30));
		table.setRowHeight(30);
	
		Year.addActionListener(this);
		bLastMonth.addActionListener(this);
		bNextMonth.addActionListener(this);

		p1.add(Year);
		p1.add(jla);
		p1.add(bLastMonth);
		p1.add(jtfMonth);	
		p1.add(bNextMonth);	
		p3.add(p2, BorderLayout.SOUTH);	
		p4.add(lt);	
		p5.add(p4, BorderLayout.SOUTH);	
		p5.add(sp, BorderLayout.CENTER);	
		p5.add(p1, BorderLayout.NORTH);

		this.getContentPane().add(p5, BorderLayout.CENTER);
		this.getContentPane().add(p3, BorderLayout.EAST);

		String [] strDate = DateFormat.getDateInstance().format(new Date()).split("-");
		cal.set(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1])-1,0);
		showCalendar(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1]), cal);
		jtfMonth.setEditable(false);
		Year.setText(strDate[0]);
		jtfMonth.setText(strDate[1]);
	
		this.setBounds(200,200,600,320);
		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){
		int m, y;
		try{
			if (Year.getText().length() != 4){
				throw new NumberFormatException();
			}
			y = Integer.parseInt(Year.getText());
			m = Integer.parseInt(jtfMonth.getText());
		}
		catch (NumberFormatException ex){
			JOptionPane.showMessageDialog(this, "请输入4位0-9的数字～", "年份有误", JOptionPane.ERROR_MESSAGE);
			return;
		}
		for (int i = 0; i < lastTime+1; i++){
			dtm.removeRow(0);
		}
		
		if(e.getSource() == bLastMonth){
			if(m == 1){
				Year.setText(String.valueOf(--y));
				m = 12;
				jtfMonth.setText(String.valueOf(m));
			}
			else{
				jtfMonth.setText(String.valueOf(--m));
			}
		}
		if(e.getSource() == bNextMonth){
			if(m == 12){
				Year.setText(String.valueOf(++y));
				m = 1;
				jtfMonth.setText(String.valueOf(m));
			}
			else{
				jtfMonth.setText(String.valueOf(++m));
			}
		}
		
		cal.set(y, m-1, 0);
		showCalendar(y, m, cal);	
	}

	public static void main(String[] args){
		JFrame.setDefaultLookAndFeelDecorated(true);
		JDialog.setDefaultLookAndFeelDecorated(true);
		new WanNianLi();
	}
}
	