1. 用户输入一个月份,程序输出这个月的月历,每星期一行,星期天开始,星期六结束。
2. 用户输入一个日期,程序显示这个日期当天是星期几。
3. 用户输入两个日期,程序计算这两个日期相差的天数。
设计思路:
日历程序中需要使用日历类的实例,生成一个Calendar实例:Calendar c=GregorianCalendar.getInstance();将12个月的天数保存在一个数组中,以便程序中方便的调用各个月的天数int []day={31,28,31,30,31,30,31,31,30,31,30,31};同样的也将一个星期的名称也保存于一个数组中String []weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};用户输入年月日后通过set()函数赋值给Calendar对象的:YEAR,MONTH,DATE字段
c.set(Calendar.YEAR, temp);
c.set(Calendar.MONTH, temp);
c.set(Calendar.DATE, temp);在要求显示月历时是将DATE设置为1,表示从1号开始显示。System.out.println("------------"+year+"年"+(month+1)+"月------------");
      System.out.println("SUN  MON  TUE  WED  THU  FRI  SAT");
      c.set(Calendar.DATE,1);
      int first=c.get(Calendar.DAY_OF_WEEK);
      int i;
      for(i=1;i<first;i++)   System.out.print("     ");
      for(i=1;i<=day[month-1];i++){
      if(i<10)   System.out.print(" ");
      System.out.print(" "+i);
      System.out.print("  ");
      if(first++%7==0)   System.out.println();
      }DAY_OF_WEEK表示的是一个星期的第几天,SUNDAY是第一天,MONDAY是第二天,以后的以此类推,要求根据需要对应到数组相应项weeks[c.get(Calendar.DAY_OF_WEEK)-1]获得一个Calendar对象实例并设置值后,需要转换成一个Date类,用以计算相差的天数。Date d2=c.getTime();
long daterange=Math.abs(d1.getTime()-d2.getTime());  //getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
long time=1000*3600*24;     //一天的微秒数
 System.out.println("两个日期相隔"+daterange/time+"天");摆脱高手给出答案,谢谢啦!!!!!!!!!!!!!!!!!!!!!!!!!!

