import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
public class MyCalendar{
public static void main(String arg []){
new CalendarFace();
}
}
class CalendarFace extends JFrame{
private JFrame f;
private GregorianCalendar cal=new
GregorianCalendar(Locale.CHINESE); //主日历
private JPanel toppan,clockpan,daypan,capan,mainpan;
private JTextField yeartxt,monthtxt,daytxt;
private JLabel weeklab;
private JButton
yearup,yeardown,monthup,monthdown,dayup,daydown;
private JButton changedate_time,toplab;
private JToggleButton day[]=new JToggleButton[42];
private String timestring;
private int nowyear,nowmonth,nowday; //现在是xx年xx月xx日
private int[] lastday={0,31,28,31,30,31,30,31,31,30,31,30,31};
//1-12月的天数
public CalendarFace(){
Container con=getContentPane();
con.setLayout(new FlowLayout());
con.setBackground(Color.WHITE);
//初始化日期,获取今天的年月日 注:月份0-11之间,天数1-31之间
Calendar now=new GregorianCalendar();
nowyear=now.get(Calendar.YEAR);
nowmonth=now.get(Calendar.MONTH);
nowday=now.get(Calendar.DAY_OF_MONTH);
timestring=String.valueOf(nowyear+"年"+(nowmonth+1)+"月"+nowday+"日");
toplab=new JButton(timestring);
toplab.setBorder(null);
toplab.setBorderPainted(false);
toplab.setBackground(Color.WHITE);
toplab.setHorizontalAlignment(JButton.CENTER);
toplab.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//鼠标变成手型
toplab.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
toplab.setBorder(BorderFactory.createMatteBorder(0, 0, 1,
0,SystemColor.BLUE));
}
public void mouseExited(MouseEvent e) {
toplab.setBorder(BorderFactory.createMatteBorder(0, 0, 0,
0,SystemColor.BLUE));
}
});
toplab.setForeground(Color.BLUE); //设置字体颜色
toplab.setFont(new Font("宋体",Font.BOLD,18));
toplab.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
Calendar now=new GregorianCalendar();
nowyear=now.get(Calendar.YEAR);
nowmonth=now.get(Calendar.MONTH);
nowday=now.get(Calendar.DAY_OF_MONTH);
showDate();
showDays();
}
});
toppan=new JPanel();
toppan.setPreferredSize(new Dimension(200,40));
toppan.setBackground(Color.WHITE);
toppan.add(toplab);
//年份文本
yeartxt=new JTextField(4);
yeartxt.setHorizontalAlignment(JTextField.CENTER);
//文本内容居中
yeartxt.setText(nowyear+"年");
yeartxt.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyChar()==10){
String s;
if(yeartxt.getText().endsWith("年")){
s=yeartxt.getText().substring(0,yeartxt.getText().length()-1);
}else
s=yeartxt.getText();
nowyear=Integer.parseInt(s);
yeartxt.setText(nowyear+"年");
showDays();
}
}
});
//年份减少按钮
yeardown=new JButton("\u25C4");
yeardown.setBackground(Color.WHITE);
yeardown.setBorderPainted(false); //去掉按钮边框
yeardown.setBorder(null);
final int r=23;
yeardown.setPreferredSize(new Dimension(r-11, r));
yeardown.setSize(new Dimension(r, r));
yeardown.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowyear--;
showDate();
showDays();
}
});
//年份增加按钮
yearup=new JButton("\u25BA");
yearup.setBackground(Color.WHITE);
yearup.setBorderPainted(false); //去掉按钮边框
yearup.setBorder(null);
yearup.setPreferredSize(new Dimension(r-11, r));
yearup.setSize(new Dimension(r, r));
yearup.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowyear++;
showDate();
showDays();
}
});
//月份文本
monthtxt=new JTextField(3);
monthtxt.setHorizontalAlignment(JTextField.CENTER);
//文本内容居中
monthtxt.setText((nowmonth+1)+"月");
monthtxt.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyChar()==10){
String s;
if(monthtxt.getText().endsWith("月")){
s=monthtxt.getText().substring(0,monthtxt.getText().length()-1);
}else
s=monthtxt.getText();
int mindis=Integer.parseInt(s)-1;
if(mindis>=0&&mindis<12)
nowmonth=mindis;
monthtxt.setText((nowmonth+1)+"月");
showDays();
}
}
});
//月份减少按钮
monthdown=new JButton("\u25C4");
monthdown.setBackground(Color.WHITE);
monthdown.setBorderPainted(false); //去掉按钮边框
monthdown.setBorder(null);
monthdown.setPreferredSize(new Dimension(r-11, r));
monthdown.setSize(new Dimension(r, r));
monthdown.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowmonth--;
if(nowmonth==-1){
nowmonth=11;
nowyear--;
}
showDate();
showDays();
}
});
//月份增加按钮
monthup=new JButton("\u25BA");
monthup.setBackground(Color.WHITE);
monthup.setBorderPainted(false); //去掉按钮边框
monthup.setBorder(null);
monthup.setPreferredSize(new Dimension(r-11, r));
monthup.setSize(new Dimension(r, r));
monthup.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowmonth++;
if(nowmonth==12){
nowmonth=0;
nowyear++;
}
showDate();
showDays();
}
});
//天数文本
daytxt=new JTextField(3);//problem
daytxt.setHorizontalAlignment(JTextField.CENTER);
//文本内容居中
daytxt.setText(nowday+"日");
daytxt.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if(e.getKeyChar()==10){
String s;
if(daytxt.getText().endsWith("日")){
s=daytxt.getText().substring(0,daytxt.getText().length()-1);
}else
s=daytxt.getText();
int mindis=Integer.parseInt(s);
int n=lastday[nowmonth+1];
if(cal.isLeapYear(nowyear)&&nowmonth==1)
n++;
if(mindis>0&&mindis<=n)
nowday=mindis;
daytxt.setText(nowday+"日");
showDays();
}
}
});
//天数减少按钮
daydown=new JButton("\u25C4");
daydown.setBackground(Color.WHITE);
daydown.setBorderPainted(false); //去掉按钮边框
daydown.setBorder(null);
daydown.setPreferredSize(new Dimension(r-11, r));
daydown.setSize(new Dimension(r, r));
daydown.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowday--;
if(nowday==0){
nowmonth--;
if(nowmonth==-1){
nowmonth=11;
nowyear--;
}
nowday=lastday[nowmonth+1];
if(cal.isLeapYear(nowyear)&&nowmonth==1)
nowday++;
}
showDate();
showDays();
}
});
//天数增加按钮
dayup=new JButton("\u25BA");
dayup.setBackground(Color.WHITE);
dayup.setBorderPainted(false); //去掉按钮边框
dayup.setBorder(null);
dayup.setPreferredSize(new Dimension(r-11, r));
dayup.setSize(new Dimension(r, r));
dayup.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowday++;
if(nowday>lastday[nowmonth+1]){
nowmonth++;
if(nowmonth==12){
nowmonth=0;
nowyear++;
}
nowday=1;
}
showDate();
showDays();
}
});
weeklab=new JLabel(" 日 一 二 三 四
五
六");
daypan=new JPanel();
daypan.setLayout(new GridLayout(6,7));
for(int i=0;i<42;i++){
final int x=30;
day[i]=new JToggleButton();
day[i].setBorder(null);
day[i].setBackground(SystemColor.WHITE);
day[i].setPreferredSize(new Dimension(x,x-6));
day[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
nowday=Integer.parseInt(((JToggleButton)e.getSource()).getText());
showDate();
showDays();
}
});
daypan.add(day[i]);
}
showDays();
//capan是日历主体中间容器
capan=new JPanel();
capan.setLayout(new FlowLayout());
capan.setBackground(Color.WHITE);
capan.setBorder(null);
capan.setPreferredSize(new Dimension(280,200));
capan.add(yeardown);
capan.add(yeartxt);
capan.add(yearup);
capan.add(monthdown);
capan.add(monthtxt);
capan.add(monthup);
capan.add(daydown);
capan.add(daytxt);
capan.add(dayup);
capan.add(weeklab);
capan.add(daypan);
//clockpan是时钟中间容器
clockpan=new JPanel();
clockpan.setLayout(new BorderLayout());
clockpan.setBorder(null);
clockpan.setPreferredSize(new Dimension(160,200));
clockpan.add(new MyClock(true,timestring));
//mainpan是日历和时钟结合的中间容器
mainpan=new JPanel();
mainpan.setBackground(Color.WHITE);
mainpan.add(capan);
mainpan.add(clockpan);
//更改日期和时间
changedate_time=new JButton("更改日期和时间设置...");
changedate_time.setBorder(null);
changedate_time.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
//鼠标变成手型
changedate_time.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
changedate_time.setBorder(BorderFactory.createMatteBorder(0,
0, 1, 0,SystemColor.BLUE));
}
public void mouseExited(MouseEvent e) {
changedate_time.setBorder(BorderFactory.createMatteBorder(0,
0, 0, 0,SystemColor.BLUE));
}
});
changedate_time.setForeground(Color.BLUE);
changedate_time.setFont(new Font("幼圆",Font.PLAIN,12));
changedate_time.setBorderPainted(false);
changedate_time.setBackground(Color.WHITE);
changedate_time.setHorizontalAlignment(JButton.CENTER);
changedate_time.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
new ChangeDate_Time(f,timestring);
}
});
con.add(toppan);
con.add(mainpan);
con.add(changedate_time,BorderLayout.SOUTH);
setSize(500,320);
setResizable(false);
setLocation(300,200);
setVisible(true);
setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
}
//刷新日期
void showDate(){
yeartxt.setText(nowyear+"年");
monthtxt.setText((nowmonth+1)+"月");
daytxt.setText(nowday+"日");
}
//重画天数选择面板
void showDays(){
int i,d;
cal.set(nowyear, nowmonth,1);
int firstDayOfWeek=cal.get(Calendar.DAY_OF_WEEK);
int n=lastday[nowmonth+1];
if(cal.isLeapYear(nowyear)&&nowmonth==1)
n++;
for(i=0;i
day[i].setEnabled(false);
day[i].setSelected(false);
day[i].setText("");
}
for(d=1;d<=n;d++){
day[i].setText(Integer.toString(d));
day[i].setEnabled(true);
if(d==nowday)
day[i].setSelected(true);
else
day[i].setSelected(false);
i++;
}
for(;i<42;i++){
day[i].setEnabled(false);
day[i].setSelected(false);
day[i].setText("");
}
}
}
class MyClock extends JPanel implements Runnable{
private int R=80,x0=R,y0=R+15;
private int d,x,y;
private int hour,minute,second;
private double rad=Math.PI/180;
private boolean leap;
private String datestring;
public MyClock(boolean leap,String datestring){
this.leap=leap;
this.datestring=datestring;
Calendar now=new GregorianCalendar();
second = now.get(Calendar.SECOND) * 6;//获得秒转换成度数
minute = now.get(Calendar.MINUTE) * 6;//获得分钟
hour = (now.get(Calendar.HOUR_OF_DAY) - 12) * 30 +
now.get(Calendar.MINUTE) / 12 * 6;//获得小时
Thread t = new Thread(this);
t.start();
}
public void paintComponent(Graphics g){
this.setBackground(Color.WHITE);
super.paintComponent(g);
g.setColor(Color.BLACK);
g.fillOval(x0-R, y0-R, 2*R, 2*R);
g.setColor(Color.WHITE);
g.fillOval(x0-R+3, y0-R+3, 2*R-6, 2*R-6);
g.setColor(Color.BLACK);
g.fillOval(x0-3, y0-3,6,6);
g.setColor(Color.DARK_GRAY);
//画点
d=0;
for(int i=0;i<60;i++){
x=(int)((R-8)*Math.sin(rad*d));
y=(int)((R-8)*Math.cos(rad*d));
int x1=(int)((R-13)*Math.sin(rad*d));
int y1=(int)((R-13)*Math.cos(rad*d));
g.drawString(".",x0+x-1,y0-y+1);
if(d0==0&&d�!=0)
g.drawLine(x0+x-1,y0-y+1,x0+x1-1,y0-y1+1);
d+=6;
}
//数字1-12
g.setColor(Color.BLACK);
d=30;
for(int i=1;i<13;i++){
x=(int)((R-21)*Math.sin(rad*d));
y=(int)((R-21)*Math.cos(rad*d));
g.drawString(String.valueOf(i),x0+x-3,y0-y+5);
d+=30;
}
//数字3,6,9,12小矩形
g.setColor(Color.DARK_GRAY);
g.fillRect(x0-1,y0-R+8,2,8);
g.fillRect(x0-1,y0+R-15,2,8);
g.fillRect(x0-R+8,y0-1,8,2);
g.fillRect(x0+R-15,y0-1,8,2);
//秒针
g.setColor(Color.BLACK);
x= (int)((R-7) * Math.sin(rad * second));
y= (int)((R-7) * Math.cos(rad * second));
g.drawLine(x0-(int)(15*Math.sin(rad *
second)),y0+(int)(15*Math.cos(rad * second)), x0+x, y0-y);
//分针
g.setColor(Color.BLACK);
x= (int)((R-27) * Math.sin(rad * minute));
y= (int)((R-27) * Math.cos(rad * minute));
g.drawLine(x0,y0, x0+x, y0-y);
//时针
g.setColor(Color.BLACK);
x= (int)((R-47) * Math.sin(rad * hour));
y= (int)((R-47) * Math.cos(rad * hour));
g.drawLine(x0,y0,x0+x,y0-y);
//显示时间
g.setColor(Color.BLACK);
g.setFont(new Font("宋体",Font.PLAIN,15));
Calendar now1 = new GregorianCalendar();
String nowhour,noeminute,nowsecond;
nowhour=String.valueOf(now1.get(Calendar.HOUR_OF_DAY)>9?now1.get(Calendar.HOUR_OF_DAY):"0"+now1.get(Calendar.HOUR_OF_DAY));
noeminute=String.valueOf(now1.get(Calendar.MINUTE)>9?now1.get(Calendar.MINUTE):"0"+now1.get(Calendar.MINUTE));
nowsecond=String.valueOf(now1.get(Calendar.SECOND)>9?now1.get(Calendar.SECOND):"0"+now1.get(Calendar.SECOND));
if(leap){
g.drawString(nowhour+": "+noeminute+": "+nowsecond,40,
13);
int dayofweek=now1.get(Calendar.DAY_OF_WEEK)-1;
String weekstring = null;
switch(dayofweek){
case 0:weekstring="星期日";break;
case 1:weekstring="星期一";break;
case 2:weekstring="星期二";break;
case 3:weekstring="星期三";break;
case 4:weekstring="星期四";break;
case 5:weekstring="星期五";break;
case 6:weekstring="星期六";break;
}
g.drawString(weekstring,56,195);
}else{
g.setFont(new Font("宋体",Font.PLAIN,15));
g.drawString("日期:",180,50);
g.drawString(datestring,180,70);
g.drawString("时间:",180,130);
g.drawString(nowhour+":"+noeminute+":"+nowsecond,180,
150);
}
}
public void run() {
while (true) {
try {
Thread.sleep(1000);
}catch(Exception ex){}
second+=6;
if (second>=360){
second=0;
minute+=6;
if(minute==72||minute==144||minute==216||minute==288){
hour+=6;
}
if(minute>=360){
minute=0;
hour+=6;
}
if(hour>=360){
hour=0;
}
}
this.repaint();
}
}
}
class ChangeDate_Time extends JDialog{
private JButton
changedate_time,changetimezone,ok,cancel,application;
private JPanel
timepan,date_timepan,timezonepan,changetimezonepan,xialingpan,downpan;
private JLabel timezonelab,timezone,xialing;
public ChangeDate_Time(JFrame f,String datestring){
super(f,"日期和时间",true);
Container con=getContentPane();
con.setLayout(new FlowLayout());
con.setBackground(Color.WHITE);
timepan=new JPanel();
timepan.setLayout(new BorderLayout());
timepan.setBorder(null);
timepan.setPreferredSize(new Dimension(410,200));
timepan.add(new MyClock(false,datestring));
con.add(timepan);
changedate_time=new JButton("更改日期和时间(D)");
changedate_time.setFont(new Font("宋体",Font.PLAIN,15));
changedate_time.setBorder(null);
changedate_time.setPreferredSize(new Dimension(150,20));
date_timepan=new JPanel();
date_timepan.setBackground(Color.WHITE);
date_timepan.setPreferredSize(new Dimension(410,40));
date_timepan.setLayout(new
FlowLayout(FlowLayout.RIGHT));
date_timepan.add(changedate_time);
con.add(date_timepan);
timezonelab=new JLabel("时区 ----------------------------------------");
timezonelab.setFont(new Font("宋体",Font.PLAIN,15));
timezone=new JLabel("(UTC+08:00)北京,重庆,香港特别行政区,乌鲁木齐");
timezone.setFont(new Font("宋体",Font.PLAIN,15));
timezonepan=new JPanel();
timezonepan.setBackground(Color.WHITE);
timezonepan.setPreferredSize(new Dimension(410,60));
timezonepan.setLayout(new FlowLayout(FlowLayout.LEFT));
timezonepan.add(timezonelab);
timezonepan.add(timezone);
con.add(timezonepan);
changetimezone=new JButton("更改时区(Z)");
changetimezone.setFont(new Font("宋体",Font.PLAIN,15));
changetimezone.setBorder(null);
changetimezone.setPreferredSize(new Dimension(150,20));
changetimezonepan=new JPanel();
changetimezonepan.setBackground(Color.WHITE);
changetimezonepan.setPreferredSize(new
Dimension(410,40));
changetimezonepan.setLayout(new
FlowLayout(FlowLayout.RIGHT));
changetimezonepan.add(changetimezone);
con.add(changetimezonepan);
xialing=new JLabel("此时区未实行夏令时。");
xialing.setFont(new Font("宋体",Font.PLAIN,15));
xialing.setBorder(null);
xialing.setPreferredSize(new Dimension(150,30));
xialingpan=new JPanel();
xialingpan.setBackground(Color.WHITE);
xialingpan.setPreferredSize(new Dimension(410,40));
xialingpan.setLayout(new FlowLayout(FlowLayout.LEFT));
xialingpan.add(xialing);
con.add(xialingpan);
ok=new JButton("确定");
ok.setFont(new Font("宋体",Font.PLAIN,15));
ok.setBorder(null);
ok.setPreferredSize(new Dimension(80,20));
ok.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
}
});
cancel =new JButton("取消");
cancel.setFont(new Font("宋体",Font.PLAIN,15));
cancel.setBorder(null);
cancel.setPreferredSize(new Dimension(80,20));
cancel.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
dispose();
}
});
application=new JButton("应用(A)");
application.setFont(new Font("宋体",Font.PLAIN,15));
application.setBorder(null);
application.setPreferredSize(new Dimension(80,20));
application.setEnabled(false);
downpan=new JPanel();
downpan.setBackground(Color.WHITE);
downpan.setPreferredSize(new Dimension(410,40));
downpan.setLayout(new FlowLayout(FlowLayout.RIGHT));
downpan.add(ok);
downpan.add(cancel);
downpan.add(application);
con.add(downpan);
setSize(450,480);
setResizable(false);
setLocation(300,200);
setVisible(true);
}
}