钟表与日历

一、设计的内容要求

1日历

    设计windows风格的日历,包括可以通过按键改变月份,可以显示单月日历(包括公历与星期),可以标示当前日历,可以显示当前日期。

2 时钟

    设计windows风格的时钟,包括表盘与指针式风格的时钟以及通过数字显示的数字时钟。

二、设计的重点与难点

    由于日历与时钟使用的代码书写方法不一样,时钟的设计主要是钟表的指针的动画实现,这里需要用到java的动画绘图技术,日历的实现主要在于精确计算日期相对应的年份是否是闰年,月份有多少天,以及日期与星期的精确对应。然后将这些对应关系精确排版显示。

三、代码部分

1、日历

package clockWithCalender;

import java.awt.*;
import java.awt.event.*;
import java.util.Calendar;

import javax.swing.*;

class CalendarCal {  
 String day[]; 
 int year , month; 

 public void setYear(int year) { 
  this.year = year;
 }

 public int getYear() {
  return year;
 }

 public void setMonth(int month) {
  this.month = month;
 }

 public int getMonth() {
  return month;
 }

 public String[] getCalendar() { 
  String day_of_week[] = new String[42]; 
  Calendar c = Calendar.getInstance(); 
  c.set(year, month - 1, 1);
  int weekday = c.get(Calendar.DAY_OF_WEEK) - 1;
  int day = 0;
  if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
   day = 31;
  }
  if (month == 4 || month == 6 || month == 9 || month == 11) {
   day = 30;
  }
  if (month == 2) {
   if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
    day = 29;
   } else {
    day = 28;
   }
  }
  for (int i = weekday, n = 1; i < weekday + day; i++) {
	  day_of_week[i] = String.valueOf(n);
   n++;
  }
  return day_of_week;
 }
}

public class CalendarPanel extends JPanel implements ActionListener {
	Calendar c=Calendar.getInstance();	
 Label labelDay[] = new Label[42]; 
 Label titleName[] = new Label[7];
 String name[] = { "日", "一", "二", "三", "四", "五", "六" };
 String day_of_week;
 JButton previousMonth,nextMonth;
 int year = c.get(Calendar.YEAR), month = c.get(Calendar.MONTH)+1,
		 date=c.get(Calendar.DATE),WeekDay=c.get(Calendar.DAY_OF_WEEK)-1;
 CalendarCal calendar; 
 Label showMessage = new Label("", Label.CENTER); 
 Label showdate=new Label("");
 
 public CalendarPanel() {  
	  Panel pCenter = new Panel();
	  Panel pNorth = new Panel();
	  Panel pSouth = new Panel();
	 pCenter.setLayout(new GridLayout(7, 7));
	 for(int i = 0; i < 7; i++)
	 {
		 if(i==WeekDay)
		day_of_week=name[i]; 
	 }
	 showdate.setText(String.valueOf(year)+"年"+String.valueOf(month)+"月"+String.valueOf(date)+"日"
			 +"  星期"+day_of_week);
	 showdate.setFont(new Font("Tahoma", Font.PLAIN,30));
  
 
  for (int i = 0; i < 7; i++) {      
	  titleName[i] = new Label(name[i],Label.CENTER);
	  titleName[i].setFont(new Font("Tahoma", Font.PLAIN,50));
   pCenter.add(titleName[i]);
  }
  for (int i = 0; i < 42; i++) {      
   labelDay[i] = new Label("", Label.CENTER);
   labelDay[i].setFont(new Font("Tahoma", Font.PLAIN,30));
   pCenter.add(labelDay[i]);
  }
  calendar = new CalendarCal();
  calendar.setYear(year);     
  calendar.setMonth(month);
  String day[] = calendar.getCalendar(); 
  for (int i = 0; i < 42; i++) {     
   labelDay[i].setText(day[i]);
   if(String.valueOf(c.get(Calendar.DATE)).equals(day[i]))
	   labelDay[i].setBackground(Color.blue);;
  }

  nextMonth = new JButton(new ImageIcon("image\\you.JPG"));
  previousMonth = new JButton(new ImageIcon("image\\zuo.JPG"));
  nextMonth.addActionListener(this);
  previousMonth.addActionListener(this);

  pNorth.add(previousMonth);
  pNorth.add(showMessage);
  pNorth.add(nextMonth);
  pSouth.add(showdate);
  showMessage.setText( calendar.getYear() + "年" + calendar.getMonth() + "月");
  showMessage.setFont(new Font("Tahoma", Font.PLAIN,30));
  this.setLayout(new BorderLayout());
  
  this.add(pNorth,BorderLayout.NORTH);
  this.add(pCenter,BorderLayout.CENTER);
  this.add(pSouth,BorderLayout.SOUTH);
 }

