Программа, которую я имею, визуализирует симуляцию физики (в основном). Прямо сейчас это работает, но может стать очень безразличным, и я думаю, я знаю почему - слишком много (читай: все) вычислений выполняется в потоке событий.
Когда нажата кнопка воспроизведения, создается Swing Timer
, который периодически просыпается и вызывает updateTime()
- пока все хорошо. Проблема заключается в том, что updateTime()
выполняет итерацию через каждый зависящий от времени объект и указывает ему распространяться вперед во времени на соответствующую величину (либо прошедшее реальное время, либо произвольная единица времени на каждый тик). Все эти вычисления и последующие обновления графического интерфейса находятся в потоке диспетчеризации событий.
Итак, я хотел бы выгрузить как можно большую часть этих вычислений, и я думаю, что SwingWorker
- это путь, но я не уверен, как включить их в существующий код. Я не могу заставить существующие классы расширять SwingWorker
, так как многие из них уже расширяют другие классы.
Моя лучшая идея на данный момент - создать интерфейс для каждого объекта, зависящего от времени, для реализации. Интерфейс будет указывать 2 метода, calcUpdateTime()
и drawUpdateTime()
. Я бы разделил каждый из их текущих updateTime()
методов на физические вычисления (на calc_
) и обновления GUI (на draw_
). Тогда я бы создал только один класс SwingWorker, который принимает в конструктор объект TimeDependant
, а его doInBackground
будет вызывать calcUpdateTime
, а done
будет вызывать drawUpdateTime
. Тогда я могу заменить все вхождения
myObj.updateTime(currentTime);
с
new MySwingWorker(myObj, currentTime).execute();
Я хотел реализовать эту идею SO, потому что она не совсем правильная, и он хотел бы избежать рефакторинга всего проекта, просто чтобы узнать, что я начал с плохой идеи. Кроме того, разве не плохая идея создавать потенциально десятки MySwingWorker
с каждый тик?
Спасибо, что прочитали это далеко.