我拥有的程序可视化物理模拟(基本上)。现在,它可以工作,但可能会变得非常迟钝,我想我知道为什么 - 在事件线程上完成了太多(读取:全部)计算。
当按下“播放”按钮时,Timer
会创建一个 Swing,它会定期唤醒并调用updateTime()
——到目前为止一切都很好。问题在于updateTime()
迭代每个与时间相关的对象,并告诉它以适当的量(无论是实际经过的时间,还是每个滴答声的任意时间单位)将自身向前传播。这些计算以及随后的 GUI 更新都在事件分派线程上。
所以,我想尽可能多地卸载这种计算,我认为SwingWorker
s 是要走的路,但我不确定如何将它们用于现有代码。我不能让现有的类扩展SwingWorker
,因为它们中的许多已经扩展了其他类。
到目前为止,我最好的想法是为每个与时间相关的对象创建一个接口来实现。该接口将指定 2 个方法,calcUpdateTime()
并且drawUpdateTime()
. 我会将他们当前的每个updateTime()
方法拆分为物理计算(进入calc_
)和 GUI 更新(进入draw_
)。然后我将只创建一个 SwingWorker 类,它TimeDependant
在构造函数中接受一个对象,它doInBackground
会调用calcUpdateTime
并且done
会调用drawUpdateTime
. 那么我可以替换所有出现的
myObj.updateTime(currentTime);
和
new MySwingWorker(myObj, currentTime).execute();
我想通过 SO 运行这个想法,因为它感觉不太正确,并且它希望避免重构整个项目只是为了发现我开始时有一个坏主意。MySwingWorker
此外,每个刻度可能创建数十个 s 可能不是一个坏主意吗?
感谢您阅读本文。