 public void actionPerformed(ActionEvent e) {
  if (e.getSource() == nextMonth) { 
   month = month + 1;
   if (month > 12)
    {month = 1;year=year+1;}
   calendar.setMonth(month);
   calendar.setYear(year);
   String day[] = calendar.getCalendar();
   for (int i = 0; i < 42; i++) {
    labelDay[i].setText(day[i]);
   }
  } else if (e.getSource() == previousMonth) {
   month = month - 1;
   
   if (month < 1)
   {month = 12;year=year-1;}
   calendar.setYear(year);
   calendar.setMonth(month);
   String day[] = calendar.getCalendar();
   for (int i = 0; i < 42; i++) {
    labelDay[i].setText(day[i]);
   }
  } 

  showMessage.setText( calendar.getYear() + "年" + calendar.getMonth() + "月");
 }

}

2、时钟

package clockWithCalender;

import java.awt.*;
import java.util.Calendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public class ClockPanel extends JPanel implements Runnable
{
    public double X,Y;
    public double R=150;
    public double HX,HY,MX,MY,SX,SY;
    public int Year,Month,Day,Hour,Minute,Second;
    public final double PI=3.1415926;
   public void paint(Graphics g)
   {
      super.paintComponent(g);
      g.drawImage(getToolkit().getImage("image\\sucai.png"), 30, 30, this);
      X=252;
      Y=240;
     
      double HRadian=(PI/6)*Hour+(PI/360)*Minute+(PI/21600)*Second;
      double MRadian=(PI/30)*Minute+(PI/1800)*Second;
      double SRadian=(PI/30)*Second;
      HX=X+R*0.6*Math.sin(HRadian);
      HY=Y-R*0.6*Math.cos(HRadian);
      MX=X+R*0.8*Math.sin(MRadian);
      MY=Y-R*0.8*Math.cos(MRadian);
      SX=X+R*Math.sin(SRadian);
      SY=Y-R*Math.cos(SRadian);
  
      g.drawLine((int)(X), (int)(Y), (int)(SX), (int)(SY));//画线
      g.drawLine((int)(X), (int)(Y), (int)(MX), (int)(MY));
      g.drawLine((int)(X), (int)(Y), (int)(HX), (int)(HY));
    
      g.setFont(new Font("Tahoma", Font.PLAIN,50));
      g.drawString(Hour+":"+Minute+":"+Second+" ", 150, 515);
    		  
   }

   public void run() {
      while(true)
      {
         try {
            setCurrentTime();
            repaint();
            Thread.sleep(1000);
         } catch (InterruptedException e) {
            e.printStackTrace();
         }
    
      }
     }
   public void setCurrentTime()
   { 
	  Calendar calendar=Calendar.getInstance();
      Hour=calendar.get(Calendar.HOUR_OF_DAY);
      Minute=calendar.get(Calendar.MINUTE);
      Second=calendar.get(Calendar.SECOND);
   
      }
   }

3、合成

package clockWithCalender;

import java.awt.GridLayout;
import javax.swing.JFrame;

public class MainFram extends JFrame {
	 
	   public MainFram()
	   {
		  this.setLayout(new GridLayout(1,2)); 
		  CalendarPanel cf=new CalendarPanel();
	      ClockPanel jp_clock=new ClockPanel();
	      add(cf);
	      add(jp_clock);
	      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      setSize(1000,600);
	      setLocation(100,100);
	      setResizable(false);
	      setVisible(true);
	      Thread ClockRun=new Thread(jp_clock);
	      ClockRun.start();
	   }
	   public static void main(String[] args) {
	      new MainFram();
	   }
	}

4、运行结果

运行结果如下:


Eclipse工程见http://download.csdn.net/detail/csdn86868686888/9741047



猜你喜欢

转载自blog.csdn.net/csdn86868686888/article/details/54612139
今日推荐