|  | 
				
					
	
		
		
		     昨天网上看到别人blog里面写的自己做的万年历不错,down下来看看,发现有些地方不妥。      1。在java中获取指定年月的天数居然还用闰年来判断,感觉这个人java肯定用的不精。GregorianCalendar类里面有个方法      isLeapYear(int year)           确定给定的年份是否为闰年。   用这个不就ok么?还像在c中那样做判断,能不能被4整除,被4整除不被100整除的。。。。    获取指定年月的天数
  Date date = new Date(year_log, month_log + 1, 1); // now 
  Calendar cal = Calendar.getInstance(); 
  cal.setTime(date); 
  cal.add(Calendar.MONTH, -1); // 前个月 
  month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天
  2。对java中的ActionEvent不熟,不知道JComboBox等什么时候应该触发什么event。   3。对线程理解不好。  我把改进后的java代码贴上来,大家看看,里面肯定还有不足之处。 主类:MainFrame
  package clock; 
  
   /** *//** 
  * MainFrame.java 
  * Summary 万年历主类 
  * Created on 
  * @author 
  * remark 如有改动请发一份代码给我,邮箱wsh.grxx@163.com 
  */ 
  
  import java.awt.BorderLayout; 
  import java.awt.Color; 
  import java.awt.GridLayout; 
  import java.awt.Toolkit; 
  import java.awt.event.ActionEvent; 
  import java.awt.event.ActionListener; 
  import java.sql.Date; 
  import java.util.Calendar; 
  
  import javax.swing.JComboBox; 
  import javax.swing.JFrame; 
  import javax.swing.JLabel; 
  import javax.swing.JPanel; 
  
  
   class MainFrame extends JFrame  { 
   /** *//** 
  * 
  */ 
  private static final long serialVersionUID = 1L; 
  JPanel panel = new JPanel(new BorderLayout()); 
  JPanel panel1 = new JPanel(); 
  JPanel panel2 = new JPanel(new GridLayout(7, 7)); 
  JPanel panel3 = new JPanel(); 
  JLabel[] label = new JLabel[49]; 
  JLabel y_label = new JLabel("年份"); 
  JLabel m_label = new JLabel("月份"); 
  JComboBox com1 = new JComboBox(); 
  JComboBox com2 = new JComboBox(); 
  int re_year, re_month; 
  int x_size, y_size; 
  String year_num; 
  Calendar now = Calendar.getInstance(); // 实例化Calendar 
  
   MainFrame()  { 
  super("万年历"); 
  setSize(300, 350); 
  x_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth()); 
  y_size = (int) (Toolkit.getDefaultToolkit().getScreenSize().getHeight()); 
  setLocation((x_size - 300) / 2, (y_size - 350) / 2); 
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  panel1.add(y_label); 
  panel1.add(com1); 
  panel1.add(m_label); 
  panel1.add(com2); 
   for (int i = 0; i < 49; i++)  { 
  label[i] = new JLabel("", JLabel.CENTER);// 将显示的字符设置为居中 
  panel2.add(label[i]); 
  } 
  panel3.add(new Clock(this)); 
  panel.add(panel1, BorderLayout.NORTH); 
  panel.add(panel2, BorderLayout.CENTER); 
  panel.add(panel3, BorderLayout.SOUTH); 
  panel.setBackground(Color.white); 
  panel1.setBackground(Color.white); 
  panel2.setBackground(Color.white); 
  panel3.setBackground(Color.white); 
  Init(); 
  com1.addActionListener(new ClockAction()); 
  com2.addActionListener(new ClockAction()); 
  
  setContentPane(panel); 
  setVisible(true); 
  setResizable(false); 
  } 
  
   class ClockAction implements ActionListener  { 
   public void actionPerformed(ActionEvent arg0)  { 
  int c_year, c_month, c_week; 
  c_year = Integer.parseInt(com1.getSelectedItem().toString()); // 得到当前所选年份 
  c_month = Integer.parseInt(com2.getSelectedItem().toString()) - 1; // 得到当前月份,并减1,计算机中的月为0-11 
  c_week = use(c_year, c_month); // 调用函数use,得到星期几 
  Resetday(c_week, c_year, c_month); // 调用函数Resetday 
  } 
  } 
   
   public void Init()  { 
  int year, month_num, first_day_num; 
   String log[] =  { "日", "一", "二", "三", "四", "五", "六" }; 
   for (int i = 0; i < 7; i++)  { 
  label[i].setText(log[i]); 
  } 
   for (int i = 0; i < 49; i = i + 7)  { 
  label[i].setForeground(Color.red); // 将星期日的日期设置为红色 
  } 
   for (int i = 6; i < 49; i = i + 7)  { 
  label[i].setForeground(Color.green);// 将星期六的日期设置为绿色 
  } 
   for (int i = 1; i < 10000; i++)  { 
  com1.addItem("" + i); 
  } 
   for (int i = 1; i < 13; i++)  { 
  com2.addItem("" + i); 
  } 
  month_num = (int) (now.get(Calendar.MONTH)); // 得到当前时间的月份 
  year = (int) (now.get(Calendar.YEAR)); // 得到当前时间的年份 
  com1.setSelectedIndex(year - 1); // 设置下拉列表显示为当前年 
  com2.setSelectedIndex(month_num); // 设置下拉列表显示为当前月 
  first_day_num = use(year, month_num); 
  Resetday(first_day_num, year, month_num); 
  } 
  
   public int use(int reyear, int remonth)  { 
  int week_num; 
  now.set(reyear, remonth, 1); // 设置时间为所要查询的年月的第一天 
  week_num = (int) (now.get(Calendar.DAY_OF_WEEK));// 得到第一天的星期 
  return week_num; 
  } 
  
  @SuppressWarnings("deprecation") 
   public void Resetday(int week_log, int year_log, int month_log)  { 
  int month_day_score; // 存储月份的天数 
  int count; 
  month_day_score = 0; 
  count = 1; 
  
  Date date = new Date(year_log, month_log + 1, 1); // now 
  Calendar cal = Calendar.getInstance(); 
  cal.setTime(date); 
  cal.add(Calendar.MONTH, -1); // 前个月 
  month_day_score = cal.getActualMaximum(Calendar.DAY_OF_MONTH);// 最后一天 
  
   for (int i = 7; i < 49; i++)  { // 初始化标签 
  label[i].setText(""); 
  } 
  week_log = week_log + 6; // 将星期数加6,使显示正确 
  month_day_score = month_day_score + week_log; 
   for (int i = week_log; i < month_day_score; i++, count++)  { 
  label[i].setText(count + ""); 
  } 
  } 
  
   public static void main(String[] args)  { 
  JFrame.setDefaultLookAndFeelDecorated(true); 
  new MainFrame(); 
  } 
  } 
 
