Как рассчитать истекшее время из Java Swing Timer - PullRequest
0 голосов
/ 05 января 2020

У меня есть экземпляр Timer из javax.swing.Timer, я пытаюсь рассчитать оставшееся время от восстановления, потому что я использую его для команд.

Я тестирую его с 15 второе время восстановления. Перезарядка работает отлично, но я хочу иметь возможность сообщать, сколько времени осталось, когда я доберусь до более крупных откатов, таких как 5 - 10 минут и c. Я хочу сказать, что 00:00:15 осталось 00:00:14 осталось 00:00:13 осталось и др. c

Я знаю, что здесь что-то упущено.

Ниже я поместил код, который я использую, чтобы вычислить истекшее время и преобразование из Millis в HMS. Когда вызывается команда, для времени начала установлено значение currentTimeMillis ()

long startTime = System.currentTimeMillis();

public void callWithCooldown(int cooldown) {
        ActionListener callMethod = new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                enable();
            }
        };

        boolean didCall = call();
        if(!didCall) return;

        disable();
        this.timer = new Timer(cooldown, callMethod);
        timer.setRepeats(false);
        this.startTime = System.currentTimeMillis();
        timer.start();

        String notification = "Cooldown activated for " + MathHelper.millisecondsToHMS(cooldown) + "!";
        System.out.println(notification);
        notify(notification);
    }

public String elapsedTime() {
        long now = System.currentTimeMillis();
        long endTime = (startTime + cooldown);
        int elapsed = (int) (endTime - now);
        System.out.println(elapsed);
        return millisecondsToHMS(Math.abs(elapsed));
    }

    public static String millisecondsToHMS(int milliseconds) {
        String time = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds),
                TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
                TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
        return time;
    }

1 Ответ

1 голос
/ 05 января 2020

Вы можете создать два Timer объекта. Один для общего времени ожидания, а другой для обратного отсчета:

import javax.swing.Timer;

public class Main {

    private static long START;

    public static void main(final String[] args) {
        final int totalSeconds = 15;

        final Timer tm = new Timer(1000, e -> {
            System.out.println("Seconds remaining: " + (totalSeconds * 1000 - System.currentTimeMillis() + START) / 1000d);
        });

        START = System.currentTimeMillis();

        new Timer(totalSeconds * 1000, e -> {
            tm.stop();
            System.out.println("Finished!");
        }).start();

        tm.start();

        //Wait for the program to execute:
        try { Thread.sleep((totalSeconds + 2) * 1000); } catch (final InterruptedException ix) {}
    }
}

Хотя я думаю, Timer не совсем точное решение для такой проблемы (в зависимости от того, насколько точным вы хотите, чтобы она была ), но это просто.

Или в вашем коде это может быть:

import java.util.concurrent.TimeUnit;
import javax.swing.Timer;

public class Main {
    private long startTime;
    private final Timer total, countDown;

    public Main() {
        countDown = new Timer(1000, e -> System.out.println(elapsedTime()));
        total = new Timer(2000, e -> { //Defaults to 2000 ms for example.
            countDown.stop();
            enable();
        });
        total.setRepeats(false);
    }

    public void enable() {
        System.out.println("Enable!");
    }

    public void callWithCooldown(int cooldownSeconds) {
        total.setInitialDelay(cooldownSeconds * 1000);
        startTime = System.currentTimeMillis();
        total.start();
        countDown.start();
    }

    public String elapsedTime() {
        long now = System.currentTimeMillis();
        long endTime = (startTime + total.getInitialDelay());
        int elapsed = (int) (endTime - now);
        return millisecondsToHMS(Math.abs(elapsed));
    }

    public static String millisecondsToHMS(int milliseconds) {
        String time = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(milliseconds),
                TimeUnit.MILLISECONDS.toMinutes(milliseconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliseconds)),
                TimeUnit.MILLISECONDS.toSeconds(milliseconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliseconds)));
        return time;
    }

    public static void main(final String[] args) {
        final int seconds = 15;
        new Main().callWithCooldown(seconds);
        //Let the program run for 'seconds' seconds at least to show all messages:
        try { Thread.sleep((seconds + 2) * 1000); } catch (final InterruptedException ix) {}
    }
}
...