小编典典

如何在java.util.Timer中剩余时间?

java

如何获取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));

阅读 467

收藏
2020-11-30

共1个答案

小编典典

您将需要第二个计时器以特定间隔刷新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而不是使用它自己的EDT
Thread,因此您不需要使用来同步对Swing组件的调用SwingUtilities.invokeLater()

2020-11-30