在一个Panel上用鼠标绘图,包括鼠标轨迹曲线和直线,各种几何图形等等。实现方法就是直接在Panel的Graphics对象上操作,但需要在窗体变动时对Panel的内容进行保存并更新。但是对于具体如何用paint方法实现这个功能不太理解,请各位帮忙,谢谢!部分代码:
paintingGround.addMouseListener(new MouseAdapter()){ //paintingGround是画图区
public void mousePressed(MouseEvent evn){
x1=evn.getX;y1=evn.getY;}}
paintingGround.addMouseMotionListener(new MouseMotionAdapter()){
public void mouseDragged(MouseEvent evn){
x2=evn.getX;y2=evn.getY;
line.draw(g,x1,y1,x2,y2) //line是一个绘图抽象类的子类对象,覆盖了父类方法draw,即重写成画直线的方法
x1=x2;y1=y2;}} //觉得理论上应该在这一句之前在paint方法中画出直线才能正确保存鼠标诡计曲线上面是绘制鼠标轨迹曲线的部分代码,绘制直线,矩形等等用的是类似写法,只是加入了异或模式绘制方法,至于双缓冲的保存方法因为整个程序的某些原因被否定掉了(曾经尝试过,因为一些难以解决的副产品放弃了),所以只能如此考虑,请高手们不吝赐教哈!
paintingGround.addMouseListener(new MouseAdapter()){ //paintingGround是画图区
public void mousePressed(MouseEvent evn){
x1=evn.getX;y1=evn.getY;}}
paintingGround.addMouseMotionListener(new MouseMotionAdapter()){
public void mouseDragged(MouseEvent evn){
x2=evn.getX;y2=evn.getY;
line.draw(g,x1,y1,x2,y2) //line是一个绘图抽象类的子类对象,覆盖了父类方法draw,即重写成画直线的方法
x1=x2;y1=y2;}} //觉得理论上应该在这一句之前在paint方法中画出直线才能正确保存鼠标诡计曲线上面是绘制鼠标轨迹曲线的部分代码,绘制直线,矩形等等用的是类似写法,只是加入了异或模式绘制方法,至于双缓冲的保存方法因为整个程序的某些原因被否定掉了(曾经尝试过,因为一些难以解决的副产品放弃了),所以只能如此考虑,请高手们不吝赐教哈!
楼主【jackjun119】截止到2008-06-27 16:29:52的历史汇总数据(不包括此帖):
发帖数:5 发帖分:250
结贴数:3 结贴分:250
未结数:2 未结分:0
结贴率:60.00 % 结分率:100.00%
楼主加油
是不是覆盖update方法让其不清除画面,paint里面写画直线的方法,然后在g上作图之后repaint?
如果是的话,画矩形等等图形时paint该如何处理,是否需要在各个图形子类中定义各自的paint,还是怎样做?请高手指点啊,最好稍微详细点多谢
2. 覆盖 update 方法让它直接调用 paint 是为了防止 update 在调用 paint 前用背景色清除已绘制的图形,一般用来避免组件重绘时闪烁。
3. 如果想保存绘制的图形(而不是当窗口被遮住的部分再次显露出时图像丢失),使用双缓冲是避免不了的。
4. 可以先建立绘图缓冲区(可以使用java.awt.image.BufferedImage),绘图时先绘制到缓冲区,再将缓冲区图形在 paint 中绘制到组件上,这样当绘图组件被遮住后再次显露而需要自动重绘组件时,它会自己调用 paint 方法,而在 paint 中作的是将缓冲区没被破坏的图形完整的绘制在组件上,从而避免了图像丢失。
5. 另外如果最后向把绘制的图像保存成文件,可以使用 javax.imageio.ImageIO 类中的方法。