加快计时器?

时间:2016-03-14 22:43:56

标签: java timer countdown

当整数变小时,我试图使我当前的计数器/计时器加速。例如它就像 10 ......... 9 ........,8 ........,7 ....... 6 ...... 5 .... 4 .... 3 ... 2 .. 1。

当前代码:

    private int interval;
private Timer timer;

public void startTimer(final Player p, String seconds) {
    String secs = seconds;
    int delay = 1000;
    int period = 1000;
    timer = new Timer();
    interval = Integer.parseInt(secs);
    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            p.sendMessage("" + setInterval(p));
        }

    }, delay, period);
}

private final int setInterval(Player p) {
    if (interval == 1){ 
        timer.cancel(); 
        p.sendMessage(ChatColor.RED + "" + ChatColor.BOLD + "Countdown Finished!");
    }
    return --interval;
}

2 个答案:

答案 0 :(得分:1)

From the Java docs:

public void scheduleAtFixedRate(TimerTask task,
                   Date firstTime,
                   long period)
     

从指定时间开始,为重复的固定费率执行计划指定的任务。后续执行大约以定期间隔进行,以指定的时间段分隔。

使用此方法,您无法更改周期,因为此方法并未针对此进行设计。如果您尝试访问任务中的句点,编译器将会失败,因为期间内的任务不可见。

如果你不想绕过线程,runnables和wait()方法,并希望坚持使用Timer类中的一个方法(我假设你使用过 - 但是为了记录,< strong>如果您使用另一个可能包含文档的软件包中的方法,请将导入添加到您发布的源代码中!),请考虑使用public void schedule(TimerTask task, long delay),并将其包含在while循环中。然后,您可以更改循环内的延迟参数,并在另一个时间跨度内执行任务。

当然,你必须弄清楚当倒计时结束时如何离开while循环(一个&#34;快速和肮脏&#34;方式将使用布尔值)。但是因为你基本上&#34;重置&#34;在while循环的每次迭代中,timer.cancel()都不会为你做任何事情。它取消一次,但下一个迭代计时器只会重启任务。

答案 1 :(得分:1)

一种选择是使用javafx.animation.Timeline

例如:

import javafx.animation.Interpolator;
import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.stage.Stage;
import javafx.util.Duration;

public class CountDown extends Application {

    private static final double SPEED_UP_FACTOR = 0.15; // + 15%

    @Override
    public void start(Stage primaryStage) throws Exception {
        IntegerProperty counter = new SimpleIntegerProperty(10);
        Timeline timeline = new Timeline(
                new KeyFrame(Duration.seconds(counter.get()), new KeyValue(counter, 0))
        );
        counter.addListener((observable, oldValue, newValue) -> {
            double currentRate = timeline.getRate();
            timeline.setRate(currentRate + currentRate * SPEED_UP_FACTOR); // speed up count down
            System.out.println(newValue);
        });
        timeline.setOnFinished(event -> {
            System.out.println("CountDown Finished!");
            Platform.exit();
        });
        timeline.play();
    }

    public static void main(String[] args) {
        launch(args);
    }

}

编辑

或只是使用Thread.sleep()

public class CountDown {

    private static final double SPEED_UP_FACTOR = 0.15; // + 15%

    public static void main(String[] args) {
        CountDownTimer timer = new CountDownTimer(10, 1000);
        new Thread(timer).start();
    }

    static final class CountDownTimer implements Runnable {

        final int initialValue;
        final long intervalMillis;

        CountDownTimer(int initialValue, long intervalMillis) {
            this.initialValue = initialValue;
            this.intervalMillis = intervalMillis;
        }

        @Override
        public void run() {
            int counter = initialValue;
            double rate = 1;
            while (counter > 0) {
                sleep(Math.round(intervalMillis / rate));
                rate += rate * SPEED_UP_FACTOR;
                System.out.println(--counter);
            }
        }

    }

    private static void sleep(long timeout) {
        try {
            Thread.sleep(timeout);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}