Проблема с BufferedImage и ImageObserver в Clojure / Swing / Java - PullRequest
3 голосов
/ 03 августа 2010

Я часами пытался заставить мой метод рисования работать, рисуя BufferedImage, хранящийся в Clojure ref, а затем рисовать его на компоненте (в данном случае JPanel), чтобыпоказать это.К сожалению, это не очень хорошо работает.

Мой код такой (сокращен, но показаны соответствующие части:

(defn create-graph
  "Data-ref is [xs ys], buffered-image-ref holds the basic graph."
  [data-ref buffered-image-ref & {:keys [width height image]}]
  (proxy [JPanel]
      []
    (getPreferredSize [] (Dimension. width  height))
    (paintComponent [g]
                    (proxy-super paintComponent g)
                    (if-not @buffered-image-ref
                      (dosync
                       (ref-set buffered-image-ref
                                (xy-plot2
                                 (first @data-ref)
                                 (second @data-ref)
                                 (.getGraphics
                                  (BufferedImage. width height 
                                                  BufferedImage/TYPE_INT_ARGB))
                                 :axis? true
                                 :width width
                                 :height height))))
                    (.drawImage g @buffered-image-ref
                                0 0 
                                (proxy [ImageObserver]
                                         []
                                       (imageUpdate []
                                          (proxy-super imageUpdate)))))))

И, ниже, xy-plot2 (что, похоже, не проблема, но я 'Я включу его для полноты:

(defn xy-plot2
  "Draws an xy-plot in the given Graphics context.
   'xs must be equal in length to 'ys."
  [xs ys gfx
   & {:keys [color max-y axis? y-buffer width height]
     :or {color Color/RED y-buffer 0}}]
  (let [h (/ height 2) ;; since we have -h to h (not 0 to h)
        w width ;; since we graph 0 to w
        len (count xs)
        min-x (apply min xs)
        xs (if-not (zero? min-x)
             (map #(- % min-x) xs)
             xs)
        max-y (or max-y (apply max ys))
        max-x (apply max xs)]
    (.setColor gfx color)
    (dorun ;; this is the key part, along with scale-xs and draw-l
     (take len
           (iterate (partial d-line gfx h)
                    [(scale-xs xs w 0)
                     (scale-xs ys h y-buffer)])))
    (and axis? (or (.setColor gfx Color/BLACK) (.drawLine gfx 0 h w h)))
    gfx))

Когда я запускаю это, я получаю эту ошибку, которая приводит к убеждению, что я напутал в последней части paintComponent() метода.

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException:
No matching method found: drawImage for class sun.java2d.SunGraphics2D

Я пытался заменить nil вместо ImageObserver, но безрезультатно. Я пробовал другие порядки аргументов (для других drawImage методов для других типов Graphics классов).безрезультатно.

Извините, если я звучу немного трудно для понимания, эта ошибка мучает меня. Я отредактирую утром, если понадобится!

Спасибо, так чтомного, Исаак

1 Ответ

3 голосов
/ 03 августа 2010

Похоже, что buffered-image-ref установлено на графику BufferedImage , а не на само изображение.

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