倒计时java等价物

倒计时java等价物,java,swing,timer,countdown,Java,Swing,Timer,Countdown,我正在制作一个使用Twitter API的应用程序。我可以在180次API调用后达到API限制,当我达到该限制时,我想做的是启动一个计时器,该计时器将每1秒更新一次倒计时(jLabel),最重要的是计时器将在一定的X秒后完成(取自API调用) Android CountDownTimer类是否有桌面Java替代方案 我知道我能做到,但这似乎不合适: time.scheduleAtFixedRate(new TimerTask() { long startTime = System.cur

我正在制作一个使用Twitter API的应用程序。我可以在180次API调用后达到API限制,当我达到该限制时,我想做的是启动一个计时器,该计时器将每1秒更新一次倒计时(jLabel),最重要的是计时器将在一定的X秒后完成(取自API调用)

Android CountDownTimer类是否有桌面Java替代方案

我知道我能做到,但这似乎不合适:

time.scheduleAtFixedRate(new TimerTask() {
    long startTime = System.currentTimeMillis();
    @Override
    public void run() {
        if (System.currentTimeMillis() - startTime > X_SECONDS_HERE * 1000) {
            cancel();
        } else {
            // Update GUI countdown here
        }
}
另一种选择是将SwingWorker与Thread.sleep()一起使用。这些是唯一的选择吗?

Java文档有一个类似的使用计时器,因此您的代码看起来几乎正确:

final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    int i = Integer.parseInt(args[0]);
    public void run() {
        System.out.println(i--);
        if (i< 0)
            timer.cancel();
    }
}, 0, 1000);
final Timer=新定时器();
timer.scheduleAtFixedRate(新TimerTask(){
inti=Integer.parseInt(args[0]);
公开募捐{
系统输出println(i--);
if(i<0)
timer.cancel();
}
}, 0, 1000);
Java文档有一个类似的使用计时器,因此您的代码看起来几乎正确:

final Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    int i = Integer.parseInt(args[0]);
    public void run() {
        System.out.println(i--);
        if (i< 0)
            timer.cancel();
    }
}, 0, 1000);
final Timer=新定时器();
timer.scheduleAtFixedRate(新TimerTask(){
inti=Integer.parseInt(args[0]);
公开募捐{
系统输出println(i--);
if(i<0)
timer.cancel();
}
}, 0, 1000);

这已经是正确的,但您需要额外的参数,例如:

time.scheduleAtFixedRate(new TimerTask() {
    long startTime = System.currentTimeMillis();
    @Override
    public void run() {
        if (System.currentTimeMillis() - startTime > X_SECONDS_HERE * 1000) {
            cancel();
        } else {
            // Update GUI countdown here
        }
}}, 1000,2000);

1000表示执行前的延迟
1000毫秒
s,2000任务将每隔
2000毫秒重复一次

这已经是正确的,但您需要额外的参数,例如:

time.scheduleAtFixedRate(new TimerTask() {
    long startTime = System.currentTimeMillis();
    @Override
    public void run() {
        if (System.currentTimeMillis() - startTime > X_SECONDS_HERE * 1000) {
            cancel();
        } else {
            // Update GUI countdown here
        }
}}, 1000,2000);

1000表示执行前延迟
1000毫秒
s,而2000任务将每隔
2000毫秒重复一次

这是我不久前为自己做的一个返回方法。它需要Java5 我相信是的。糟糕的是,若将长时间以毫秒为单位,它将返回一个格式完美、易于阅读的字符串,请尝试:

public static String getTime(long time) {
    long timeToEdit = time;
    String textToDraw = "";
    if (TimeUnit.MILLISECONDS.toMinutes(time) >= 10) {
        textToDraw = textToDraw + TimeUnit.MILLISECONDS.toMinutes(time);
    } else {
        textToDraw = textToDraw + "0" + TimeUnit.MILLISECONDS.toMinutes(time);
    }
    timeToEdit -= TimeUnit.MINUTES.toMillis(TimeUnit.MILLISECONDS.toMinutes(timeToEdit));
    if (TimeUnit.MILLISECONDS.toSeconds(timeToEdit) >= 10) {
        textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
    } else {
        textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
    }
    timeToEdit -= TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(timeToEdit));
    if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 100) {
        textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    } else if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 10) {
        textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    } else {
        textToDraw = textToDraw + ":00" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    }
    return textToDraw;
}

很抱歉代码格式很难看,我在手机上,很难让t看起来好看,希望有人会编辑它。

这是我不久前为自己制作的一个返回方法。它需要Java5 我相信是的。糟糕的是,若将长时间以毫秒为单位,它将返回一个格式完美、易于阅读的字符串,请尝试:

public static String getTime(long time) {
    long timeToEdit = time;
    String textToDraw = "";
    if (TimeUnit.MILLISECONDS.toMinutes(time) >= 10) {
        textToDraw = textToDraw + TimeUnit.MILLISECONDS.toMinutes(time);
    } else {
        textToDraw = textToDraw + "0" + TimeUnit.MILLISECONDS.toMinutes(time);
    }
    timeToEdit -= TimeUnit.MINUTES.toMillis(TimeUnit.MILLISECONDS.toMinutes(timeToEdit));
    if (TimeUnit.MILLISECONDS.toSeconds(timeToEdit) >= 10) {
        textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
    } else {
        textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toSeconds(timeToEdit);
    }
    timeToEdit -= TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(timeToEdit));
    if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 100) {
        textToDraw = textToDraw + ":" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    } else if (TimeUnit.MILLISECONDS.toMillis(timeToEdit) >= 10) {
        textToDraw = textToDraw + ":0" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    } else {
        textToDraw = textToDraw + ":00" + TimeUnit.MILLISECONDS.toMillis(timeToEdit);
    }
    return textToDraw;
}
很抱歉,我是在移动设备上,很难让t看起来好看,希望有人会编辑它。

(正如@AndrewThompson指出的:)对于Swing,您通常希望使用一个而不是java.util.Timer或TimerTask。原因是Swing是一个单线程框架,在这个框架中,对UI(在您的例子中是标签)的所有更新都应该在上进行。使用Swing定时器,可通过作用于EDT的
ActionListener
进行重复调用

定时器的基本结构是:

Timer(int delay, ActionListener listener)
其中,
delay
是初始和事件之间延迟的毫秒,侦听器在
actionPerformed
方法中保留回调功能。所以你有点像

Timer timer = new Timer(1000, new ActionListener(){
    private int count = 100;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (count == 0) {
            ((Timer)e.getSource).stop();
        } else {
            // decrement the count and set the text for the label
        }
    }
});
// start the timer with a call to timer.start()
使用上述代码,对
actionPerformed
的调用将每100毫秒发生一次。因此,无论您希望发生什么重复操作,都要将代码放在那里

资源:

(正如@AndrewThompson指出的:)对于Swing,您通常希望使用,而不是java.util.Timer或TimerTask。原因是Swing是一个单线程框架,在这个框架中,对UI(在您的例子中是标签)的所有更新都应该在上进行。使用Swing定时器,可通过作用于EDT的
ActionListener
进行重复调用

定时器的基本结构是:

Timer(int delay, ActionListener listener)
其中,
delay
是初始和事件之间延迟的毫秒,侦听器在
actionPerformed
方法中保留回调功能。所以你有点像

Timer timer = new Timer(1000, new ActionListener(){
    private int count = 100;

    @Override
    public void actionPerformed(ActionEvent e) {
        if (count == 0) {
            ((Timer)e.getSource).stop();
        } else {
            // decrement the count and set the text for the label
        }
    }
});
// start the timer with a call to timer.start()
使用上述代码,对
actionPerformed
的调用将每100毫秒发生一次。因此,无论您希望发生什么重复操作,都要将代码放在那里

资源:


如果更新
JLabel
,请使用Swing
计时器
,而不是
TimerTask
java.util.Timer
。如果更新
JLabel
,使用Swing
Timer
而不是
TimerTask
java.util.Timer
。我想这是最后的唯一方法。当然,除非我尝试创建一个计时器子类,我可以稍后尝试。我想这是最后的唯一方法。当然,除非我尝试创建一个计时器子类,我可以稍后尝试。噢,对了我以为你想抽时间,对不起,我以为你想抽时间,对不起