📄 calendar.java
字号:
package first;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.plaf.basic.BasicArrowButton;
/**
* a simple calendar
* @author zg
* @version 1.0
*/
public class Calendar extends JApplet{
private static final long serialVersionUID = 1L;
String dayName[] = {"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};
int leapdays[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int nonleapdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day = 27, month = 5, year = 2008;
int base_year = 1900;
/**
* 增减month, day, year, 共有6种状态
* @see #common_actionPerformed(ActionEvent)
*/
int event_type = -1;
/**
* 选中month, day或year, 共有3种状态
* @see #setTopleft_panel()
*/
int date_type = -1;
JFrame frame = new JFrame("Calendar");
/**
* 由topleft_panel 和 topright_panel合成
*/
JPanel top_panel = new JPanel();
/**
* 显示时间
*/
JPanel topleft_panel = new JPanel();
/**
* 显示上下按钮
*/
JPanel topright_panel = new JPanel();
/**
* 显示减月份按钮
*/
JPanel left_panel = new JPanel();
/**
* 由cenertop_panel 和 centerdown_panel 合成
*/
JPanel center_panel = new JPanel();
/**
* 显示星期
*/
JPanel centertop_panel = new JPanel();
/**
* 主面板
*/
JPanel centerdown_panel = new JPanel();
/**
* 显示增月份按钮
*/
JPanel right_panel = new JPanel();
/**
* 显示OK, cancel按钮
*/
JPanel down_panel = new JPanel();
JButton p_top = new BasicArrowButton(BasicArrowButton.NORTH);
JButton n_top = new BasicArrowButton(BasicArrowButton.SOUTH);
JButton p_month = new BasicArrowButton(BasicArrowButton.WEST);
JButton n_month = new BasicArrowButton(BasicArrowButton.EAST);
JButton j_ok = new JButton("OK");
JButton j_cancel = new JButton("Cancel");
JButton j_month = new JButton("");
JButton j_day = new JButton("");
JButton j_year = new JButton("");
JButton[] jbuttons = new JButton[6 * 7];
/**
* 当前月的第一天在主面板中的起始位置
*/
int adjustment;
/**
* 双击选中日期
*/
boolean isDoubleClick = false;
/**
* 上次点击时间
*/
long click_time = 0;
/**
* OK 或 Cancel的状态
*/
int status = -1;
public void init()
{
try
{
getCurrentDate();
createGUI();
}
catch(Exception exp)
{
System.out.println("Exception caught in displaying calendar!");
exp.printStackTrace();
}
}
/**
* 显示选中的日期
*/
public void paint(Graphics g)
{
g.clearRect(0, 0, this.getWidth(), this.getHeight());
g.drawString(month + "/" + day + "/" + year, this.getWidth() / 2, this.getHeight() / 2);
}
public void destroy()
{
System.exit(0);
}
/**
* 创建面板
*
*/
private void createGUI()
{
setTopleft_panel();
setTopright_panel();
setCentertop_panel();
setCenterdown_panel();
setSide_panel();
setDown_panel();
try
{
Border border = BorderFactory.createEmptyBorder( 4, 5, 2, 5 );
frame.getContentPane().setLayout(new BorderLayout());
top_panel.setLayout(new FlowLayout());
top_panel.add(topleft_panel);
top_panel.add(topright_panel);
top_panel.setBorder(border);
frame.getContentPane().add(top_panel, BorderLayout.NORTH);
frame.getContentPane().add(left_panel, BorderLayout.WEST);
center_panel.setLayout(new BorderLayout());
center_panel.add(centertop_panel, BorderLayout.NORTH);
center_panel.add(centerdown_panel, BorderLayout.SOUTH);
center_panel.setBorder(border);
frame.getContentPane().add(center_panel, BorderLayout.CENTER);
frame.getContentPane().add(right_panel, BorderLayout.EAST);
down_panel.setBorder(border);
frame.getContentPane().add(down_panel, BorderLayout.SOUTH);
//Display the window.
frame.pack();
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation( ( screen.width - frame.getSize().width ) / 2,( screen.height - frame.getSize().height ) / 2 );
frame.setVisible(true);
frame.setResizable(false);
}
catch(Exception exp)
{
System.out.println("Exceptioon caught in createAndShowGUI");
exp.printStackTrace();
}
}
/**
* 更新面板日期
*
*/
private void ReDraw()
{
setTopleftText();
setCenterdownText();
}
/**
* 设置左上角显示的时间
*
*/
private void setTopleftText()
{
String text = (month < 10) ? "0" + month : "" + month;
j_month.setText(text);
text = (day < 10) ? "0" + day : "" + day;
j_day.setText(text);
text = year + "";
j_year.setText(text);
}
private void setTopleft_panel()
{
topleft_panel.setLayout(new FlowLayout());
setTopleftText();
topleft_panel.add(j_month);
topleft_panel.add(new JLabel("-"));
topleft_panel.add(j_day);
topleft_panel.add(new JLabel("-"));
topleft_panel.add(j_year);
final Color background = j_ok.getBackground();
final Color changedground = Color.PINK;
j_month.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
date_type = 0;
j_month.setBackground(changedground);
j_day.setBackground(background);
j_year.setBackground(background);
}
});
j_day.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
date_type = 1;
j_month.setBackground(background);
j_day.setBackground(changedground);
j_year.setBackground(background);
}
});
j_year.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
date_type = 2;
j_month.setBackground(background);
j_day.setBackground(background);
j_year.setBackground(changedground);
}
});
}
private void setTopright_panel()
{
topright_panel.setLayout(new BorderLayout());
topright_panel.add(p_top, BorderLayout.NORTH);
topright_panel.add(n_top, BorderLayout.SOUTH);
n_top.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
switch (date_type)
{
case 0: // prev month
event_type = 0;
break;
case 1: // prev day
event_type = 2;
break;
case 2: // prev year
event_type = 4;
break;
default:
return;
}
common_actionPerformed(e);
}
});
p_top.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
switch (date_type)
{
case 0: // next month
event_type = 1;
break;
case 1: // next day
event_type = 3;
break;
case 2: // next year
event_type = 5;
break;
default:
return;
}
common_actionPerformed(e);
}
});
}
private void setCentertop_panel()
{
centertop_panel.setLayout(new GridLayout(1,7));
for(int d = 0; d < 7; d++)
{
centertop_panel.add(new JButton(dayName[d]));
}
}
/**
* 设置主面板的日期
*
*/
private void setCenterdownText()
{
long totaldays = no_of_days(month,year) + 1;
long modulus = totaldays % 7;
adjustment = (Integer.parseInt(modulus + "") + 6) % 7;
int days = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
for (int j = 0; j < 6 * 7 ; j++)
{
if (j < adjustment)
jbuttons[j].setText(" ");
else if (j < adjustment + days)
jbuttons[j].setText((j - adjustment + 1) + "");
else
jbuttons[j].setText(" ");
}
}
private void setCenterdown_panel()
{
centerdown_panel.setLayout(new GridLayout(6,7));
final Color background = j_ok.getBackground();
final Color changedground = Color.GREEN;
for (int i = 0; i < 6 * 7; i++)
{
jbuttons[i] = new JButton(" ");
centerdown_panel.add(jbuttons[i]);
jbuttons[i].addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String text = e.getActionCommand();
if (text.trim().equals(""))
return;
int date = Integer.parseInt(text);
int id = date + adjustment - 1;
long nowTime = (new Date()).getTime();
if (nowTime - click_time < 300)
isDoubleClick = true;
else
isDoubleClick = false;
click_time= nowTime;
if (!isDoubleClick)
{
for (int i = 0; i < 6 * 7; i++)
{
jbuttons[i].setBackground(background);
}
day = date;
setTopleftText();
jbuttons[id].setBackground(changedground);
}
else
{
status = 0;
Output();
}
}
});
}
setCenterdownText();
}
private void setSide_panel()
{
left_panel.setLayout(new FlowLayout());
left_panel.add(p_month);
right_panel.setLayout(new FlowLayout());
right_panel.add(n_month);
p_month.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
event_type = 0;
common_actionPerformed(e);
}
});
n_month.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
event_type = 1;
common_actionPerformed(e);
}
});
}
private void setDown_panel()
{
j_ok.setMnemonic('O');
j_cancel.setMnemonic('C');
down_panel.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 0));
down_panel.add(j_ok);
down_panel.add(j_cancel);
j_ok.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
status = 0;
Output();
}
});
j_cancel.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(ActionEvent e)
{
status = 1;
Output();
}
});
}
/**
* status 0: OK被选中
* 1: Cancel被选中
*/
public void Output()
{
switch (status)
{
case 0:
repaint();
frame.dispose();
break;
case 1:
frame.dispose();
break;
default:
return;
}
}
public void common_actionPerformed(ActionEvent ae)
{
switch(event_type)
{
case 0: // prev month
{
if (month == 1)
{
month = 12;
year--;
}
else
month--;
int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
if (day > lastday)
day = lastday;
break;
}
case 1: // next month
{
if (month == 12)
{
month = 1;
year++;
}
else
month++;
int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
if (day > lastday)
day = lastday;
break;
}
case 2: // prev day
{
if (day == 1)
{
if (month - 1 == 0) // the first day of a year
{
day = 31;
month = 12;
year--;
}
else // the first day of a month
{
month--;
day = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
}
}
else
day--;
break;
}
case 3: // next day
{
int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
if (day == lastday)
{
if (month == 12)
{
day = 1;
month = 1;
year++;
}
else
{
month++;
day = 1;
}
}
else
day++;
break;
}
case 4: // prev year
{
if (year > 1900)
year--;
int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
if (day > lastday)
day = lastday;
break;
}
case 5: // next year
{
year++;
int lastday = checkLeap(year) ? leapdays[month - 1] : nonleapdays[month - 1];
if (day > lastday)
day = lastday;
break;
}
default:
return;
}
ReDraw();
}
/**
* 初始化为当前日期
*/
private void getCurrentDate()
{
String dateToday =new String();
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = new Date();
dateToday = (String)sdf.format(date);
this.day = Integer.parseInt(dateToday.substring(0,2));
this.month = Integer.parseInt(dateToday.substring(3,5));
this.year = Integer.parseInt(dateToday.substring(6,10));
}
private long no_of_days(int month,int year)
{
int yy = (year - base_year);
long days = (yy * 365);
int count = 0;
for (int i = base_year; i < year; i++)
{
if(checkLeap(i))
{
days = days + 1;
count++;
}
}
for (int j = 0; j < month - 1; j++)
{
if (checkLeap(year))
days = days + leapdays[j];
else
days=days + nonleapdays[j];
}
return days;
}
private boolean checkLeap(int year)
{
if((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))
return true;
else
return false;
}
public static void Main(String[] args)
{
Calendar calendar = new Calendar();
calendar.init();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -