結論から言うと、javax.swing.Timerを使うとやりたいことができました。
ダメな例
最初処理を書いたときは、- Thread.sleep()でスレッドを一時停止する
- repaintを呼んで再描画する
調べてみると、
Thread.sleep()は、実行中のスレッドをスリープさせる。このときスリープするスレッドは保持しているロックを開放しない[1]。
ということでした。
その結果、
- repaintリクエストは実行されることなくキューに溜まっていく。
- STOPボタン押下時にはじめてキューにたまったrepaintが実行可能となる。
- 実行されてないrepaintリクエストが複数個ある場合は、一つにまとめられて最後のrepaintメソッドだけが実行される。(もしくは設定によってはキューに溜まったrepaintがすべて間隔をあけることなく一瞬で実行される。)
- 思った動作にはならない。
ということが起きていました。
参考URL
[1] Difference between wait() and sleep()[2] Java - repaint component every second?
[3] Combining repaint() with Thread.Sleep()
0 件のコメント:
コメントを投稿