读书人

画图板小结

发布时间: 2012-08-17 02:08:34 作者: rapoo

画图板总结
画图板做了许久,其实大部分是之前所学的综合。这篇总结繁琐嗦,其实是写给自己的,看着写过的画图板,算是理理自己的思路。
用到的知识点主要是三大块:
1.窗体布局,面板,工具条,按钮等的添加和设计;
2.监听器的使用 ;
3.类和对象,值的传递;
首先,观察XP画板良久,从其外观开始着手。学过的布局方式有四grid,border,flow,还有一种是null,这个在设置调色板时会用到。选择的是窗体默认的border方式,很明显,WEST应当放置工具栏,CENTER即为画图区域,SOUTH是颜色栏域。为方便设置布局,首先各区域先添加面板。
单独创建继承自面板类的工具栏类和颜色类,一是由于都需要添加添加按钮,按钮图标,键钮监听器等,这样能使主函数简洁清晰。二是可通过实例化对象调用其属性和方法
工具栏可以移动,所以先添加JToolBar,再添加按钮。按钮上有图标,不同按钮的状态也不一样,这做起来虽不难,却繁琐的很。还好,龙哥教了我们一招很绝的方法,一切轻松解决。在保存图标,注意以一定的规律命名,这样既方便利用For循环,又方便获取按钮命令值。注意的是,图标的图片要存在与SRC平级的包下,图片格式必须为JPG。
颜色栏的设置与工具栏大同小异,只是颜色栏分为调色板和颜料盒两个区域。颜料盒面板设置为网格区域,调用JAVA中自带 的颜色类,创建静态数组,for循环创建按钮,设置其背景色即可。不同的是,为实现调色板区域的标签重叠效果,用到了null这个布局,然后调用标签的setbounds方法即可。这是布局方发的拓展了。
外观说完,再说内在的。工具栏和颜色栏色每一个按钮都需要添加监听器,并需要返回其按钮命令值。工具栏在for循环中添加ACTONLISTENER就好,但颜色栏中,为了实现鼠标左键选择前景色,右键选择背景色这一功能,要通过鼠标监听器的区别左右键的方法。但是如果直接添加鼠标监听器又必须重写其所有方法,很麻烦,所以用到了MouseListener的抽象子类MouseAdapter。
重点是画布部分。
要在画布上作画,先要获取工具类型和颜色按钮背景颜色,还需添加监听器。创建继承自MouseAdapter的画布监听器类,原因与前述相同。实例化画布监听器对象时传入工具,颜色面板对象,再在画布监听器中将这些对象声明为公共属性就可以通过对象名.方法名,或对象名.属性名调用。
最头疼的是图像的保存和重绘这一块。三种方法,队列,二维数组,最后一种是二维数组的改进版。
(1) 用队列保存涉及到动态数组,泛型,抽象类及其子类的运用。思路是先定义一个图像抽象类,再将所有绘制方法均单独创建成继承自该类的图像类,定义动态数组类,存储的是图像类对象。抽象类在这里是作为动态数组存储的类型,是存储类型和绘制类型之间的桥梁。
(2)二维数组保存法的基本思想是将整个画布每个点及其颜色都保存起来,数组下标本身即为点坐标,数组中存储的是点的颜色。创建二维数组,必须注意的是,二维数组是先读取行下标再到列下标,所以行下标对应的是画布的纵坐标,列下标是横坐标,数组行数是画布长,列数为画布宽。获取画布的点先要截屏,这里用到了Robot类,调用其createScreenCapture先截屏,返回一个BufferedImage对象,再调用该对象的getRGB(j, i)方法获取个点颜色存入数组即可。
(3) 跟二维数组一样要先截屏,只是这里直接保存的是BufferedImage对象。
重绘的关键是重写画图面板的paint方法,该方法在组件每次改变状态时会被自动调用一次。思路是一样,创建画图面板内部类,实力该内部类对象,只是取出存储的图像方式和绘制方法不同。
(1)在paint方法中遍历队列取出存储的图像对象,调用抽象类中的方法重绘。
(2)在paint方法中遍历二维数组取出存的点及其颜色,绘制所有的点即可。
遇到的问题:1.画布面板如果没有放在窗体左上角,绘制时图像会偏移。
解决:将画图面板传入画布监听器,调用mousePressed方法时再获取画布
2.数组存储时,将数组声明为全局属性,最后却无法保存
解决:原来是实例化的时候又声明了一次
3.重绘的方法中总是报对象为空
解决:需要对对象是否为空做判断
4.向上绘制矩形等是图形发生偏移
解决:调用Math.min方法和Math.abc方法

读书人网 >其他相关

热点推荐