Используйте javax.swing.Timer, чтобы сделать таймер обратного отсчета в Java

Возможный дубликат:
Стоп таймер с условно работает только в первый раз?

Я очень смущен тем, как сделать таймер, используя качели, а не утилизируемый таймер.

Я делаю игру, в которой пользователи должны отвечать на вопросы в течение 30 секунд. У меня есть PlayFrame, где отображается время, и метод внутри PlayFrame, называемый startTimer, который содержит все вещи таймера.

public static void startTimer() {

    int elapsedSeconds = 0;
    javax.swing.Timer myTimer = new javax.swing.Timer(1000, new MyTimerActionListener());
    elapsedSeconds++;

    if (elapsedSeconds == 30) {
        myTimer.stop();
        timerLabel.setText("0");
        wrong();
    } else {
        String text = String.format("f", 30 - elapsedSeconds);
        timerLabel.setText(text);
    }

    if (myTimer != null && myTimer.isRunning()) {
        myTimer.stop();
        myTimer = null;
        timerLabel.setText("0");
    } else {
        elapsedSeconds = 0;
        myTimer = new javax.swing.Timer(1000, new MyTimerActionListener());
        myTimer.start();
        String text = String.format("t", 30);
        timerLabel.setText(text);
    }
}

Я хочу, чтобы этот метод имел таймер, который отсчитывает от 30 до правильного ответа на вопрос. Если ответ получен неверно, я хочу, чтобы таймер остановился.

Для ответа, возможно, какой-нибудь psuedocode (или реальный код), чтобы переместить меня в правильном направлении. И это для личного пользования, а не для домашней работы или чего-то еще.

Пожалуйста, помните, что это часть всего моего кода, и он должен работать с другими его частями. Я дам больше информации по запросу, спасибо!

РЕДАКТИРОВАТЬ: Новый метод startTimer() ПРИМЕЧАНИЕ. All System.out.print предназначен только для тестирования:

  public static void startTimer() {
    class TimerListener implements ActionListener {
        Timer timer = new Timer(1000, new TimerListener());
        int elapsedSeconds = 30;
        String seconds = Integer.toString(elapsedSeconds);

        @Override
        public void actionPerformed(ActionEvent evt) {
            timer.start();
            if (elapsedSeconds == 0) {
                //System.out.print("here");
                timer.stop();
                PlayFrame.wrong();
            }
            else{
                //System.out.print("hersfde");
                elapsedSeconds--;
            PlayFrame.timerLabel.setText(seconds);
            }
            //System.out.println(elapsedSeconds);
        }
    }
    //System.out.print("l");
}

Ничего не делает и не уверен почему.

1 ответ

Решение

Вот как я бы сделал таймер обратного отсчета:

Timer timer = new Timer(1000, new TimerListener());

class TimerListener implements ActionListener{
    int elapsedSeconds = 30;

    public void actionPerformed(ActionEvent evt){
        elapsedSeconds--;
        timerLabel.setText(elapsedSeconds)
        if(elapsedSeconds <= 0){
            timer.stop();
            wrong()
            // fill'er up here...
        }
    }

}
Другие вопросы по тегам