java實現的萬年曆(算法自己寫的能不能優化)

package 萬年曆;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
/**
 * 
 * @author xz
 *
 */
public class MainFrame extends JFrame {
	private static final long serialVersionUID = 1L;

	public MainFrame() {
		super("萬年曆");
		super.setDefaultCloseOperation(EXIT_ON_CLOSE);
		super.getContentPane().add(new MianPanel());
		super.pack();
	}

	public static void main(String[] args) {
		new MainFrame().setVisible(true);
	}

	class MianPanel extends JPanel {
		private static final long serialVersionUID = 1L;
		private JLabel[] jl = null;
		private Button b1 = null;
		private Button b2 = null;
		private Button b3 = null;
		private Button b4 = null;
		private JLabel j1 = null;
		private JLabel j2 = null;
		private String[] str = new String[] { "星期日", "星期一", "星期二", "星期三",
				"星期四", "星期五", "星期六" };
		private JPanel jp1 = null;
		private JPanel jp2 = null;
		private Font font = null;

		public MianPanel() {
			super.setPreferredSize(new Dimension(320, 200));
			jp1 = new JPanel();
			jp2 = new JPanel();
			jl = new JLabel[49];
			font = new Font("楷體", Font.BOLD, 12);
			jp1.setLayout(new GridLayout(1, 6, 10, 0));
			jp2.setLayout(new GridLayout(7, 7));
			b1 = new Button("上年");
			b1.addActionListener(al);
			b2 = new Button("下年");
			b2.addActionListener(al);
			b3 = new Button("上月");
			b3.addActionListener(al);
			b4 = new Button("下月");
			b4.addActionListener(al);
			j1 = new JLabel("2014");
			j1.setBackground(Color.WHITE);
			j1.setOpaque(true);
			j2 = new JLabel(String.format("%02d", 7));
			jp1.add(b1);
			jp1.add(j1);
			jp1.add(b2);
			jp1.add(b3);
			jp1.add(j2);
			jp1.add(b4);
			for (int i = 0; i < jl.length; i++) {
				if (i < str.length) {
					Border b = BorderFactory.createBevelBorder(
							BevelBorder.RAISED, Color.GRAY, Color.BLACK);

					jl[i] = new JLabel(str[i], SwingConstants.CENTER);
					jl[i].setBorder(b);
					jp2.add(jl[i]);

				} else {

					Border b = BorderFactory.createLineBorder(Color.BLACK);
					jl[i] = new JLabel("", SwingConstants.CENTER);
					jl[i].setBorder(b);

					jp2.add(jl[i]);
				}
				jl[i].setFont(font);

			}
			resetForeground();
			resetText();
			showText(2014, 7);
			this.add(jp1, BorderLayout.NORTH);
			this.add(jp2);
		}

