2008-08-24

JAVA绘图板中绘制图形的解决方法

  如果你和我一样是一个Java新手的话,如果你也正在编写一个能够绘制一些基本图形的绘图板程序的话。那么,你一定会面临的一个问题就是,包括鼠标的拖拽时的问题在内的图形绘制了。
  如果之使用默认的repaint等方法,一定会遇到的问题就是,即使你实现了鼠标拖拽的时候图形的动态绘制。但是无法解决之前绘制的图形的消失问题。
  原来画好一条直线,拖拽着画下一条的时候前面那条就会消失掉。当然,一种解决方法就是重载paintComponent方法。让每次repaint的时候都把列表中所有的图形全部重画。不过这不是一个好方法。因为在鼠标拖拽的时候。至少要重复10多次repaint的动作。如果原来的组建数量多了。那么计算量就是成几何级数上升的。所以我们不能采用这个方法。
  这个方法不通之后,我查阅了不少资料,看了几个程序。最后得到的思路就是。结合双缓冲。
  我重载了监听器的3个方法。分别是压下鼠标。拖拽鼠标(就是压下为松开并移动mouseDragged)。释放鼠标。
  压下鼠标时,向图形定义类的实例传送一个坐标值。拖拽鼠标时实时更新点坐标,但是不传递这个点坐标,而是利用它的值不断重绘图形。当放开鼠标时向图形定义类的实例传送第二个坐标。这里就是关键了。传递完坐标之后先保存这个实例,然后向前面建立的用于双缓冲的图形绘制所有已保存的实例。
  这里看似和普通过程没有区别,不过关键在那个双缓冲用的图形。在我重载的paintComponent方法中,我是先刷新一次整个页面。也就是清空了,之后绘制那个双缓冲的图形,最后绘制用户正在画的图形。
  这样一来,在拖拽过程中实际只绘制了两个对象,一个是双缓冲的图形,另外一个就是用户正在绘制的图形,而在鼠标松开的那个阶段我清空了双缓存的图形,完全重新绘制它。这样就保证了添加移动撤销等动作能够正常执行。

/*******************************************
*原创文章,转载请注明出处
*******************************************/

没有评论: