之前觉得做个画图板挺简单的,虽然有些不屑,但还是试了下,结果。。哎,什么是眼高手低啊。。终于明白了。。
虽然还是做出来了,但还是遇到了许多细节问题,这里想分享下,希望有所帮助。。
分享源码(免积分):http://download.csdn.net/detail/skl_tz/5354797
1、添加按钮以及设置窗口应该放在设置窗口可见之前,而 添加鼠标侦听应该放在设置窗口可见之后
2、鼠标侦听器可能为接口或者抽象类,所以应当创建一个实现类(api中或许有,没验证就不说了),由于是在不同的类中,所以应当通过传递对象的方式,传递想要传递的参数(参数可以在另一个类中通过对象调用),这样既符合面向对象的思想,也更加方便调用参数。
3、在验证从窗口按钮传过来的参数(command)时,不能使用这样的方式验证 command.equals("直线") ,因为command为变量,如果传递过来的值是null,则会出现空指针异常,所以最好使用这样的语法 "直线".equals(command) (“直线”为常量,不可能为空)
4、在绘制矩形或者是椭圆时,因为方法中只有所画图形的左上角坐标,所以应当对坐标进行转化,可以这样使用这样的方式
g.drawRect( x1 x2中较小值 , y1 y2中较小值 , width, height); 感兴趣的朋友可以验证下
5、最最重要的部分,那就是画曲线了,虽然原理不复杂,但是由于涉及到两个接口(MouseListener 和 MouseMotionListener),解释下:MouseMotionListener 中的mouseDragged()方法用来实现触发鼠标的轨迹变化(鼠标按下后,不断触发此方法),当鼠标进入窗口,并按下时,得到第一个坐标,第二次触发时,就可以画出第一条直线了,接着随着轨迹不断改变,mouseDragged()方法也被不断触发,此时不断将前一个坐标与后一个坐标交换,就可以画出n个 在极短时间间隔内的 连续直线, 也就是一条曲线了。。但是,如何知道 获取的是第一个坐标呢,这里就涉及到了MouseListener 这个方法中的mousePressed()和 mouseReleased() 方法了,分别可以记录鼠标按下,以及鼠标释放后清除记录。这里传参挺麻烦的,极容易出错,所以就有了接下来这个更好的解决方案了。。
*抽象类MouseAdapter这个类继承了接 MouseListener 和 MouseMotionListener ,并且将原有的抽象方法都重写为方法体为空的非抽象方法,也就是说,我们可以只实现我们需要的方法,而不去实现多余的方法,而且合并后就省去了传参的烦恼,一举多得啊 。。感兴趣的朋友可以去试试。。