如何在 java.util.Timer 中获得剩余时间?
How to get time left in a java.util.Timer?
如何获得util.Timer中的剩余时间?
我想要做的是添加一个进度条,显示剩余时间,直到计时器重新开始。
这就是我到目前为止所得到的:
int seconds = 8;
java.util.Timer timer = new Timer();
timer.schedule( new TimerTask(){
public void run(){
// Do something
// Add a progressbar that displays time left until the timer "starts over".
},0,(long) (seconds*1000));
您需要第二个计时器以特定时间间隔刷新 gui。
实现此目的的另一种方法是每秒激活一个计时器并更新 ui 中的计数。如果时间到了,请调用您的具体操作。
一个只有控制台输出的简单例子:
TimerTask task = new TimerTask()
{
int seconds = 8;
int i = 0;
@Override
public void run()
{
i++;
if(i % seconds == 0)
System.out.println("Timer action!");
else
System.out.println("Time left:" + (seconds - (i %seconds)) );
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 1000);
它的输出将是:
Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
...
然后只需用您的代码更改 System.out 即可更新进度条。请记住:java.util.Timer
启动它自己的 Thread
。 Swing 不是线程安全的,因此您需要将每个 gui 更改代码放入 SwingUtilities.invokeLater()
!
如果您没有执行任何长时间的 运行 任务,每次您的计时器达到 8 秒标记时,您可能想直接使用 javax.swing.Timer
。它使用 EDT 而不是它自己的 Thread
,因此您不需要将对 Swing 组件的调用与 SwingUtilities.invokeLater()
.
同步
另见:
javax.swing.Timer vs java.util.Timer inside of a Swing application
您需要做的就是在您的 MainActivity 中声明一个长变量 timeleft
。
long timeleft;
然后,当您创建一个新计时器时,设置 "onTick" 覆盖以在每个 "onTick" 更新 timeleft 变量(在以下示例中为 1000 毫秒)
timer = new CountDownTimer(time, 1000) {
@Override
public void onTick(long millisecondsUntilFinished) {
timeleft = millisecondsUntilFinished;
}
}
每次您需要检查剩余时间时,您的应用程序都可以访问变量 timeleft。
如何获得util.Timer中的剩余时间? 我想要做的是添加一个进度条,显示剩余时间,直到计时器重新开始。
这就是我到目前为止所得到的:
int seconds = 8;
java.util.Timer timer = new Timer();
timer.schedule( new TimerTask(){
public void run(){
// Do something
// Add a progressbar that displays time left until the timer "starts over".
},0,(long) (seconds*1000));
您需要第二个计时器以特定时间间隔刷新 gui。
实现此目的的另一种方法是每秒激活一个计时器并更新 ui 中的计数。如果时间到了,请调用您的具体操作。
一个只有控制台输出的简单例子:
TimerTask task = new TimerTask()
{
int seconds = 8;
int i = 0;
@Override
public void run()
{
i++;
if(i % seconds == 0)
System.out.println("Timer action!");
else
System.out.println("Time left:" + (seconds - (i %seconds)) );
}
};
Timer timer = new Timer();
timer.schedule(task, 0, 1000);
它的输出将是:
Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
Time left:5
Time left:4
Time left:3
Time left:2
Time left:1
Timer action!
Time left:7
Time left:6
...
然后只需用您的代码更改 System.out 即可更新进度条。请记住:java.util.Timer
启动它自己的 Thread
。 Swing 不是线程安全的,因此您需要将每个 gui 更改代码放入 SwingUtilities.invokeLater()
!
如果您没有执行任何长时间的 运行 任务,每次您的计时器达到 8 秒标记时,您可能想直接使用 javax.swing.Timer
。它使用 EDT 而不是它自己的 Thread
,因此您不需要将对 Swing 组件的调用与 SwingUtilities.invokeLater()
.
另见:
javax.swing.Timer vs java.util.Timer inside of a Swing application
您需要做的就是在您的 MainActivity 中声明一个长变量 timeleft
。
long timeleft;
然后,当您创建一个新计时器时,设置 "onTick" 覆盖以在每个 "onTick" 更新 timeleft 变量(在以下示例中为 1000 毫秒)
timer = new CountDownTimer(time, 1000) {
@Override
public void onTick(long millisecondsUntilFinished) {
timeleft = millisecondsUntilFinished;
}
}
每次您需要检查剩余时间时,您的应用程序都可以访问变量 timeleft。