java大作业 模拟win7日期时间属性

package Jamian;

import java.awt.Button;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;


@SuppressWarnings("serial")
public class MyCalendar extends JFrame{
    Thread timer=null;//更新UI的线程,每一秒钟重绘一次时钟
    public MyCalendar() {
        setTitle("简易时钟日历");
        setSize(400,250);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(false);

        JSplitPane splitPane=new JSplitPane();//将Jframe分割成左右两部分,左边实现日历,右边实现时钟
        splitPane.setBackground(Color.orange);
        splitPane.setDividerLocation(250);
        splitPane.setDividerSize(-1);

        ClockPanel clockPanel=new ClockPanel();//右侧面板的时钟
        CalendarPanel calendarPanel=new CalendarPanel(this);//左侧面板的日历
        splitPane.setRightComponent(clockPanel);
        splitPane.setLeftComponent(calendarPanel);
        add(splitPane);
        setVisible(true);

        new Thread(clockPanel).start();
    }
    public static void main(String[] args) {
         new MyCalendar();
    }
}
/**
 * JFrame左侧面板实现日历功能
 **/


@SuppressWarnings("serial")
//*****************************************************************
class CalendarPanel extends JPanel implements ActionListener{
    JPanel selectPanel; //主面板上方三个按钮,分别为月份减少按钮,选择月份、年份按钮,月份增加按钮
    JPanel showPanel; //该面板有三种显示状态,一种即显示日历,一种显示选择月份,一种显示选择年份
    JPanel weekdayPanel; //该面板被添加打showPanel,显示静态文本周一到周日
    JPanel calshowPanel; //该面板被添加到shouPannel,显示一个月中的每天
    JPanel selectmonth; //该面板被添加到showPanel,显示选择月份的按钮
    JPanel selectyear; //该面板被添加到shouPanel,显示选择年份的按钮
    JButton btleft;
    JButton btright;
    JButton btmid;
    Button btday[]=new Button[42];
    Button btmonth[]=new Button[12];
    Button btyear[]=new Button[12];
    Calendar curcalendar; //记录当前日历上显示的日期
    JFrame jFrame; //存储Parent的JFrame,用于调用其setVisible更新界面(由于未实现paint函数,所以用此函数可以更新)

   
    public CalendarPanel(JFrame jFrame) {       
        this.jFrame=jFrame;
        setLayout(null);
        setBackground(new Color(186, 231, 241));
        selectPanel =new JPanel(null);
        selectPanel.setBackground(Color.darkGray);
        selectPanel.setBounds(0, 0, 250, 35);

        btleft=new JButton("<");
        btleft.setBounds(20, 5, 45, 25);
        btleft.addActionListener(this);
        selectPanel.add(btleft);

        btmid=new JButton("  ");
        btmid.setBounds(70,5,120,25);
        btmid.addActionListener(this);
        selectPanel.add(btmid);

        btright=new JButton(">");
        btright.setBounds(195, 5, 45, 25);
        btright.addActionListener(this);
        selectPanel.add(btright);
        add(selectPanel);

        weekdayPanel=new JPanel();
        weekdayPanel.setBounds(0, 35, 250, 30);
        weekdayPanel.setBackground(Color.gray);
        weekdayPanel.setLayout(new GridLayout(1,7));
        weekdayPanel.add(new Label("日"));
        weekdayPanel.add(new Label("一"));
        weekdayPanel.add(new Label("二"));
        weekdayPanel.add(new Label("三"));
        weekdayPanel.add(new Label("四"));
        weekdayPanel.add(new Label("五"));
        weekdayPanel.add(new Label("六"));

        calshowPanel=new JPanel();
        calshowPanel.setBounds(0, 65, 250, 155);
        calshowPanel.setLayout(new GridLayout(6, 7));

        for(int i=0;i<42;i++){
            btday[i]=new Button("");
            btday[i].addActionListener(this);
        }

        curcalendar=Calendar.getInstance();
        int monthday=curcalendar.get(Calendar.DAY_OF_MONTH);
        int weekday=curcalendar.get(Calendar.DAY_OF_WEEK);
        int startcol=7-(monthday-weekday)%7;
        if(startcol==0) startcol=7;

        Calendar lastcalendar=(Calendar) curcalendar.clone();
        lastcalendar.set(Calendar.DAY_OF_MONTH, 1);
        lastcalendar.add(Calendar.DAY_OF_MONTH, -startcol);
        int tablestart=lastcalendar.get(Calendar.DAY_OF_MONTH);

        String midbt_lab=curcalendar.get(Calendar.YEAR)+"年"+(curcalendar.get(Calendar.MONTH)+1)+"月";
        btmid.setText(midbt_lab);

        int k=0;
        for(int i=0;i<startcol;i++){
            btday[k].setForeground(Color.gray);
            btday[k].setLabel((tablestart++)+"");
            calshowPanel.add(btday[k++]);
        }
        for(int i=1;i<=curcalendar.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
            btday[k].setForeground(Color.black);
            btday[k].setLabel(i+"");
            calshowPanel.add(btday[k++]);
        }
        for(int i=1;i<=42-startcol-curcalendar.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
            btday[k].setForeground(Color.gray);
            btday[k].setLabel(i+"");
            calshowPanel.add(btday[k++]);
        }

        showPanel=new JPanel(null);
        showPanel.setBounds(0,0,250,220);
        showPanel.add(weekdayPanel);
        showPanel.add(calshowPanel);

        add(showPanel);

        selectmonth=new JPanel(new GridLayout(3, 4));
        selectmonth.setBounds(0, 35, 250, 185);
        for(int i=0;i<12;i++){
            btmonth[i]=new Button((i+1)+"月");
            btmonth[i].addActionListener(this);
            selectmonth.add(btmonth[i] );
        }

        selectyear=new JPanel(new GridLayout(3, 4));
        selectyear.setBounds(0,35,250,185);
        for(int i=0;i<12;i++){
            btyear[i]=new Button((curcalendar.get(Calendar.YEAR)-6+i)+"");
            btyear[i].addActionListener(this);
            selectyear.add(btyear[i] );
        }
    }
    
