`
风子柒
  • 浏览: 55560 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

魔幻蓝诗@画板3.0

阅读更多
    学习Java初期(现在也在初期),做了一个简单的画板,时至今日,才打开ItEye(时过境迁,JavaEye已经强制转型为ItEye了,可叹啊)开始回顾我的画板诞生的全过程,由于个人偏好,本人将我开发的东东通通冠以“魔幻蓝诗”商标,如有雷同,铲草除根
   
    首先,阐述一下个人认为的开发画板的技术点:监听器的使用、画板的重绘(牵涉到list的使用)、以及画图形算法、构造器使用等等。这四个问题在我开发画板的过程中一定程度上阻缓了我,可能是因为基础知识不太牢固(以后不能这样子了,应该是现在开始不能这样子了)。
    在监听器的使用过程中,对各种方法不是很熟练,前期只处于一种简单模仿的状态,通俗点就是抄代码。后来发现这样子有点自欺欺人的感觉,在不断地理解中终于在一定程度上理解了监听器,并学会了使用监听器,个人认为,在使用监听器的使用中,第一要务是要清楚各个监听器的作用:ActionListener是用来对一个动作进行监听,比如说我们在按下一个按钮的时候可以得到这个按钮上的指令(使用getActionCommand),在使用MouseListener的时候,我们可以跟踪鼠标的动作,具体在这个项目中就是可以得到画图时的坐标位置,即使用mousePressed、mouseReleased两个方法,当然,还要在鼠标释放时调用画图形的方法,如下所示:

public void mouseReleased(MouseEvent e){
   
    //得到鼠标释放时的坐标
    x2 = e.getX();
    y2 = e.getY();
   
    Shape sh = null;
    //作图
    g.setColor(c);
    if("直线".equals(shape))
    sh = new Line(x1,y1,x2,y2);
    if("矩形".equals(shape))
    sh = new Rect(x1,y1,x2,y2 );
    if("圆形".equals(shape))
    sh = new Oval(x1,y1,x2,y2);
   
    //设置颜色
    sh.setColor(c);
    //调用绘制的方法
    sh.draw(g);
    //用队列保存
    list.add(sh);
   
    }//End of mouseReleased

    接下来,就开始是画图的算法了,在我的另一篇博文中有提到我在纠结矩形的算法,后来,在思考和交流中,思考出两种实现方法,如下(一种是画矩形,另一种是画圆形,但是画圆形的方法可以转化到画矩形中来):

     //画矩形的方法
     g.drawLine(x1, y1, x2, y1);
    g.drawLine(x1, y1, x1, y2);
    g.drawLine(x1, y2, x2, y2);
    g.drawLine(x2, y1, x2, y2);

    //画圆
     if(x2 > x1 && y2 > y1)
g.drawOval(x1, y1, x2 - x1, y2 - y1);
    if(x2 > x1 && y1 > y2)
g.drawOval(x1, y2, x2 - x1, y1 - y2);
    if(x1 > x2 && y1 > y2)
g.drawOval(x2, y2, x1 - x2, y1 - y2);
    if(x1 > x2 && y2 > y1)
g.drawOval(x2, y1, x1 - x2, y2 - y1);

没错,在画矩形的时候,我把它转化为了四条首尾相接的直线了。由于我的画板只简单实现了矩形和圆形、直线,故没有其他图形的算法介绍了。
    第三,就是构造器了,这个不是太纠结,我在写构造器时,最常出现的一句注释就是:构造器传参,相信大家对这点都有了解,下面是监听器中的构造器:

//构造器传参
public DrawListener(java.awt.Graphics g,
                             List<Integer> list){

this.list = list;
this.g = g;

}//End of constructor of DrawListener

    最后一个就是重绘了。首先,我们知道在重绘时,我们需要使用JFrame中的paint方法,在使用这个方法时,我们得先调用JFrame中的paint方法,即使用super关键字调用。
在重绘的过程,很重要的一点是先得使用list:List list = new ArrayList();用来存储图形的形状,这点我们在mouseReleased的方法中可以看到如何将图形保存到list中:
           /**
*重写JFrame中的paint方法
*/
public void paint(Graphics g){

//首先实现JFrame中的paint方法
super.paint(g);

//遍历队列,获得图形,实现重绘
for(int i = 0; i < list.size(); i ++){

//得到list中的坐标
Shape sh = (Shape) list.get(i);
//重绘
sh.draw(gR);

}//End of for

}//End of paint

    以上就是我在做画板时遇到的几个问题,也是认为一些重要的东西,至于其他的窗体显示神马的,由于写过的次数太多,在此不想再罗嗦了,此外,我的画板有点靠近系统的画板的是,我的画板在底部的面板上添加了一些颜色按钮,可以直接点击获得颜色,此处也是关系到监听器的使用,另外,颜色选择器也添加在左边面板上,其调用在actionPerformed中。这个画板的界面在附件里,可以打开看一看。
    当然,画板我还会继续的,因为我的习惯是,追求完美,而且,开发画板绝对不是想淘汰掉现在的大家使用的画板,只是一种学习水平的检验。现在的画板有点不堪入目,初具雏形罢了,如题所示,这只是魔幻蓝诗@画板3.0版(不过可想而知前两个版本有多锉了),现在准备进入下一代,相信一定会有多改观的。到时,在让大家再看看,不过可能要一些时日了,最近的课程和实验不少,而且还有三个比赛在等着我。但是,无论如何,加油吧!

   PS:个人认为,我们在开发各种项目时应该遵循模块化设计的理念,即一个方法只做一件事。
  • 大小: 55.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics