Clojure / Swing / Java中的BufferedImage和ImageObserver出现问题
作者:互联网
我一直在尝试数小时,以便通过绘制存储在Clojure引用中的BufferedImage来使我的绘制方法起作用,然后将其绘制到组件(在本例中为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命令(用于其他类型的Graphics类的其他drawImage方法).一切都无济于事.
抱歉,如果我听起来有点难以理解,则此错误一直困扰着我.如有需要,我会在早上编辑!
非常感谢你
以撒
解决方法:
看起来buffered-image-ref设置为BufferedImage的图形,而不是图像本身.
标签:clojure,swing,java,user-interface 来源: https://codeday.me/bug/20191209/2097461.html