Java Дата использования свинга для таймера - PullRequest
0 голосов
/ 24 января 2020

Попытка создать таймер, который отображает время, прошедшее с момента нажатия кнопки. Я использую экземпляр Date и пытаюсь инициализировать его до 00:00:00 и увеличить его на секунды, минуты, а затем часы. он работает как часы текущего времени, если я не ввожу никаких значений в Date currentTime = new date() Вот мой код, я попытался установить дату для всех 0 значений, и он отображается как все нули, но когда нажата моя кнопка больше не работает как таймер. В чем проблема?

 Timer timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Date currentTime = new Date(0,0,0,0,0,0);
                SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
                laserOnTimeTF.setText(sdf.format(currentTime));
            }
        });

        laserOnOff.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!laserSetting) {
                    timer.start();
                    laserSetting = true;
                    laserOnOff.setText("Laser On");
                } else {
                    timer.stop();
                    laserSetting = false;
                    laserOnOff.setText("Laser Off");
                }

            }
        });

1 Ответ

2 голосов
/ 24 января 2020

Этот конструктор Date устарел , как и все конструкторы Date, отличные от того, который принимает аргумент в миллисекундах. API устарели по какой-то причине, обычно потому, что они работают не так, как задумано. Чтобы получать уведомления при использовании устаревших API-интерфейсов, включите все предупреждения компилятора в своей среде IDE и обратите внимание на эти предупреждения.

Дата не подходит для хранения прошедшего времени, поскольку она представляет собой абсолютную точку во времени. , Класс, который предназначен для представления разницы во времени, равен java .time.Duration .

. Вы можете рассчитать Duration из двух значений времени. Самое простое значение времени, вероятно, Instant , поэтому вам понадобится приватное поле типа Instant в классе, который создает Timer и добавляет слушателя к кнопке, чтобы отслеживать, когда кнопка была нажата. :

private Instant timeOfLastButtonPress;

Затем вы можете инициализировать его при каждом нажатии кнопки:

laserOnOff.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if (!laserSetting) {
            timeOfLastButtonPress = Instant.now();
            timer.start();
            laserSetting = true;
            laserOnOff.setText("Laser On");
        } else {
            timer.stop();
            laserSetting = false;
            laserOnOff.setText("Laser Off");
        }
    }
});

Наконец, ваш таймер может рассчитать продолжительность, используя Duration.between :

Duration elapsedTime =
    Duration.between(timeOfLastButtonPress, Instant.now());

Если вы используете Java 9 или более позднюю версию, вы можете извлечь числа из Duration напрямую:

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Duration elapsedTime =
            Duration.between(timeOfLastButtonPress, Instant.now());
        laserOnTimeTF.setText(String.format("%02d:%02d:%02d",
            elapsedTime.toHoursPart(),
            elapsedTime.toMinutesPart(),
            elapsedTime.toSecondsPart()));
    }
});

В Java 8 вам понадобится чтобы вычислить это самостоятельно:

Timer timer = new Timer(1000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Duration elapsedTime =
            Duration.between(timeOfLastButtonPress, Instant.now());
        laserOnTimeTF.setText(String.format("%02d:%02d:%02d",
            elapsedTime.toHours(),
            elapsedTime.toMinutes() % 60,
            elapsedTime.getSeconds() % 60));
    }
});
...