    //***********************************************************************
    public void updatebtday(){
        int monthday=curcalendar.get(Calendar.DAY_OF_MONTH);
        int weekday=curcalendar.get(Calendar.DAY_OF_WEEK);
        int startcol=7-(monthday-weekday)%7;
        if(startcol==0) startcol=7;

        Calendar lastcalendar=(Calendar) curcalendar.clone();
        lastcalendar.set(Calendar.DAY_OF_MONTH, 1);
        lastcalendar.add(Calendar.DAY_OF_MONTH, -startcol);
        int tablestart=lastcalendar.get(Calendar.DAY_OF_MONTH);

        String midbt_lab=curcalendar.get(Calendar.YEAR)+"年"+(curcalendar.get(Calendar.MONTH)+1)+"月";
        btmid.setText(midbt_lab);

        int k=0;
        for(int i=0;i<startcol;i++){
            btday[k].setForeground(Color.gray);
            btday[k++].setLabel((tablestart++)+"");
        }
        for(int i=1;i<=curcalendar.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
            btday[k].setForeground(Color.black);
            btday[k++].setLabel(i+"");
        }
        for(int i=1;i<=42-startcol-curcalendar.getActualMaximum(Calendar.DAY_OF_MONTH);i++){
            btday[k].setForeground(Color.gray);
            btday[k++].setLabel(i+"");
        }
    }
    
    //**************************************************************
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==btmid){
            JPanel getpanel=(JPanel) showPanel.getComponent(0);
            if(getpanel==weekdayPanel){
                btmid.setText(curcalendar.get(Calendar.YEAR)+"");
                showPanel.removeAll();
                showPanel.add(selectmonth);
            }else if(getpanel==selectmonth){
                showPanel.removeAll();
                showPanel.add(selectyear);
                btmid.setText((curcalendar.get(Calendar.YEAR)-6)+"-"+(curcalendar.get(Calendar.YEAR)+5));
            }

            jFrame.setVisible(true);
        }else if(e.getSource()==btleft){
            JPanel getpanel=(JPanel) showPanel.getComponent(0);
            if(getpanel==weekdayPanel){
                int month1=curcalendar.get(Calendar.MONTH);
                curcalendar.set(Calendar.MONTH, month1-1);
                updatebtday();
            }else if(getpanel==selectmonth){
                int year=curcalendar.get(Calendar.YEAR);
                curcalendar.set(Calendar.YEAR, year-1);
                btmid.setText(curcalendar.get(Calendar.YEAR)+"");
            }else{
                String str=btyear[0].getLabel();
                int first=Integer.parseInt(str);
                for(int i=11;i>=0;i--){
                    btyear[i].setLabel((--first)+"");
                }
                btmid.setText(first+"-"+(first+11));
            }

        }else if(e.getSource()==btright){
            JPanel getpanel=(JPanel) showPanel.getComponent(0);
            if(getpanel==weekdayPanel){
                int month1=curcalendar.get(Calendar.MONTH);
                curcalendar.set(Calendar.MONTH, month1+1);
                updatebtday();
            }else if(getpanel==selectmonth){
                int year=curcalendar.get(Calendar.YEAR);
                curcalendar.set(Calendar.YEAR, year+1);
                btmid.setText(curcalendar.get(Calendar.YEAR)+"");
            }else{
                String str=btyear[11].getLabel();
                int last=Integer.parseInt(str);
                for(int i=0;i<12;i++){
                    btyear[i].setLabel((++last)+"");
                }
                btmid.setText((last-11)+"-"+last);
            }
        }else if(((Button) e.getSource()).getForeground()==Color.gray ){
            String command=e.getActionCommand();
            int com_int=Integer.parseInt(command);
            if(com_int>20){
                int month3=curcalendar.get(Calendar.MONTH);
                curcalendar.set(Calendar.MONTH, month3-1);
            }else if( com_int<20){
                int month4=curcalendar.get(Calendar.MONTH);
                curcalendar.set(Calendar.MONTH, month4+1);
            }
            updatebtday();
        }else if(((Button)e.getSource()).getForeground()==Color.black){

        }else {
            switch(e.getActionCommand()){
            case "1月":
                curcalendar.set(Calendar.MONTH,0);
                break;
            case "2月":
                curcalendar.set(Calendar.MONTH,1);
                break;
            case "3月":
                curcalendar.set(Calendar.MONTH,2);
                break;
            case "4月":
                curcalendar.set(Calendar.MONTH,3);
                break;
            case "5月":
                curcalendar.set(Calendar.MONTH,4);
                break;
            case "6月":
                curcalendar.set(Calendar.MONTH,5);
                break;
            case "7月":
                curcalendar.set(Calendar.MONTH,6);
            break;
            case "8月":
                curcalendar.set(Calendar.MONTH,7);
                break;
            case "9月":
                curcalendar.set(Calendar.MONTH,8);
                break;
            case "10月":
                curcalendar.set(Calendar.MONTH,9);
                break;
            case "11月":
                curcalendar.set(Calendar.MONTH,10);
                break;
            case "12月":
                curcalendar.set(Calendar.MONTH,11);
                break;  
            default:
                String string=e.getActionCommand();
                int year=Integer.parseInt(string);
                curcalendar.set(Calendar.YEAR, year);
                btmid.setText(curcalendar.get(Calendar.YEAR)+"");
                showPanel.removeAll();
                showPanel.add(selectmonth);
                return;
            }//switch
            showPanel.removeAll();
            updatebtday();
            showPanel.add(weekdayPanel);
            showPanel.add(calshowPanel);
            jFrame.setVisible(true);
        }
    }
}


