Graphics2D、drawImage() 方法、Scala Swing

Graphics2D, drawImage() -method, Scala Swing

我正在通过重写 paintComponent 方法在 Panel 上绘画。

class Canvas extends Panel ...
...
override def paintComponent(g: Graphics2D) {
    super.paintComponent(g)
    for (cmd <- commands.get) cmd.execute(g, this)
}

好的。其中一个命令里面就是这个。

case class TestCommand() {
  def execute(g: java.awt.Graphics2D, c: Canvas) = {
    val img = new BufferedImage(c.width, c.height, BufferedImage.TYPE_INT_RGB) 
    g.drawImage(img, null, 0, 0)
}

我想做的是从 Graphics2D 对象创建一个 BufferedImage,这样我就可以读取位置 x、y 处的某个像素的值。

然而,当执行此命令时,我注意到 drawImage 方法导致我的面板完全变黑,擦除我到目前为止在其上绘制的所有内容。我希望命令简单地创建我在面板上绘制的内容的 BufferedImage,而不是以某种方式影响 Graphics2D - 对象本身。我在这里做错了什么?

一个 Graphics2D 连接到某个 canvas 或图像。你可能会把它想象成一把刷子或一支笔。在这种情况下,您拥有的图形对象与您的面板相关联。调用 drawImage 将图像绘制到面板上。

如果要在图像上绘制 面板 ,您需要 Graphics for the BufferedImage:

Graphics2D ig = img.createGraphics();

然后你需要将面板绘制到图形上。 java.awt.Component为这类事情提供了很多方便的方法,例如printAll:

c.printAll(ig);
ig.dispose(); // don't forget to dispose Graphics you've created

(抱歉,我不太了解 Scala 语法,如果它有所不同。)

不必过于冒昧,可能有更好的方法来处理您正在做的事情。例如。如果您要在面板上绘画,如评论中所述,通常最好先在图像上绘画,然后再将图像绘画到面板上。然后你总是有图像。