如果我删除final,则在使用日历变量时会出错,而使用最终时间时不会动态更改
final Calendar cal= new GregorianCalendar();
Thread clock= new Thread(){
public void run(){
for (;;) {
int am=cal.get(Calendar.AM_PM);
int hr=cal.get(Calendar.HOUR);
int min=cal.get(Calendar.MINUTE);
int sec=cal.get(Calendar.SECOND);
if (am==0) {
jtime_Label.setText(""+hr+":"+min+":"+sec+" AM");
}else
{
jtime_Label.setText(""+hr+":"+min+":"+sec+" PM");
}
int day=cal.get(Calendar.DAY_OF_MONTH);
int mon=cal.get(Calendar.MONTH);
int year=cal.get(Calendar.YEAR);
date_label.setText(""+day+"-"+(mon+1)+"-"+year);
}
}
};
clock.start();
答案 0 :(得分:1)
如果我删除final,则在使用日历变量时会出错!!
这并不奇怪,它会给出错误,因为JLS指定了
但是,本地类只能访问本地变量 宣布最终
正如Java Docs所说
public GregorianCalendar() //---> Default constructor
使用当前时间构造默认的GregorianCalendar 默认时区使用默认语言环境
所以它并不意味着如果您要在10分钟后或20分钟后使用此日历对象,它将更改时间,它将保持相同的时间创建对象
如果你想创建一个计时器,那么JTimer可能会帮助你,但这不是正确的方法!!
答案 1 :(得分:0)
您已经创建了一个GregorianCalendar对象,该对象可以创建创建时的当前时间。
在处理从中读取时间时,您不会更改该时间 您需要在处理过程中更改日历校准的时间。
我建议添加
cal.setTime(new Date());
或
cal.setTimeInMillis(System.currentTimeMillis());
在你的线程内循环。
类似这样的事情
final Calendar cal= new GregorianCalendar();
Thread clock= new Thread(){
public void run(){
for (;;) {
//// add this line
cal.setTimeInMillis(System.currentTimeMillis());
/////
int am=cal.get(Calendar.AM_PM);
int hr=cal.get(Calendar.HOUR);
int min=cal.get(Calendar.MINUTE);
int sec=cal.get(Calendar.SECOND);
if (am==0) {
jtime_Label.setText(""+hr+":"+min+":"+sec+" AM");
} else {
jtime_Label.setText(""+hr+":"+min+":"+sec+" PM");
}
int day=cal.get(Calendar.DAY_OF_MONTH);
int mon=cal.get(Calendar.MONTH);
int year=cal.get(Calendar.YEAR);
date_label.setText(""+day+"-"+(mon+1)+"-"+year);
}
}
};
clock.start();