画图板重绘
在制作画图板的过程中,出现一个问题。当画图板最小化之后,再还原,之前画过的图形会消失,又需要重新画,
但画出来的图形就和之前的不一样了,很不方便。
为解决这个问题,就需要用到画图板重绘。
所谓重绘,就是将把原来画的图形重新在窗体中画出来,即当我们最小化窗体或者弹出颜色选择器时,原来的图形
还出现在窗体上。
那么如何实现重绘?
1、利用泛型队列,将所有我们画过的图形保存在数组中,其中包括图形的种类,位置,及颜色。
2、我们画的图形有直线、矩形、圆等。。因此可以定义一个图形父类。
3、在还原窗体之后自动将数组中的每一个图形元素输出,即重新画出来。便可实现重绘。
一、
首先,定义一个抽象父类Shape类,包含坐标和颜色属性以及抽象的画的方法。
public abstract class Shape {
int x1,y1,x2,y2;
Color color;
public abstract void draw(Graphics g);
}
其次,定义一个泛型数组,将图形存入
public class MyArray<E> {
//定义一个长度为0的初始数组
Object[] src = new Object[0];
//s为要装入容器的数据,在主函数中为图形:MyArray<Shape> shapes = new MyArray<Shape>();
public void add(E s){
//定义新数组,长度是原始数组长度+1
Object[] dest = new Object[src.length+1];
//将原数组中的数据按下标顺序拷贝到新数组
for(int i=0;i<src.length;i++){
dest[i]=src[i];
}
//将新元素放到新数组最后一个下标位置
dest[src.length] = s;
//将新数组赋给原数组
src = dest;
}
// 取出对应下标位置的元素
public E get(int index){
//E为返回值类型。
if(index<0||index>=src.length){
throw new RuntimeException("传入的下标超出边界:"+src.length);
}
return (E)src[index];
}
// 容器中的元素个数
public int size(){
return src.length;
}
最后,在主函数中再次画出来,便实现了重绘。
public void paint(Graphics g) {
// 调用父类的方法来正确的绘制窗体
super.paint(g);
//public void paint(Graphics g):
//绘制容器。该方法将 paint 转发给任意一个此容器子组件的轻量级组件。
// 遍历形状队列,重新绘制图形
for(int i=0;i<shapes.size();i++){
Shape sh = shapes.get(i);
//绘制形状
sh.draw(g);
}
}
二、
首先,在Drawlistener类中,利用Point、Dimension和Rectangle等类,将整个窗体截取下,将整个窗体按照像素分割成一个一个的点,将点的颜色存入数组。
// 获取窗体左上角的位置和窗体大小
Point p = du.getLocationOnScreen();
Dimension dim = du.getSize();
// 创建矩形对象
java.awt.Rectangle rect = new java.awt.Rectangle(p, dim);
// 截取屏幕
BufferedImage img = robot.createScreenCapture(rect);
image = new int[img.getHeight()][img.getWidth()];
//将图像按照像素分割成一个一个的点,将点的颜色存入数组
for(int i=0;i<image.length;i++){
for(int j=0;j<image[i].length;j++){
//将颜色存入数组
image[i][j] = img.getRGB(j, i);
}
}
其次,在主函数中重绘,重绘方法中利用循环语句获取数组中的每个元素,即获取的颜色,
public void paint(Graphics g) {
// 调用父类的方法来正确的绘制窗体
super.paint(g);
// 如果数组存在,就重绘数据
if (null != DrawListener.image) {
// 重绘数组
for (int i = 0; i < DrawListener.image.length; i++) {
for (int j = 0; j < DrawListener.image[i].length; j++) {
// 获取颜色
int c = DrawListener.image[i][j];
// 创建颜色对象
Color color = new Color(c);
g.setColor(color);
g.drawLine(j, i, j, i);
}
}
}
}
最后,创建颜色对象,接收数组中每个元素,利用setColor方法设置点的颜色,再利用drawLine(x,y,x,y)方法画出这些点.
画板实现步骤总结:
1、主界面的绘制
需要运用Frame,Grahpics等类。
2、添加按钮监听器
继承鼠标监听器和事件监听器。
重写actionPerformed()等方法
在mousePressed方法中,获取光标位置
在mouseReleased方法中,进行选取图形的判断
3、图形类的定义
定义抽象父类Shape包含抽象Draw方法
绘制的直线、矩形、椭圆等可定义为子类,继承父类并实现Draw方法。
4、调用重绘方法