Graphics2D,drawImage() - 方法,Scala Swing

时间:2015-04-05 05:41:22

标签: swing scala graphics2d drawimage

我通过覆盖paintComponent -method在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 -object创建一个BufferedImage,所以我可以读取位置x,y处的某个像素的值。

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

1 个答案:

答案 0 :(得分:3)

Graphics2D连接到某个画布或图像。你可能会把它想象成一把刷子或一支笔。在这种情况下,您拥有的图形对象与您的面板相关联。调用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的语法,如果它不同的话。)

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