在for循环之外实例化日历对象代码不起作用

时间:2013-07-12 06:31:21

标签: java

无法每秒更新时间

import java.awt.*;
import java.applet.*;
import java.util.*;
public class AppletClock extends Applet{

    Calendar calendar; 
    Thread changeTime = null;
    Thread changeBgColor = null;
    String currentTime;
    Color randomColor;
    Font font = new Font("Arial",Font.BOLD+Font.ITALIC,80);

    public void init(){     
        setBackground(Color.black);
        setForeground(Color.WHITE);     

        changeTime = new Thread(new Runnable(){

            public void run(){              
                for(;;){                    
                    calendar = Calendar.getInstance();/*When I Instantiate calendar object outside of for loop this code doesnot work and the time didnt gets updated every second Its because of this factory method or something else*/
                    currentTime = calendar.get(Calendar.HOUR) +":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND);

                    try{

                        Thread.sleep(1000);

                    }
                    catch(Exception e){                     
                        System.out.println(e);                      
                    }
                    repaint();                  
                }               
            }
        });
        changeTime.start();

        changeBgColor = new Thread(new Runnable(){

            public void run(){              
                for(;;){                    
                    Random random = new Random();
                    int red = random.nextInt(255);
                    int green = random.nextInt(255);
                    int blue = random.nextInt(255);
                    randomColor = new Color(red,green,blue);

                    try{

                        Thread.sleep(1000);

                    }
                    catch(Exception e){                     
                        System.out.println(e);                      
                    }
                    repaint();                  
                }               
            }
        });
        changeBgColor.start();      
    }

    public void paint(Graphics g){      
        setBackground(randomColor);

        g.setFont(font);
        g.drawString(currentTime,80,120);       
    }
}
/*      
        <APPLET CODE = "AppletClock.class" WIDTH = 500 HEIGHT = 200></APPLET>       
        */

当我在calendar循环之外实例化for个对象时,此代码不起作用,并且时间不会每秒更新一次。 因为这种工厂方法或其他原因

5 个答案:

答案 0 :(得分:6)

创建日历实例时,它会使用当前时间设置时间,因此如果您在2013年创建实例并在2014年访问同一个实例而不更新它,它仍将保留创建时间

如果您想在每次只设置当前毫秒时更新实例

calendar.setTime(System.currentTimeInMillis());

答案 1 :(得分:3)

日历代表一些固定时间。因此,如果您在循环之外实例化它一次,它将始终表示相同的时间,除非您在循环中更新它,例如使用

calendar.setTime(new Date());

calendar.setTimeInMillis(System.currentTimeMillis());

那就是说,鉴于你只需要这个循环中的日历,我不明白为什么你不会保留这个解决方案,并将它声明为局部变量,而不是将其声明为一个字段。

答案 2 :(得分:2)

当您调用calendar = Calendar.getInstance();时设置时间当您在循环外执行此操作时,只设置一次并且不再更改。

另外,您应该考虑使用ScheduledExecutorService而不是两个线程。它更容易处理,你只需要一个线程。

答案 3 :(得分:1)

它与您实例化它的位置无关。它就像Date,它保存了实例化它的那一刻的静态时间。

答案 4 :(得分:0)

我不确定你为什么要打扰......

您可以提供自定义DateFormat

public static final DateFormat TIME_FORMAT = new SimpleDateFormat("h:M:s");
private Date currentTime;

然后在你的帖子中......

public void run(){
    for(;;){
        currentTime = new Date();
        try{
            Thread.sleep(1000);
        }
        catch(Exception e){
            System.out.println(e);
        }
        repaint();
    }
}

然后在你画画方法......

public void paint(Graphics g){
    setBackground(randomColor);
    g.setFont(font);
    g.drawString(TIME_FORMAT.format(currentTime),80,120);
}

但那只是我......