2009-11-26 158 views
0

我正在尝试制作一个Java Applet,它将允许我在画布中绘制图形数据结构。我将通过单击我想要创建节点的位置并单击节点来连接它们来完成此操作。问题是我不能让paint()方法正确行为。我添加mousePressed(MouseEvent e)方法内的图形新节点(和画布上正方形)使用,Java 2D图形矩形

Graphics g = this.getGraphics(); 
g.setColor(Color.blue); 
g.fillRect(e.getX(), e.gety(), 40, 40); 

一切工作正常,直到我调整窗口的大小,然后将所有的填充的矩形消失。我重写了paint方法只是一个空方法,但同样的事情仍然发生。我不能在paint()内部添加fillRect命令,因为我不知道在用户使用鼠标与它进行交互之前存在什么矩形。

如何在鼠标侦听器方法中使用g.fillRect()并让它们粘住?

回答

6

问题是你正在绘制的地方是不持久的。在任何时候,你都可能失去你所吸引的一切。在发生这种情况时调用paint(Graphics)方法。每当发生这种情况时,您将需要重新绘制整个图片,或者需要放置画布以根据需要绘制内容并将其复制到applet的Graphics。

下面介绍如何创建和绘制到图像:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

然后,在你的paint方法,用你的图形的drawImage(...)方法来显示你所创建的图像。

+0

这似乎是最简单的方法,我创建了一个新的BufferedImage,然后在其上绘制了所有的形状,并使绘制方法绘制图像。谢谢! – PherricOxide 2009-11-26 06:37:39

+1

没问题,尽管最终可能需要完全重新绘制,所以请记住Kyl的建议。 (还有,记得投票并“接受”你喜欢的答案,我想要我的业力点:) – Gunslinger47 2009-11-26 06:46:28

+1

在这种特殊情况下,保存数据可能比缓存图像更好。但是,+ 1为了获得两个极端。 – 2009-11-26 06:46:31

6

我不知道如果我正确地读这篇文章,但为什么不只是存储在一个变量的最后一次点击的位置稍后绘制paint()方法时会被绘制?

+0

这是正确的答案。 'mousePressed()'不需要自己做任何绘画;它应该调用'repaint'并保存必要的信息,以便paint()可以完成它的工作。 – 2009-11-26 06:05:55

+0

我不需要在某处存储所有点击的位置,并且在重新绘制时遍历该列表?我的理解是,paint()从一个空的画布开始并从那里开始。 – PherricOxide 2009-11-26 06:09:43

+1

@PherricOxide:是的,你会的。但是,无论您选择何种解决方案,您都必须这样做。你不能假设画布不需要重新绘制。 – kylc 2009-11-26 06:16:05

0

图形是临时的。当一个地区变脏时,它将被重新粉刷。

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