		private int year = 0;
		private int month = 0;
		ActionListener al = new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				year = Integer.parseInt(j1.getText());
				month = Integer.parseInt(j2.getText());
				if (e.getSource() == b1) {
					if (year > 1970) {
						j1.setText(String.format("%4d", --year));
						resetText();
						resetForeground();
						resetText();
						showText(year, month);
					}

				}
				if (e.getSource() == b2) {
					if (year < 2090) {
						j1.setText(String.format("%4d", ++year));
					}
					resetText();
					resetForeground();
					resetText();
					showText(year, month);
				}
				if (e.getSource() == b3) {
					if (month == 1) {
						month = 13;
						j1.setText(String.format("%4d", --year));
					}
					if (month > 1) {
						j2.setText(String.format("%02d", --month));
					}
					resetText();
					resetForeground();
					resetText();
					showText(year, month);
				}
				if (e.getSource() == b4) {
					if (month == 12) {
						month = 0;
						j1.setText(String.format("%4d", ++year));
					}
					if (month < 12) {
						j2.setText(String.format("%02d", ++month));
					}
					resetText();
					resetForeground();
					resetText();
					showText(year, month);
				}
			}
		};

		// 重置前景色
		private void resetForeground() {
			for (int i = 0; i < jl.length; i++) {
				if (i % 7 == 0)
					jl[i].setForeground(Color.RED);
				else if (i % 7 == 6)
					jl[i].setForeground(Color.BLUE);
				else
					jl[i].setForeground(Color.BLACK);
			}
		}

		// 清除文本並設置前面的文本變顏色
		private void resetText() {

			month = Integer.parseInt(j2.getText());
			year = Integer.parseInt(j1.getText());
			int t = MonthOfFistDayOnWeek(year, month);
			int counts = MonthDay(month - 1);
			for (int i = t; i >= 0; i--) {
				jl[7 + i].setText(" " + counts--);
				jl[7 + i].setForeground(Color.lightGray);
			}
			int count = 0;
			for (int k = MonthDay(month) + t + 1 + 7; k < jl.length; k++) {
				jl[k].setText("" + (++count));
				jl[k].setForeground(Color.lightGray);
			}

		}

		// 設置文本
		public void showText(int year, int month) {
			int t = MonthOfFistDayOnWeek(year, month);
			for (int i = 0; i < MonthDay(month); i++) {
				jl[8 + t + i].setText("" + (i + 1));
			}

		}

		// 判斷閏年
		protected boolean leepyear(int year) {
			return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) ? true
					: false;
		}

		// 求已知月份的第一天是周幾, 1900,1,1星期一
		protected int MonthOfFistDayOnWeek(int year, int month) {
			if (year == 0)
				year = 2014;
			if (month == 0)
				month = 7;
			int daysOnWeek = 0;
			long result = 0;
			for (int i = 1900; i < year; i++)
				if (leepyear(i))
					result += 1;
			long length = (year - 1900) * 365 + monthIyearDays(month);
			result += length;
			if (result % 7 == 0)
				daysOnWeek = 0;
			if (result % 7 == 1)
				daysOnWeek = 1;
			if (result % 7 == 2)
				daysOnWeek = 2;
			if (result % 7 == 3)
				daysOnWeek = 3;
			if (result % 7 == 4)
				daysOnWeek = 4;
			if (result % 7 == 5)
				daysOnWeek = 5;
			if (result % 7 == 6)
				daysOnWeek = 6;

			return daysOnWeek;
		}

		// 求已知月份的天數
		protected int MonthDay(int month) {
			if (year == 0)
				year = 2014;
			if (month == 0)
				month = 7;
			int result = 0;
			switch (month) {
			case 4:
			case 6:
			case 9:
			case 11:
				result = 30;
				break;
			case 2:
				if (leepyear(year))
					result = 29;
				else
					result = 28;
				break;
			default:
				result = 31;
				break;
			}
			return result;
		}

		// 求已知月份距離該年一月一日的天數
		private int monthIyearDays(int month) {
			int result = 0;
			if (year == 0)
				year = 2014;
			switch (month) {
			case 1:
				break;
			case 2:
				result = 31;
				break;
			case 3:
				if (leepyear(year)) {
					result = 31 + 29;
				} else
					result = 31 + 28;
				break;

			case 4:
				if (leepyear(year)) {
					result = 31 + 29 + 31;
				} else
					result = 31 + 28 + 31;
				break;
			case 5:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30;
				} else
					result = 31 + 28 + 31 + 30;
				break;
			case 6:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31;
				} else
					result = 31 + 28 + 31 + 30 + 31;
				break;
			case 7:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30;
				break;
			case 8:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30 + 31;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30 + 31;
				break;
			case 9:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
				break;
			case 10:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
				break;
			case 11:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
				break;
			case 12:
				if (leepyear(year)) {
					result = 31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31
							+ 30;
				} else
					result = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31
							+ 30;
				break;
			default:
				break;
			}
			return result;
		}

	}

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章