@SuppressWarnings("serial")
class ClockPanel extends JPanel implements Runnable{
    int lastxs=50, lastys=30, lastxm=50, lastym=30, lastxh=50, lastyh=30;
    Label cur_day;
    Label cur_clock;
    Label cur_week;
    public ClockPanel() {
        setLayout(null);
        setBackground(Color.white);
        cur_day=new Label("");
        cur_day.setBounds(40, 5, 67, 20);
        cur_day.setBackground(new Color(186, 231, 241));
        add(cur_day);

        cur_clock=new Label("");
        cur_clock.setBounds(50, 160, 55, 20);
        cur_clock.setBackground(new Color(186, 231, 241));
        add(cur_clock);

        cur_week=new Label("");
        cur_week.setBounds(56, 180, 40, 20);
        cur_week.setBackground(new Color(186, 231, 241));
        add(cur_week);
    }
    
    
    @Override
    public void paint(Graphics g) {
        g.setColor(new Color(186, 231, 241));
        g.fillRect(0, 0, 150, 250);
        int xh, yh, xm, ym, xs, ys, s, m, h, xcenter, ycenter;
        Date currenttime = new Date(); //获取当前日期和时间
        s = currenttime.getSeconds();
        m = currenttime.getMinutes();
        h = currenttime.getHours();
        SimpleDateFormat formatter_day= new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat formatter_clock = new SimpleDateFormat("HH:mm:ss");
        SimpleDateFormat formatter_week = new SimpleDateFormat("EEEE");
        cur_day.setText(formatter_day.format(currenttime));
        cur_clock.setText(formatter_clock.format(currenttime));
        cur_week.setText(formatter_week.format(currenttime));
        xcenter=75; ycenter=90; //图形钟的原点
        //以下计算秒针、分针、时针位置
        xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter);
        ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter);
        xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter);
        ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter);
        xh = (int)(Math.cos((h*30+m/2)*3.14f/180-3.14f/2)*30+xcenter);
        yh = (int)(Math.sin((h*30+m/2)*3.14f/180-3.14f/2)*30+ycenter);
        g.setFont(new Font("TimesRoman", Font.PLAIN, 14));
        g.setColor(Color.lightGray); //设置表盘颜色
        g.fillOval(xcenter-60, ycenter-58, 120, 120);
        g.setColor(Color.darkGray); //设置表盘数字颜色
        g.drawString("9",xcenter-53,ycenter+5); //画表盘上的数字
        g.drawString("3",xcenter+45,ycenter+5);
        g.drawString("12",xcenter-8,ycenter-41);
        g.drawString("6",xcenter-3,ycenter+55);

        g.setColor(Color.gray); //使用红色画新指针
        g.drawLine(xcenter, ycenter, xs, ys);
        g.drawLine(xcenter, ycenter-2, xm, ym);
        g.drawLine(xcenter-2, ycenter, xm, ym);
        g.drawLine(xcenter, ycenter-2, xh, yh);
        g.drawLine(xcenter-2, ycenter, xh, yh);
        lastxs=xs; lastys=ys; //保存指针位置
        lastxm=xm; lastym=ym;
        lastxh=xh; lastyh=yh; 
    }
    //***************************************************************************
    @Override
    public void run() {
        while (true)        {
            try {
                Thread.sleep(1000);
            }catch (InterruptedException e) {}
            repaint(); 
        }
    }
	
}