冷面阎罗

低调做人&&高调做事
随笔 - 208, 文章 - 3, 评论 - 593, 引用 - 0
数据加载中……

改进java万年历,前几天看到别人写的java万年历,其中不足之处多多

     昨天网上看到别人blog里面写的自己做的万年历不错,down下来看看,发现有些地方不妥。
     1。在java中获取指定年月的天数居然还用闰年来判断,感觉这个人java肯定用的不精。GregorianCalendar类里面有个方法
      isLeapYear(int year)
          确定给定的年份是否为闰年。
  用这个不就ok么?还像在c中那样做判断,能不能被4整除,被4整除不被100整除的。。。。
   获取指定年月的天数
        Date date = new Date(year_log, month_log + 11); // 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。对线程理解不好。
11.bmp
我把改进后的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(77));
    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(
300350);
        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 + 11); // 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);
    }

}

posted on 2006-12-31 09:58 冷面阎罗 阅读(19583) 评论(13)  编辑  收藏 所属分类: java

评论

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

http://www.blogjava.net/vip01/archive/2006/12/29/90688.html
大家可以互相学习下。
看看偶年月日怎么生成的

俺的是swt板的
2006-12-31 14:16 | 关注

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

好厉害哦。加油啊。
2007-01-02 09:04 | mixianger

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

如果能加上农历的话,那就更cool了
2007-01-02 22:59 | 佚名[匿名]

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

恩 ,这个我也想过,不过到现在没发现java有这方面出来的类吧,这可是中国特色的....
2007-01-03 15:43 | 冷面阎罗

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

网上有 C# 和 java 的农历算法实现,靠java api 去实现那要等了
2007-01-03 23:11 | switch

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

加农历我已经弄好了
http://www.blogjava.net/soddabao/archive/2007/01/04/91729.html
2007-01-04 13:13 | 冷面阎罗

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多[未登录]  回复  更多评论   

Calendar里我也没有找到isLeapYear()方法,楼主是不是有误?
2007-06-19 08:44 | wzjin

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

不好意思 写错了 应该是这个GregorianCalendar类。Calendar类的一个子类。API中是这样描述这个类的
public class GregorianCalendarextends CalendarGregorianCalendar is a concrete subclass of Calendar and provides the standard calendar system used by most of the world.

GregorianCalendar is a hybrid calendar that supports both the Julian and Gregorian calendar systems with the support of a single discontinuity, which corresponds by default to the Gregorian date when the Gregorian calendar was instituted (October 15, 1582 in some countries, later in others). The cutover date may be changed by the caller by calling setGregorianChange().

Historically, in those countries which adopted the Gregorian calendar first, October 4, 1582 (Julian) was thus followed by October 15, 1582 (Gregorian). This calendar models this correctly. Before the Gregorian cutover, GregorianCalendar implements the Julian calendar. The only difference between the Gregorian and the Julian calendar is the leap year rule. The Julian calendar specifies leap years every four years, whereas the Gregorian calendar omits century years which are not divisible by 400.

GregorianCalendar implements proleptic Gregorian and Julian calendars. That is, dates are computed by extrapolating the current rules indefinitely far backward and forward in time. As a result, GregorianCalendar may be used for all years to generate meaningful and consistent results. However, dates obtained using GregorianCalendar are historically accurate only from March 1, 4 AD onward, when modern Julian calendar rules were adopted. Before this date, leap year rules were applied irregularly, and before 45 BC the Julian calendar did not even exist.

Prior to the institution of the Gregorian calendar, New Year's Day was March 25. To avoid confusion, this calendar always uses January 1. A manual adjustment may be made if desired for dates that are prior to the Gregorian changeover and which fall between January 1 and March 24.

Values calculated for the WEEK_OF_YEAR field range from 1 to 53. Week 1 for a year is the earliest seven day period starting on getFirstDayOfWeek() that contains at least getMinimalDaysInFirstWeek() days from that year. It thus depends on the values of getMinimalDaysInFirstWeek(), getFirstDayOfWeek(), and the day of the week of January 1. Weeks between week 1 of one year and week 1 of the following year are numbered sequentially from 2 to 52 or 53 (as needed).

