日期:2014-05-20  浏览次数:20670 次

java绘图程序的问题(类似WINDOWS画图)
现在已经实现的功能大体分为两种:一,以鼠标拖动轨迹绘图;二,以固定图形绘图(包括直线,长方形,椭圆等)。
第一种功能我是以getGraphics方法写的,第二种功能用paint方法。利用了双缓冲。

总的外在表现问题是:用一方法绘图时当窗口被遮挡或最小化恢复后,图形消失,在继续拖动鼠标时才出现之前的图形。(鼠标绘图的drawLine方法写在mouseDragged方法中,所以继续拖动,可以实现读取缓存中的图形。)这里的问题是如何才能使窗口被遮挡和窗口重新恢复之间的时间里图形不会消失(我尝试在WindowEvent中窗口最小化恢复方法里写入读取缓存图形的方法,结果没有效果);
用二方法时,当鼠标拖动后,之前画的图形消失(draw方法也是写在mouseDragged中,画特定图形时用到了repaint方法,这样以保证按住鼠标拖动时让图形变化,而不是画很多图形)。这里其实我也知道用到repaint就有一个清除的过程,我尝试在mousepressed,mousereless方法里读取缓存图象,但都得不到稳定的效果。可是WINDOWS画图程序里就是用同样的表现方式绘图,却不会有消失的过程。这里的问题就是如何做到WINDOWS画图程序中画多个特定图形但都不会消失的效果。

之后还有个小问题,就是我让绘图区域继承JPanel类时,设定了背景色为白,但当用鼠标拖动绘图时背景色变成了菜单色(铅色),换成继承Panel类时却一切正常,这是什么原因呢~

写了一大堆,希望高手们不厌其烦,帮助帮助小弟~~万分感谢!

------解决方案--------------------
应该在paint()或者paintComponent()方法中绘制,因为窗口被遮挡或最小化恢复后,会调用repaint(),repaint()调用的paint()方法,paint()再调用paintComponent()方法,所以写在其他地方的绘制代码根本不会被执行。

所以绘制应该在paint()或者paintComponent()方法中进行,保证重绘不会消失你的劳动成果。
------解决方案--------------------
不用缓冲,直接重写JPANEL类的paint方法就可以了。

public void paint(Graphics g){
super.paint(g);
g.drawRect(50,50,20,20);
}