`
狼迹天涯
  • 浏览: 6860 次
  • 性别: Icon_minigender_2
文章分类
社区版块
存档分类
最新评论

画板重绘

    博客分类:
  • java
阅读更多

画图板重绘

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

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

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

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

还出现在窗体上。

那么如何实现重绘?


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

分享到:
评论

相关推荐

    易语言画板做进度条

    4. **事件处理**:在易语言中,我们需要监听窗口或画板的特定事件,比如“窗口初始化”或“画板重绘”。在这些事件的处理函数中,我们可以调用绘制函数来更新进度条的显示。 5. **进度更新**:当程序执行的任务进度...

    易语言用画板来做进度条

    在易语言中,我们可以通过编写事件处理程序,如“画板重绘”事件,来控制画板上的内容显示。 制作进度条的关键步骤包括以下几个方面: 1. **创建画板组件**:在易语言的界面设计中,添加一个画板组件到窗体上,...

    易语言画板自绘

    易语言画板自绘源码,画板自绘,标尺子程序_绘制标尺刻度,恢复鼠标状态,无拖动时激活恢复,刻度区重绘,客户区重绘,二级缓冲绘制,客户区刷新,选中辅助线,高亮辅助线,拖动辅助线,客户绘制的图形,GetProp,SetRect,SetProp,...

    易语言画板自绘编辑框

    4. **内存位图**:为了提高效率和避免频繁的屏幕重绘,通常会使用内存位图来保存当前画板的状态。当需要更新画板时,将内存位图的内容复制到窗口上,而不是重新绘制所有图形。 5. **文本处理**:除了图形绘制,自绘...

    易语言画板自绘界面

    在易语言中,开发者需要理解窗口消息机制,比如WM_PAINT消息,这是窗口需要重绘时发送的消息。收到该消息后,开发者需要在OnPaint事件中执行自绘代码,确保界面的更新。同时,界面的绘制应考虑效率,避免不必要的重...

    e语言-易语言画板自绘列表

    3. 事件响应:设置画板的绘图事件,如WM_PAINT消息,当需要更新画布时,调用绘制逻辑函数进行重绘。 4. 数据管理:存储列表项的数据结构,如数组或列表,用于驱动绘图逻辑。 5. 用户交互:处理鼠标和键盘事件,使...

    易语言画板自绘列表框

    1. **自绘机制**:自绘的核心在于响应窗口的重绘事件,通过`窗口过程`函数捕获并处理这些事件。在易语言中,你需要覆盖默认的绘制行为,使用`画图`命令绘制列表框的背景、条目和选中状态。 2. **列表重画**:在列表...

    易语言画板自绘列表

    在这个“易语言画板自绘列表”主题中,我们主要讨论的是如何在易语言环境下创建和操作自绘列表,这涉及到多个核心概念和技术。 首先,**画板**是编程中常见的一种图形用户界面(GUI)组件,它允许程序员在上面进行...

    易语言画板自绘源码.rar

    在这个源码中,开发者需要实现OnPaint事件,该事件会在控件需要重绘时被触发,用于执行实际的绘图操作。 2. **图形API的使用**:易语言提供了丰富的图形API,如画线、画圆、填充颜色等。这些函数可以用来在控件上...

    e语言-易语言画板自绘界面

    6. **图形缓存**:掌握如何利用内存中的位图进行图形缓存,提高界面重绘性能。 7. **界面交互设计**:设计并实现用户与自绘界面的交互逻辑,如按钮点击、拖放操作等。 8. **源码分析**:通过对提供的源码进行分析...

    MFC实现高仿画板、绘图软件功能(带详细注释)

    在VS2015环境下,利用MFC框架实现的一款高仿“画图”工具,实现绝大部分功能甚至更多创新点。(注释超详细) 实现了点、直线、曲线、折线、矩形、圆形、多边形等等形状,并且具有区域限制、鼠标捕捉等功能;...

    易语言画板自绘源码.zip易语言项目例子源码下载

    2. **事件驱动编程**:易语言是基于事件驱动的,源码中会包含各种事件处理函数,如`鼠标点击事件`、`窗口重绘事件`等。这些事件触发相应的绘图操作,实现动态效果。 3. **坐标系统和绘图模式**:了解易语言中的坐标...

    易语言画板自绘列表框源码

    1. **注册消息处理**:首先,我们需要注册WM_PAINT消息,当系统需要重绘列表框时,会发送这个消息。在易语言中,这通常通过`窗口过程`或`消息过滤`函数实现。 2. **初始化画笔和刷子**:在自绘开始前,我们需要设置...

    e语言-易语言利用画板实现自绘列表

    2. **绘制列表项**:在画板的重绘事件中,我们需要遍历数据源,根据每一项数据的内容和格式,在画板上进行绘制。这可能涉及到字符串格式化、字体设置、颜色选择等细节。 3. **滚动处理**:为了实现滚动功能,需要...

    易语言-易语言画板滚动条

    在易语言中,画板通常会有一个与之关联的事件,例如“画板重绘”事件,当画板需要更新时(如滚动条移动),这个事件会被触发。在这个事件处理程序中,我们会根据滚动条的位置来决定应该在画板上显示哪一部分的图片。...

    易语言画板自绘编辑框源码.7z

    6. **优化性能**:自绘可能会带来额外的性能开销,因此在实现自绘编辑框时,需要注意尽可能减少不必要的重绘,例如使用更新区域或者双缓冲技术来提高效率。 7. **兼容性与扩展性**:自绘编辑框可能需要考虑与其他...

    易语言-易语言利用画板实现自绘列表

    易语言中的事件处理是编程的核心部分,比如"画板重绘"事件,当画板需要更新时,会触发这个事件,我们在这里编写绘制列表的代码。此外,还有"鼠标点击"事件,可以用来处理用户的交互,如选择列表项。 再者,要掌握...

    ios手绘画板app

    - 使用离屏渲染优化,避免在屏幕更新时频繁的重绘操作。 - 如果可能,可以采用OpenGL或Metal进行更底层的图形处理,提升性能。 11. **测试与适配**: - 在不同尺寸和分辨率的设备上进行测试,确保界面适应性和...

    易语言-通过画板实现标签透明

    3. 处理绘图事件:在画板的"画板重绘"事件中,首先清空画板(通常用白色填充),然后根据需要调整画笔的颜色、透明度等属性。接着,使用"绘制文本"命令在画板的指定位置绘制标签的内容。 4. 实现透明效果:透明度...

Global site tag (gtag.js) - Google Analytics