Во-первых, вам не нужно заменять панель (часть (.setContentPane (make-panel))
), просто перекрасьте старую панель.
Чтобы выполнить минимальный объем работы только тогда, когда что-то действительно изменится, вы можете использоватьСмотреть средство.Если информация обо всех ваших прямоугольниках содержится в одном Ref, вы можете сделать что-то вроде этого:
(add-watch the-ref :update-rects
(fn [_ _ old new]
(update-rects-as-appropriate old new)))
Здесь update-rects-as-appropriate
обозначает код, который вычисляет цвета прямоугольника на основе old
и new
данные и выполняет обновления, когда - и только когда - результаты отличаются.В зависимости от точной формы данных, содержащихся в ссылке, на ранних этапах процесса может стать очевидным, что различий не будет, поэтому выполнять весь расчет не нужно.
Если каждый прямоугольникимеет ссылку на себя, вы можете просто обновить на основе нового состояния:
(add-watch the-ref :update-rect
(fn [_ _ _ new]
(update-rect the-rect new)))
Здесь the-rect
- это прямоугольник, соответствующий the-ref
и update-rect
функция, которая знает, как обновить его на основев состоянии the-ref
.