Java二维图形矩形

Java二维图形矩形,java,resize,canvas,awt,paint,Java,Resize,Canvas,Awt,Paint,我正在尝试制作一个Java小程序,它允许我在画布中绘制图形数据结构。为此,我将单击要创建节点的位置,然后单击节点以连接它们。问题是我无法使绘制方法正确运行。在mousePressedMouseEvent方法中,我使用 Graphics g = this.getGraphics(); g.setColor(Color.blue); g.fillRect(e.getX(), e.gety(), 40, 40); 一切正常,直到我调整窗口大小,然后所有填充的矩形消失。我将paint方法重写为一个空方

我正在尝试制作一个Java小程序,它允许我在画布中绘制图形数据结构。为此,我将单击要创建节点的位置,然后单击节点以连接它们。问题是我无法使绘制方法正确运行。在mousePressedMouseEvent方法中,我使用

Graphics g = this.getGraphics();
g.setColor(Color.blue);
g.fillRect(e.getX(), e.gety(), 40, 40);
一切正常,直到我调整窗口大小,然后所有填充的矩形消失。我将paint方法重写为一个空方法,但同样的情况仍然发生。我无法在paint中添加fillRect命令,因为在用户使用鼠标与它交互之前,我不知道存在哪些矩形


如何在鼠标侦听器方法中使用g.fillRect并使其保持不变?

您必须覆盖窗口调整大小操作侦听器并调用

我不知道我是否正确阅读了这篇文章,但为什么不将最后一次单击的位置存储在稍后绘制的变量中,调用绘制方法时?

问题是您要绘制到的位置不持久。在任何时候,你都可能失去一切。发生这种情况时,将调用paintGraphics方法。每次发生这种情况时,您要么需要重新绘制整个图片,要么需要留出一块画布来绘制,并根据需要将内容复制到小程序的图形中

以下是如何创建和绘制图像:


然后,在绘制方法中,使用图形的drawImage。。。方法来显示您创建的图像。

图形是临时的。当一个区域变脏时,它将被重新绘制

最好的方法是创建一个BuffereImage,在mousePressed上绘制,然后调用repaint。
调用paint时,将图像绘制到传递的图形对象上。这样,您就不需要存储矩形,并且可以使用一个缓冲区来提高性能。

这是正确的答案。mousePressed不需要自己画任何画;它应该只调用repait并保存必要的信息,这样paint就可以完成它的工作了。难道我不需要将所有单击的位置存储在某个地方,并在重新绘制时遍历该列表吗?我的理解是,绘画从一块空画布开始,然后从那里开始。@Phericoxide:是的,你会的。然而,无论您选择什么解决方案,您都必须这样做。你不能假设画布永远不需要重新绘制。这似乎是最简单的方法,我创建了一个新的BuffereImage,然后在上面绘制了我所有的形状,然后让paint方法绘制图像。谢谢没问题,不过你最终可能不得不重新油漆,所以记住凯尔的建议。另外,记得投票并接受你喜欢的答案。我想要我的因果报应在这种特殊情况下,保存数据可能比缓存图像要好得多。然而,+1代表两个极端,它不是相互排斥的。特别是对于图形,您可能希望同时执行这两种操作。将渲染的图形保留在图像中,并使用paint methods快速将其绘制到屏幕上,但只有在图像更新时才对其进行完全重画。如果有许多节点,则每次绘制的完全重画都会变得非常缓慢。