注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

享受编码

    的乐趣

 
 
 

日志

 
 

java画图程序技术小结  

2010-01-10 10:15:58|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

(一) 程序结构问题

这个软件是我大二时的图形学课程设计,是个矢量图形的绘制软件。发来给初学者参考。

         主要功能:

         实现点、线段、折线、圆、椭圆、矩形、圆弧、多边形、填充图形、字符串等的定义和交互绘制。

         实现线型、线宽、颜色的选择。

         实现画布的定义及保存。

         程序结构:

程序的主要功能均由类PaintPanel完成,该类继承自JtextArea。(用它是为了实现画布的大小调整的滚动条,以后介绍)

PaintPanel中主要成员:

ArrayList shape 保存当前画布上的图形对象

ArrayList undo  保存用于撤消操作的图形对象  

Color bgCol    背景颜色

BufferedImage offScreenImg   后台图象

Graphics2D offScreenG       后台Graphics对象

Clipboard cb;   剪切板(由系统剪切板实例化)

   程序中定义接口:CusShape,主要有一些操作图形的基本方法,比如,绘制,位置控制,颜色控制(具体可看代码)

   其他图形均继承java.awt中的对应的类(主要是使用其中的交叉判断函数intersects,用于图形的鼠标选取),并实现Serializable,CusShape。

   图形在程序中都以接口CusShape形式出现,以画的图形存储在ArrayList中。

   我是通过这个软件的设计才明白多态的,以前都是理论上的,经过实践才知道面向对象的好处。这个软件编写的时候我对java还不是很了解,所以有的结构不是很合理,写出来就是给初学者做个参考,看到有很多同学都在找画图板的设计,我会给出程序和简单的设计文档。

java画图程序技术小结(二) 重绘与双缓冲

双缓冲,我记得有两种方法,一种是两个图象,一个前台Graphics,一个后台Graphics,画图时在后台画,画好了,再用前台的Graphics画后台Graphics的图片。另一种是有两个或多个图象,不分前后台,显示一个图象时,另外的在画,图象循环使用(c语言时用过)。
         给出第一种的java实现
         a、  定义后台图象BufferedImage offScreenImg=offScreenImg = new BufferedImage(this.maxX, this.maxY,
                                     BufferedImage.TYPE_INT_RGB);

         b、  得到后台的Graphics实例

    Graphics2D offScreenG;

        offScreenG = offScreenImg.createGraphics();

         c、  覆盖paintComponent方法

     public void paintComponent(Graphics g) {

          super.paintComponent(g);

        g.drawImage(offScreenImg, 0, 0, this.maxX, this.maxY, this);

          }

        绘制时用后台Graphics,绘制好后,调用repaint(),将offScreenImg绘到面板上。

(三)画图的鼠标事件处理

画图的鼠标事件处理是画图程序中比较复杂的内容,这里只是简单介绍,有兴趣的可以看程序。
         Point p0,p1;//
记录拖拽画图的起点和终点
         p0=new Point();
         p1=new Point();
         //
鼠标按下,主要记录按下的点
         void jPaneDraw_mousePressed(MouseEvent e) {
            p0=new Point(e.getX(),e.getY());
}
         //
鼠标拖拽过程,根据不同的图形,画出拖拽过程的图形,复杂图形可以用矩形代替
         void jPaneDraw_mouseDragged(MouseEvent e) {
         switch(toolMode){
         case 0:{ //
直线
       p1.x = e.getX();
        p1.y = e.getY();
        g.setColor(col);
        g.drawLine(p0.x, p0.y, p1.x, p1.y);
        jPaneDraw.repaint();
        break;
   }
         ...//
其它图形
}
}
//
鼠标抬起,根据p0p1生成对应的图形
void jPaneDraw_mouseReleased(MouseEvent e) {
   switch(toolMode){
case 0:{ //
直线
         CusLine2D aCusShape = new CusLine2D(p0.x, p0.y, p1.x, p1.y); //
建立图形
         ...//
将图形加入到图形列表
         break;
}
         ...//
其它图形
}
         jPaneDraw.repaint();
}

 

出处:http://www.blogjava.net/RexMao/archive/2007/04/23/113040.html

  评论这张
 
阅读(2728)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018