3

カウントダウンをJFrameシミュレートしたい (ロケットの打ち上げなど) があります。setVisible(false)そこで、さまざまなコントロール ( ) を非表示にし、テキストと共に a を表示してフレームをセットアップしましたJLabel(これは、カウントダウンするはずのテキストです: 3、2、1、Go)。

その上のテキストJLabelは「3」から始まります。私の意図は、プログラムの実行を1秒間待機させてから、テキストを「2」に変更し、さらに1秒待ってから「1」に変更するなどです. 最後に、JLabelすべてのコントロールを非表示にして再表示すると、すべてが通常どおり進行します。

私がやっていることはうまくいきません。適切な時間待機しているように見えます。完了すると、私の JFrame は見栄えがよく、意図したとおりに機能します。しかし、カウントダウン メソッドの 4 秒間は、白い JFrame しか表示されません。私が望む 3、2、1 ではありません。

これが私のコードです。誰かが私が間違っていることを見ることができますか? ありがとう!

public void countdown() {
    long t0, t1;        

    myTest.hideTestButtons(true);
    myTest.repaint();

    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);

    myTest.TwoSeconds();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);


    myTest.OneSecond();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);


    myTest.Go();
    myTest.repaint();
    t0 =  System.currentTimeMillis();
    do {
        t1 = System.currentTimeMillis();
    } while ( (t1 - t0) < 1000);

    myTest.hideTestButtons(false);
    myTest.repaint();
}

public void TwoSeconds() {
    lblCountdown.setText("2");
}

public void OneSecond() {
    lblCountdown.setText("1");
}

public void Go() {
    lblCountdown.setText("Go!");
}
4

2 に答える 2

3

アプリケーションでタイミングを計るには、javax.swing.Timerを使用する必要があります。

何が起こっているかというと、すべてを 1 つのスレッドで実行しているため、UI (別のスレッドで実行される) を更新する機会がありません。

これがどのように機能するかの例が必要な場合は、次の回答をご覧ください: https://stackoverflow.com/a/1006640/1515592

于 2012-08-18T17:27:50.013 に答える
2

Timer代わりにaを使用してください。ほとんどの場合、アクティブな待機は非常に推奨されません。統合する必要があるコードのタイプは次のとおりです。

final Timer ti = new Timer(0, null);
ti.addActionListener(new ActionListener() {
    int countSeconds = 3;

    @Override
    public void actionPerformed(ActionEvent e) {
        if(countSeconds == 0) {
            lblCountdown.setText("Go");
            ti.stop();
        } else {
            lblCountdown.setText(""+countSeconds);
            countSeconds--;
        }
    }
});
ti.setDelay(1000);
ti.start();
于 2012-08-18T17:34:18.530 に答える