我这里有一些代码可以像我想要的那样工作。它只是以秒为单位倒计时到我在代码中确定的特定日期。我正在使用Thread.currentThread().sleep(1000);
当前时间更新 JLabel,直到日期。问题是 JLabel 不会像预期的那样每秒刷新一次。有时它每 2 秒更新一次,有时它需要整整 10 秒才能更新。我相信这与我如何调用我的方法有关,但我不太确定如何使它更有效率。
这是调用该方法以更新 Thread 内的 JLabel 的 main 方法:
public static void main(String args[])
{
initUI();
try
{
while(true)
{
Thread.currentThread().sleep(1000);
getTime();
}
} catch(Exception e){System.out.println("An error has occured...");}
}
这里是main方法调用的方法调用的方法。此方法最终将秒剩余变量发送到第三种方法:
public static void getTime()
{
Calendar c = Calendar.getInstance();
// Gets abstract current time in ms
long now = c.getTimeInMillis();
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
// Gets current time in ms
long msPassed = now - c.getTimeInMillis();
// There are 86,400,000 milliseconds in a day
// Gets the seconds remaining in the day
long secRemaining = (86400000 - msPassed) / 1000;
//-----------------------------------------------------//
// Creates a new calendar for today
Calendar cal = Calendar.getInstance();
int currentDayOfYear = cal.get(Calendar.DAY_OF_YEAR);
// Creates a calendar for November 20th, 2016
Calendar aniv = new GregorianCalendar(2016,10,20);
aniv.set(Calendar.MONTH, 10);
aniv.set(Calendar.DAY_OF_MONTH, 20);
int aniversary = aniv.get(Calendar.DAY_OF_YEAR);
remaining = ((aniversary - currentDayOfYear) * 24 * 60 * 60) + secRemaining;
setTextOnScreen(remaining);
}
最后,这是重写 JLabel 的方法(由上面的方法调用):
public static void setTextOnScreen(long num)
{
text.setForeground(Color.GREEN);
text.setLocation((int)width/2 - 150, 50);
text.setFont(new Font("Monospaced", Font.BOLD, 48));
text.setSize(300,150);
text.setText("" + num);
panel.add(text);
}
我不包括其余代码,因为它应该是无关紧要的,但是如果您也想看到它,请告诉我。