我通过覆盖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本身。我在这做错了什么?
答案 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的语法,如果它不同的话。)
不要过于放肆,可能有更好的方法来处理你正在做的事情。例如。如果您正在对面板进行绘画,如评论中所述,通常最好先在图像上进行绘画,然后将图像绘制到面板上。然后你总是有图像。