0

Java のスイングとループに関する別のスレッドを投稿して申し訳ありません。私は他の人を読みましたが、どの解決策も私にとって本当に適切ではありませんでした. さて、問題に移ります。以下のように、ストップウォッチを実行するタイマーを持つ JFrame を拡張するクラスがあります。

class StopWatch extends TimerTask{
    public void run() {
        time.setText(String.format("%02d:%02d", minutes_elapsed,seconds_elapsed));
        seconds_elapsed++;
        if(seconds_elapsed == 60){
            seconds_elapsed = 0;
            minutes_elapsed++;
        }
    }

}

現在、ラベルの「時間」を更新する唯一の方法は、time.update(time.getGraphics()) を呼び出すときですが、これは以前の時間を塗りつぶします。私がすべきことはありますか?また、再描画、検証、およびペイントを試みました。ペイントは、更新と同じことを私にとって行います...何かアイデアはありますか? PSそれが重要かどうかはわかりませんが、以下のような public void start_timer() 関数でタイマーを作成します。

public void start_timer(int minutes, int seconds){
        if(timer == null)
             timer = new Timer();
        timer.scheduleAtFixedRate(new StopWatch(),0,1000);
    }
4

2 に答える 2

5

java.util.Timerの代わりにを使用していると思われますjavax.swing.Timer。後者は、タイマーがUIスレッドで実行されることを確認しますが、これが問題であると思われます。

それらのチュートリアルについては、「スイングタイマーの使用方法」を参照してください。TimerTaskをActionListener`に変換してから、

timer.setDelay(1000);
timer.setRepeats(true);
timer.start();
于 2012-08-06T16:54:20.097 に答える
4

あなたはこれを行うことができます

public void run() 
{
    SwingUtilities.invokeLater(new Runnable()
    {
        @Override
        public void run()
        {
            // do stuff
        }
    }
    ));
}

しかし、実際には使用する必要がjavax.swing.Timerあります。Swingはシングルスレッドであるため、そのコンポーネントはそのスレッド(つまり、イベントディスパッチスレッド)で変更する必要があることに注意してください。

于 2012-08-06T16:53:24.243 に答える