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 语法,如果它有所不同。)
不必过于冒昧,可能有更好的方法来处理您正在做的事情。例如。如果您要在面板上绘画,如评论中所述,通常最好先在图像上绘画,然后再将图像绘画到面板上。然后你总是有图像。
我正在通过重写 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 语法,如果它有所不同。)
不必过于冒昧,可能有更好的方法来处理您正在做的事情。例如。如果您要在面板上绘画,如评论中所述,通常最好先在图像上绘画,然后再将图像绘画到面板上。然后你总是有图像。