Изменить компоненты JPanel автономно и одновременно - PullRequest
2 голосов
/ 31 января 2012

У меня есть приложение, в котором у меня есть JPanel с нарисованными прямоугольниками на основе информации, извлеченной из списка (ref ()), позже я изменяю список и мне нужно перекрасить JPanel.

Не думаю, что я делаю это правильно, это становится медленным.Я могу нарисовать каждый прямоугольник автономно, то есть, если прямоугольник «хочет» изменить свой цвет, он изменится, и этот прямоугольник будет автоматически изменен на панели.

Кто-нибудь может мне помочь?Вот несколько важных фрагментов кодов, которые я использую.

(defn fill [g x y c]
  (doto g
    (.setColor c)
    (.fillRect 
      (+ *margin* (* y 15)) 
      (+ *margin* *margin-top* (* x 15)) 
              15 15)))

(defn draw [g x y c]
  (doto g
    (.setColor c)
    (.drawRect 
      (+ *margin* (* y 15)) 
      (+ *margin* *margin-top* (* x 15)) 
    15 15)))

(defn make-panel 
      ([]
        (proxy [JPanel] []
          (paintComponent 
            [g]
            (doseq [i (range *size*)
                    j (range *size*)]
              (let [ v (:color @(get-obj i j))]
                (cond 
                  (= v :blue) (fill g i j Color/BLUE)
                  (= v :red)  (fill g i j Color/RED)
                  :else       (draw g i j Color/LIGHT_GRAY))))))))

;; This is how I repaint the frame, after changing the list
(doto *frame*
      (.setContentPane (make-panel))
      .repaint
      (.setVisible true))

1 Ответ

3 голосов
/ 31 января 2012

Во-первых, вам не нужно заменять панель (часть (.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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...