显示时间的类:Clock
  package clock; 
  
   /** *//** 
  * Clock.java 
  * Summary 数字时间显示 
  * Created on 
  * @author 
  * remark 
  */ 
  
  import java.awt.Canvas; 
  import java.awt.Color; 
  import java.awt.Font; 
  import java.awt.Graphics; 
  import java.text.SimpleDateFormat; 
  import java.util.Calendar; 
   class Clock extends Canvas implements Runnable  { 
   /** *//** 
  * 
  */ 
  private static final long serialVersionUID = 3660124045489727166L; 
  MainFrame mf; 
  Thread t; 
  String time; 
   public Clock(MainFrame mf)  { 
  this.mf=mf; 
  setSize(280,40); 
  setBackground(Color.white); 
  t=new Thread(this);                //实例化线程 
  t.start();                        //调用线程 
  } 
   public void run()  { 
   while(true)  { 
   try  { 
  Thread.sleep(1000);                    //休眠1秒钟 
   }catch(InterruptedException e)  { 
  System.out.println("异常"); 
  } 
  this.repaint(100); 
  } 
  } 
   public void paint(Graphics g)  { 
  Font f=new Font("宋体",Font.BOLD,16); 
  SimpleDateFormat SDF=new SimpleDateFormat("yyyy'年'MM'月'dd'日'HH:mm:ss");//格式化时间显示类型 
  Calendar now=Calendar.getInstance(); 
  time=SDF.format(now.getTime());        //得到当前日期和时间 
  g.setFont(f); 
  g.setColor(Color.orange); 
  g.drawString(time,45,25); 
  } 
  }   |