- ベストアンサー
プログラムの実行の順番(描画)
メソッドの途中でテキストファイルを開いて読み取り、 そのテキストファイルの情報を整理して、整理した情報を元に 描画を更新していくプログラムを書いているのですが、 テキストファイルから一行読み込むごとに repaintは呼び出されているはずなのに、 テキストファイルを全行読み取ってから 描画されているようです。 どのようにしたら、一行ごとに順次再描画できるようになるでしょうか。 また、描画ごとに全ての機能を一時ストップさせたいのですが(動きが速いと図の移り変わりがわかりにくいと思うため)、 スレッドを使わないと無理なのでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
java.awt.Component#repaint() の動作は「可能な限り速やかに update() または paint() を呼ぶ」です。つまり update() や paint() は別スレッドで呼び出されるように作られていて、repaint() を呼び出した時に処理されるようにはなっていないということです。(なので repaint() から処理が返された直後は update() や paint() の処理は通常は終っていないと考えてさしつかえないと思います)。 ということで、描画が終るのを待ちたいのであれば自分で update() や paint() を直接呼び出すように書くか、または Thread.sleep() で少し待つ、あるいは Thread.yield() で他のスレッドの実行を促すように書けばいいのではないかと思います。(描画を遅くしたいということなので Thread.sleep() で待たせればいいんじゃないでしょうか。その間に再描画のためのスレッドも動くと思います)。
その他の回答 (2)
>repaintは呼び出されているはずなのに、 >テキストファイルを全行読み取ってから >描画されているようです。 Swingを使ってませんか? AWTの場合はそのままrepaintで再描画されますが、Swingはコンテナにオフスクリーンバッファを持っており、画面の更新はAWTEventのイベントキューが消費された後に行われます。つまり、イベントリスナーなどからメソッドを呼び出して実行する場合は、そのメソッドの処理が終わってからまとめて再描画されるわけです。 それが困るのであれば、AWTEventが実行されているのとは異なるスレッドで処理を実行させる必要があるでしょう。要するに、別スレッドを動かし、そこからrepaintさせるわけです。 また「描画ごとに全ての機能を一時ストップさせたいのですが」というのは、スレッドで一定時間sleepさせながら処理を行えばいいでしょう。Threadの使い方について検索してみるとこのあたりはすぐに見つかりますよ。
- ratsbane
- ベストアンサー率40% (4/10)
読み込む方が処理的に早いからでしょう。 スレッドを使えばいいかと。 描画ごとに全ての機能をストップさせると描画もストップするんじゃないでしょうかね? repaintする前に次の行を読んでるかと思うので、 そこを工夫するしかないでしょう。
お礼
スレッドを使って試行錯誤した結果、うまくいきました。 ありがとうございました。
お礼
スレッドを使ってみました。 仰るとおり、メソッドの処理が終ってから描画されているためにうまくいかなかったようで、 スレッドを使用したらうまくいきました。 ありがとうございました。