4

カウントダウンを行うためのタイマーを作成しようとしています(ロケットの打ち上げのように:3-2-1-Go)。私が持っているものは一度だけ実行するようです。値が0に達するまで、繰り返し(ほぼ再帰的に)実行する必要があります。

ご覧のとおり、これの進捗状況を追跡するためのさまざまなprintlnステートメントがあります。これが私の出力です:

Coundownコンストラクターで

ActionListenerで

カウント・ダウン

3

何が問題なのかというと、次の出力が欠落しているということです。

2

1

行け

これは、このタイマーが実際にカウントダウンしていないことを示しています。1秒待ってから終了しているようです。

タイマーがゼロになるまでこれを呼び出すにはどうすればよいですか?ありがとうございました!

public class StopWatch {

    JFrameMath myTest;
    int seconds;

    /* Constructor */
    public StopWatch(JFrameMath thisTest, int sec) {
        myTest = thisTest;
        seconds = sec;

        myTest.hideTestButtons(true);
        Countdown display = new Countdown(myTest);
    }
}

class Countdown extends JFrame implements ActionListener {

    private Timer myTimer = new Timer(250, this);
    JFrameMath myTest;

    public Countdown(JFrameMath thisTest) {

        System.out.println("in Coundown constructor");  

        myTimer.setInitialDelay(1150);
        myTest = thisTest;
        myTimer.start();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        System.out.println("in ActionListener");      
        int countSeconds = 3;

        if(countSeconds == 0) {
            myTest.showTimeRemaining("Go");
            myTimer.stop();
            System.out.println("done");
        } else {
            System.out.println("counting down");
            myTest.showTimeRemaining(""+countSeconds);
            countSeconds--;
        }

        myTimer.stop();
        myTest.hideTestButtons(false);
    }
}

public void showTimeRemaining(JFrameMath thisTest, String numSec) {
  System.out.println(numSec);
    lblCountdown.setText(numSec);
    thisTest.pack();
}
4

2 に答える 2

6

myTimer.stop()の末尾から削除actionPerformedします。これが、後続のイベントのトリガーを妨げている理由です。電話をかけたい場所stopは内だけif (countSeconds == 0)です。

また、タイプミスなのかテストなのかはわかりませんが、int countSeconds = 3;から行を削除する必要がありますactionPerformed

于 2012-08-18T22:56:17.100 に答える
5

まず、最初のパスでタイマーを停止します。

myTimer.stop(); <---- remove this call
myTest.hideTestButtons(false);

したがって、タイマーが再度呼び出されることはありません。

これを修正したら、初期化しています

int countSeconds = 3;

毎回actionPerformedであるため、カウンターは終了しません。

これをクラスレベルに移動し、タイマーを開始する直前に初期化する必要があります。

于 2012-08-18T22:56:14.400 に答える