Java netbeans中的时间不动态变化

Java netbeans中的时间不动态变化,java,netbeans-8,Java,Netbeans 8,若我删除final,那个么在使用日历变量时会出现错误,而在使用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);

若我删除final,那个么在使用日历变量时会出现错误,而在使用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();
如果删除final,则在使用日历变量时会出现错误

这一点也不奇怪,它会给出错误,因为JLS是这样指定的

但是,局部类只能访问 宣布最终

照我说的

使用中的当前时间构造默认的GregorianCalendar 具有默认区域设置的默认时区

因此,这并不意味着如果在10分钟后或20分钟后使用此日历对象,它将更改时间,在创建对象时,它将保持不变


如果你想创建一个计时器,那么JTimer可能会帮助你,但这不是正确的方法

您已经创建了一个GregoriaCalendar对象,该对象将在当前时间创建

在处理以从中读取时间时,您不会更改该时间 在处理过程中,您需要更改日历cal中的时间

我建议加上

cal.setTime(new Date());

在线程内的循环中

像这样的

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();

这没用。请说得更具体一点,它现在正在运行,我已经做到了,你能告诉我我们为什么要这样做的细节吗?你能更具体一点吗
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();