代码之家  ›  专栏  ›  技术社区  ›  Isaac

Cujule/Swing/爪哇中的BuffeReimeAGE和图像观察器故障

  •  3
  • Isaac  · 技术社区  · 15 年前

    我已经花了好几个小时的时间在Clojure中存储的BufferedImage中进行绘图,以使我的绘图方法正常工作。 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 但无济于事。我试过其他的ARG订单 drawImage 其他类型的方法 Graphics 类)。一切都无济于事。

    对不起,如果我听起来有点难以理解,这个错误一直困扰着我。如果需要的话,我会在早上编辑!

    非常感谢, 艾萨克

    1 回复  |  直到 15 年前
        1
  •  3
  •   Nick Main    15 年前

    看起来像 缓冲图像参考 设置为 缓冲图像 而不是图像本身。

    推荐文章