For example, January 1, 1998 was a Thursday. If getFirstDayOfWeek() is MONDAY and getMinimalDaysInFirstWeek() is 4 (these are the values reflecting ISO 8601 and many national standards), then week 1 of 1998 starts on December 29, 1997, and ends on January 4, 1998. If, however, getFirstDayOfWeek() is SUNDAY, then week 1 of 1998 starts on January 4, 1998, and ends on January 10, 1998; the first three days of 1998 then are part of week 53 of 1997.

Values calculated for the WEEK_OF_MONTH field range from 0 to 6. Week 1 of a month (the days with WEEK_OF_MONTH = 1) is the earliest set of at least getMinimalDaysInFirstWeek() contiguous days in that month, ending on the day before getFirstDayOfWeek(). Unlike week 1 of a year, week 1 of a month may be shorter than 7 days, need not start on getFirstDayOfWeek(), and will not include days of the previous month. Days of a month before week 1 have a WEEK_OF_MONTH of 0.

For example, if getFirstDayOfWeek() is SUNDAY and getMinimalDaysInFirstWeek() is 4, then the first week of January 1998 is Sunday, January 4 through Saturday, January 10. These days have a WEEK_OF_MONTH of 1. Thursday, January 1 through Saturday, January 3 have a WEEK_OF_MONTH of 0. If getMinimalDaysInFirstWeek() is changed to 3, then January 1 through January 3 have a WEEK_OF_MONTH of 1.

The clear methods set calendar field(s) undefined. GregorianCalendar uses the following default value for each calendar field if its value is undefined. Field
Default Value

ERA
AD

YEAR
1970

MONTH
JANUARY

DAY_OF_MONTH
1

DAY_OF_WEEK
the first day of week

WEEK_OF_MONTH
0

DAY_OF_WEEK_IN_MONTH
1

AM_PM
AM

HOUR, HOUR_OF_DAY, MINUTE, SECOND, MILLISECOND
0


Default values are not applicable for the fields not listed above.

Example:

// get the supported ids for GMT-08:00 (Pacific Standard Time)
String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000);
// if no ids were returned, something is wrong. get out.
if (ids.length == 0)
System.exit(0);

// begin output
System.out.println("Current Time");

// create a Pacific Standard Time time zone
SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]);

// set up rules for daylight savings time
pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);

// create a GregorianCalendar with the Pacific Daylight time zone
// and the current date and time
Calendar calendar = new GregorianCalendar(pdt);
Date trialTime = new Date();
calendar.setTime(trialTime);

// print out a bunch of interesting things
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));

System.out.println("Current Time, with hour reset to 3");
calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override
calendar.set(Calendar.HOUR, 3);
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: "
+ calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("HOUR: " + calendar.get(Calendar.HOUR));
System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "
+ (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000))); // in hours
System.out.println("DST_OFFSET: "
+ (calendar.get(Calendar.DST_OFFSET)/(60*60*1000))); // in hours
方法是:
boolean isLeapYear(int year)
Determines if the given year is a leap year.
2007-06-19 09:06 | 冷面阎罗

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

panel3.add(new Clock(this));
这局代码我运行怎么有错误?
2007-10-24 14:25 | 人非圣贤

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

你的帖子确实有错误,竟然没有31天的月份
2007-12-30 10:57 | rili

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多[未登录]  回复  更多评论   

如果加上阴阳历转换就很棒!
2009-06-23 16:02 | java菜鸟

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

还是不懂,想请教哦
2010-05-18 16:14 | 恩恩

# re: 改进java万年历,前几天看到别人写的java万年历,其中不足之处多多  回复  更多评论   

怎么用eclipse实现主界面上的星期和日期
请教 谢谢
2012-10-22 09:47 | 梳理中

只有注册用户登录后才能发表评论。


网站导航: