魔幻蓝诗@画板3.0

学习Java初期(现在也在初期),做了一个简单的画板,时至今日,才打开ItEye(时过境迁,JavaEye已经强制转型为ItEye了,可叹啊)开始回顾我的画板诞生的全过程,由于个人偏好,本人将我开发的东东通通冠以“魔幻蓝诗”商标,如有雷同,铲草除根 :D 。

首先,阐述一下个人认为的开发画板的技术点:监听器的使用、画板的重绘(牵涉到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:个人认为,我们在开发各种项目时应该遵循模块化设计的理念,即一个方法只做一件事。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值