画板重绘

画图板重绘

在制作画图板的过程中,出现一个问题。当画图板最小化之后,再还原,之前画过的图形会消失,又需要重新画,

但画出来的图形就和之前的不一样了,很不方便。

为解决这个问题,就需要用到画图板重绘。

所谓重绘,就是将把原来画的图形重新在窗体中画出来,即当我们最小化窗体或者弹出颜色选择器时,原来的图形

还出现在窗体上。

那么如何实现重绘?


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、调用重绘方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值