解决方案 »

  1.   

    都给出这么详细的说明了,程序写起来就简单多了:
    import java.util.*;public class AppCalendar{
    static  int[] day={31,28,31,30,31,30,31,31,30,31,30,31};
    static String[] weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};  
    public static void main(String[] args){
    try{
    Scanner input=new Scanner(System.in);
    System.out.println("请入一个年份和一个月份:");
    int year=input.nextInt();
    int month=input.nextInt();
    monthCalendar(year,month-1);
    System.out.println("请输入一个年份,一个月份,一个日:");
    year=input.nextInt();
    month=input.nextInt();
    int d=input.nextInt();
    Calendar c1=GregorianCalendar.getInstance(); 
    c1.set(Calendar.YEAR, year);   
    c1.set(Calendar.MONTH, month-1); 
    c1.set(Calendar.DATE,d);
    System.out.println("你输入的日期是"+getWeekName(c1));
    System.out.println("请再输入一个年份,一个月份,一个日:");
    year=input.nextInt();
    month=input.nextInt();
    d=input.nextInt();
    Calendar c2=GregorianCalendar.getInstance(); 
    c2.set(Calendar.YEAR, year);   
    c2.set(Calendar.MONTH, month-1); 
    c2.set(Calendar.DATE,d);
    System.out.println("你输入的日期是"+getWeekName(c2));
    getDays(c1,c2);
    }catch(Exception e){
    e.printStackTrace();
    }


    }
    public static void monthCalendar(int year,int month){
    Calendar c=GregorianCalendar.getInstance(); 
    System.out.println("------------"+year+"年"+(month+1)+"月------------"); 
    System.out.println("SUN  MON  TUE  WED  THU  FRI  SAT");
    c.set(Calendar.YEAR, year);   
    c.set(Calendar.MONTH, month); 
    c.set(Calendar.DATE,1);
    int first=c.get(Calendar.DAY_OF_WEEK);
    int i; 
    for(i=1;i <first;i++)  System.out.print("    ");
    System.out.print(" ");
    for(i=1;i <=day[month-1];i++){
    if(i <10)  System.out.print(" ");
    System.out.print(" "+i); 
    System.out.print("  "); 
    if(first++%7==0)  System.out.println(); 

    System.out.println("");
    }
    public static String getWeekName(Calendar c){
    return weeks[c.get(Calendar.DAY_OF_WEEK)-1] ;
    }
    public static long getDays(Calendar c1,Calendar c2){
    Date d1=c1.getTime();
    Date d2=c2.getTime(); 
    long daterange=Math.abs(d1.getTime()-d2.getTime()); 
    //getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date对象表示的毫秒数。
    long time=1000*3600*24;    //一天的微秒数 
    System.out.println("两个日期相隔"+daterange/time+"天");
    return daterange/time;  }

    }
      

  2.   

    动画的设计
    设计要求:
    1.使用线程实现基本的动画显示。
    2.在基本实现动画的基础上重载update()的方法改善动画质量。
    3.使用双缓冲方法减少帧之间的闪烁,改善动画质量。
    设计思路:
    动画的本质就是运动的图形,即在屏幕上高速的显示一系列图像,没帧图像相似但又有所不同,从而造成动画的感觉。
    Java中支持的图形格式只有GIF和JPEG两种文件格式。
    Java中关于图形的处理的主要方法有:java.applet包中的Applet类中的getImage(URL url)和getImage(URL url,String name);java.awt包中的Graphics类中的几个drawImage()方法,程序通过继承Runnable接口来实现多线程,在构造函数中定义一组图像Image数组对象,利用Toolkit类(Toolkit将各种组件绑定到特定本机工具包实现)的getDefaultToolkit()方法获得系统默认的工具包对象defaultTk,然后设置一个MediaTracker类对象tracker,用于对本机上的多媒体资料进行处理。用一个for循环利用defaultTk的getImage()方法将图像添加进图像数组,最后分别tracker的addImage()方法媒体跟踪器正在跟踪的图像列表添加一个图像和waitForID()方法加载由此媒体跟踪器跟踪且具有指定标识符的所有图像,创为本程序建一个线程,并启动。spin=new Image[totalImages];
    Toolkit defaultTk=Toolkit.getDefaultToolkit();     
    MediaTracker tracker=new MediaTracker(this);  。 
            for(int i=0;i<totalImages;i++){
             spin[i]=defaultTk.getImage((i+1)+".gif");
             tracker.addImage(spin[i], i);   
             try{
             tracker.waitForID(i);   
             }
             catch(InterruptedException e){
             e.printStackTrace();
             }
            }
    x=0;
    animator=new Thread(this);
    animator.start();实现线程的run方法,定义线程等待时间while(Thread.currentThread()==animator){
    repaint();
    try{
    Thread.sleep(delay);
    }
    catch(InterruptedException e){
             e.printStackTrace();
             }调用paint(Graphics g)方法循环更新显示图片g.drawImage(spin[currrentImage],10+x,30,this);
    x=(x+5)%400;
    currrentImage=++currrentImage%totalImages;对于用重载uodate()方法的办法改善图像动画质量,update()方法提供了可以不必先清除当前图像而更新一个Graphics对象的能力,这就允许将连续图像作为当前所显示图像的边缘增量来显示。
    当AWT接收到一个重绘(repaint)请求时,程序想调用update()清除背景,而update()又会调用paint()方法。重载update()方法避免每次重绘时将整个区域清除,即背景不再自动清除,这样可以有效避免闪烁。public void update(Graphics g){
         g.setColor(Color.yellow);
    g.fillRect(x1, 30, spin[0].getWidth(this), spin[0].getHeight(this));
         paint(g);
    }对于双缓冲的方法,这个技术主要原理是创建一个后台图像,将一帧画如图像,然后调用drawImage()将整个图像一次画到屏幕上去。使用双缓冲方法应重载update()方法。if(offscreen==null){
         offscreen=createImage(getSize().width,getSize().height);
    Graphics og=offscreen.getGraphics();   // 创建供绘制闭屏图(off-screen image)使用的图形上下文。
    og.setClip(0, 0, getSize().width, getSize().height);
    og.setColor(Color.yellow);
    og.fillRect(x1, 30, pin[0].getWidth(this),spin[0].getHeight(this));
    og.drawImage(spin[currrentImage],10+x,30,this);
    super.paint(og);
    g.drawImage(offscreen,0,0,null);
    x1=x;
    x=(x+5)%400;
    currrentImage=++currrentImage%totalImages;
    希望高手指教~~我是初学者~我会加分的~
      

  3.   

    日历的格式不太对,改了一下.另外还有一个小BUG,就是闰年.都改了.你再看看对不对.
    import java.util.*;public class AppCalendar{
        static  int[] day={31,28,31,30,31,30,31,31,30,31,30,31};
        static String[] weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};  
        public static void main(String[] args){
            try{
                Scanner input=new Scanner(System.in);
                System.out.println("请入一个年份和一个月份:");
                int year=input.nextInt();
                int month=input.nextInt();
                monthCalendar(year,month-1);
                System.out.println("请输入一个年份,一个月份,一个日:");
                year=input.nextInt();
                month=input.nextInt();
                int d=input.nextInt();
                Calendar c1=GregorianCalendar.getInstance(); 
                c1.set(Calendar.YEAR, year);   
                c1.set(Calendar.MONTH, month-1); 
                c1.set(Calendar.DATE,d);
                System.out.println("你输入的日期是"+getWeekName(c1));
                System.out.println("请再输入一个年份,一个月份,一个日:");
                year=input.nextInt();
                month=input.nextInt();
                d=input.nextInt();
                Calendar c2=GregorianCalendar.getInstance(); 
                c2.set(Calendar.YEAR, year);   
                c2.set(Calendar.MONTH, month-1); 
                c2.set(Calendar.DATE,d);
                System.out.println("你输入的日期是"+getWeekName(c2));
                getDays(c1,c2);
            }catch(Exception e){
                e.printStackTrace();
            }
            
            
        }
        public static void monthCalendar(int year,int month){
            Calendar c=GregorianCalendar.getInstance(); 
            boolean isLeapYear=false;
            if(year%400==0||year%4==0&&year%100!=0){ 
               isLeapYear=true;
               day[1]=29;
            }
            System.out.println("------------"+year+"年"+(month+1)+"月------------"); 
            System.out.println("SUN  MON  TUE  WED  THU  FRI  SAT");
            c.set(Calendar.YEAR, year);   
            c.set(Calendar.MONTH, month); 
            c.set(Calendar.DATE,1);
            int first=c.get(Calendar.DAY_OF_WEEK);
            int i;
            //System.out.print(" "); 
            for(i=1;i <first;i++)  System.out.print("     ");
            for(i=1;i <=day[month];i++){
                if(i <10)  System.out.print(" ");
                System.out.print(" "+i); 
                System.out.print("  "); 
                if(first++%7==0)  System.out.println(); 
            } 
            System.out.println("");
            if(isLeapYear) day[1]=28;         //改回来,因为day是static数组.
        }
        public static String getWeekName(Calendar c){
            return weeks[c.get(Calendar.DAY_OF_WEEK)-1] ;
        }
        public static long getDays(Calendar c1,Calendar c2){
            Date d1=c1.getTime();
            Date d2=c2.getTime(); 
            long daterange=Math.abs(d1.getTime()-d2.getTime()); 
            //getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date对象表示的毫秒数。
            long time=1000*3600*24;    //一天的微秒数 
            System.out.println("两个日期相隔"+daterange/time+"天");
            return daterange/time;     }
        
    }
      

  4.   

    这个日历的怎么弄成动画啊,又不是时钟,
    用applet给你搞了个,看能不能用吧
    只做了第一个功能,后面两个太简单就省了package test;import java.applet.Applet;
    import java.awt.Graphics;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.util.Calendar;
    import javax.swing.JComboBox;
    import javax.swing.JLabel;
    import javax.swing.JPanel;public class Clock extends Applet {
    private static final String[] weeks={"星期天","星期一","星期二","星期三","星期四","星期五","星期六"}; 

    private JComboBox yearCbox;
    private JComboBox monthCbox;
    private JComboBox dayCbox;
    private DatePanel datePanel; @Override
    public void init() {
    super.init();
    setSize(500, 500);
    setLayout(null);
    datePanel = new DatePanel();
    datePanel.setBounds(10, 50, 400, 200);
    add(datePanel);
    Calendar calendar = Calendar.getInstance();
    yearCbox = new JComboBox();
    yearCbox.setBounds(10, 0, 90, 20);
    for(int i = 0 ; i < 60 ; i ++)
    yearCbox.addItem(1970 + i);
    add(yearCbox);
    SelectChangeListener l = new SelectChangeListener();
    yearCbox.setSelectedItem(calendar.get(Calendar.YEAR));
    yearCbox.addItemListener(l);
    JLabel label = new JLabel("年");
    label.setBounds(100, 0, 15, 20);
    add(label);
    monthCbox = new JComboBox();
    monthCbox.setBounds(120, 0, 50, 20);
    for(int i = 0 ; i < 12 ; i++)
    monthCbox.addItem(1 + i);
    add(monthCbox);
    monthCbox.setSelectedItem(calendar.get(Calendar.MONTH) + 1);
    monthCbox.addItemListener(l);
    label = new JLabel("月");
    label.setBounds(175, 0, 15, 20);
    add(label);
    dayCbox = new JComboBox();
    dayCbox.setBounds(190, 0, 50, 20);
    add(dayCbox);
    label = new JLabel("日");
    label.setBounds(240, 0, 15, 20);
    add(label);
    setDate(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));
    }

    public void setDate(int year,int month,int day){
    dayCbox.removeAllItems();
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.MONTH, month);
    calendar.set(Calendar.DAY_OF_MONTH, day);
    int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    for(int i = 0 ; i < dayCount ; i ++)
    dayCbox.addItem(i + 1);
    dayCbox.setSelectedItem(calendar.get(Calendar.DAY_OF_MONTH));
    datePanel.setDate(calendar);
    datePanel.repaint();
    }

    public void paint(Graphics g){
    super.paint(g);
    }

    private class DatePanel extends JPanel{
    private Calendar date;

    public DatePanel(){
    }

    private void setDate(Calendar calendar){
    this.date = calendar;
    }

    @Override
    public void paint(Graphics g){
    super.paint(g);
    if(date != null){
    int count = weeks.length;
    for(int i = 0 ; i < count ; i++){
    g.drawString(weeks[i], i * 40, 20);
    }
    int x = 0,y = 40;
    int dayCount = date.getActualMaximum(Calendar.DAY_OF_MONTH);
    x = getXPosition(date.get(Calendar.DAY_OF_WEEK));
    for(int i = 0 ; i < dayCount ; i++){
    g.drawString(String.valueOf(i + 1), (x + i) % 7 * 40, y);
    if((x + i) % 7 == 6){
    y += 20;
    }
    }
    }
    }

    private int getXPosition(int dayOfWeek){
    int temp = dayOfWeek - Calendar.SUNDAY ;
    if(temp < 0 )
    temp += 7;
    return temp;
    }
    }

    public class SelectChangeListener implements ItemListener{ @Override
    public void itemStateChanged(ItemEvent e) {
    if(e.getStateChange() == ItemEvent.SELECTED){
    int year = Integer.parseInt(yearCbox.getSelectedItem().toString());
    int month = Integer.parseInt(monthCbox.getSelectedItem().toString()) - 1;
    setDate(year, month, 1);
    }
    }

    }
    }