私が持っているプログラムは、物理シミュレーションを(基本的に)視覚化します。現時点では動作しますが、非常に応答しなくなる可能性があります。その理由はわかっていると思います。イベント スレッドで実行される (read:all) 計算が多すぎます。
「再生」ボタンが押されると、Timer
定期的に起動して呼び出す Swing が作成されupdateTime()
ます。問題は、updateTime()
すべての時間依存オブジェクトを繰り返し処理し、適切な量 (実際の経過時間、またはティックごとの任意の時間単位) だけ時間をかけて伝播するように指示することです。これらの計算とその後の GUI の更新はすべて、イベント ディスパッチ スレッド上で行われます。
したがって、この計算をできるだけオフロードしたいと思います。s が最適だと思いますSwingWorker
が、それらを既存のコードに組み込む方法がわかりません。SwingWorker
それらの多くはすでに他のクラスを拡張しているため、既存のクラスを拡張することはできません。
これまでの私の最善のアイデアは、実装する時間依存オブジェクトごとにインターフェイスを作成することです。インターフェイスは 2 つのメソッドを指定calcUpdateTime()
しますdrawUpdateTime()
。現在の各updateTime()
方法を、物理計算 ( にcalc_
) と GUI の更新 ( にdraw_
) に分割します。TimeDependant
次に、コンストラクターでオブジェクトを受け取る SwingWorker のクラスを 1 つだけ作成し、それdoInBackground
が を呼び出しcalcUpdateTime
、done
を呼び出しますdrawUpdateTime
。それで、私はすべての出現を置き換えることができます
myObj.updateTime(currentTime);
と
new MySwingWorker(myObj, currentTime).execute();
私はこのアイデアを SO で実行したかったのです。なぜなら、それは正しくないと感じたからです。プロジェクト全体をリファクタリングして、私が悪いアイデアから始めたことを知りたくないからです。MySwingWorker
また、ティックごとに潜在的に数十の s を作成するのはおそらく悪い考えではありませんか?
ここまで読んでくれてありがとう。