???? 昨天網上看到別人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);
????}
}