Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics2D,drawImage()-方法,Scala Swing_Swing_Scala_Graphics2d_Drawimage - Fatal编程技术网

Graphics2D,drawImage()-方法,Scala Swing

Graphics2D,drawImage()-方法,Scala Swing,swing,scala,graphics2d,drawimage,Swing,Scala,Graphics2d,Drawimage,我通过覆盖paintComponent-method在面板上绘制 class Canvas extends Panel ... ... override def paintComponent(g: Graphics2D) { super.paintComponent(g) for (cmd <- commands.get) cmd.execute(g, this) } 我要做的是从Graphics2D对象创建一个BuffereImage,这样我就可以读取x,y位置的像素值

我通过覆盖paintComponent-method在面板上绘制

class Canvas extends Panel ...
...
override def paintComponent(g: Graphics2D) {
    super.paintComponent(g)
    for (cmd <- commands.get) cmd.execute(g, this)
}
我要做的是从Graphics2D对象创建一个BuffereImage,这样我就可以读取x,y位置的像素值


然而,当执行这个命令时,我注意到drawImage-方法会使我的面板完全变黑,擦除迄今为止我在上面绘制的所有内容。我希望该命令只是为我在面板上绘制的内容创建一个BuffereImage,而不是以某种方式影响Graphics2D对象本身。我做错了什么?

一个
图形2D
连接到某个画布或图像。你可以把它想象成刷子或钢笔。在这种情况下,您拥有的图形对象将绑定到面板。调用
drawImage
将图像绘制到面板上

如果要将面板绘制到图像上,需要:

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

(抱歉,如果Scala语法不同,我不太懂。)


在不太放肆的情况下,也许有更好的方法来接近你正在做的事情。例如,如评论中所述,如果您正在对面板进行绘制,通常最好先在图像上进行绘制,然后将图像绘制到面板上。然后,您始终拥有图像。

“我希望命令简单地为我在面板上绘制的内容创建一个缓冲区图像”我发现在图像的图形对象中创建自定义绘制更容易,然后简单地将图像绘制到组件(或者可能只是在标签中显示图像)。“为我在面板上绘制的内容创建一个缓冲区图像”听起来你想将面板绘制到图像,但现在你正在绘制(空白)我也同意安得烈的评论。谢谢你的评论。你说得对,我正在向小组画空白图像。我不明白为什么DRWWMAGE方法是这样做的:“呈现一个用BuffeleDimaGoP过滤的缓冲区。应用的渲染属性包括剪辑、变换和合成属性。“-Oracle文档。我不理解Andrews的建议,你能给我一个例子吗?提示:添加@Radiodef(或任何人,
@
很重要)以通知此人新的评论。你能给我一个例子吗?“看这个,这个&这个。。要从
buffereImage
获取
Graphics2D
对象,只需调用
createGraphics()
。谢谢@Radiodef。这一切终于有了意义。我得到了“把它想象成刷子或钢笔”的部分,但我不知道它与画布或图像有关。
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 ig = img.createGraphics();
c.printAll(ig);
ig.dispose(); // don't forget to dispose Graphics you've created