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;
}
}
}
java實現的萬年曆(算法自己寫的能不能優化)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.