`
卿黛如画
  • 浏览: 13486 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

画图板中两种重绘方式的实现与区别

 
阅读更多

1、是通过队列来实现的。 

      简单说就是通过队列来存储你画的信息。 但是除了这些除了需要自定义队列,还需要创建一个形状的抽象类,这里包括一些绘制形状的共同属性和方法。

(1)自定义队列

这里最好能够使用泛型。

泛型是指在定义类时,先不指明具体类型,而是等到实例化时再指明。

 

public class MyArray1<E>{
	//创建一个数组对象,数组长度为0
	Object array[]=new Object[0];
	//创建返回元素下标的值
	int x=0;
	/**
	 * 添加一个值为s的元素
	 * @param s  添加的元素的值
	 */
	public void add(E e){
		//再次创建一个数组,数组的长度为原数组+1
		Object array1[]=new Object[array.length+1];
		//将数组array中的元素复制到array1中
		for(int i=0;i<array.length;i++){
			array1[i]=array[i];
		}
		//设置最后一个元素为新添加的元素
		array1[array.length]=e;
		//将原数组变量指向新数组
		array=array1;
	}
}

 

 在这个自定义队列中,可以实现数据的增加、取得、删除、插入、修改以及队列长度的取得等功能。

 在窗体类中实例化自定义队列的对象,为了方便引用设置为了静态。

 

// 定义一个用来保存形状的队列
public static MyArray<Shape> shapes = new MyArray<Shape>();

(2)定义一个抽象的形状类,并使绘制的各种图形继承它

定义一个抽象形状类,包含形状所共有的属性,和抽象方法

public abstract class Shape {
	int x1,y1,x2,y2;
	Color color;
	public abstract void draw(Graphics g);	

}

 

举例说明,定义一个具体的形状类(如:直线),继承上述抽象的形状类:

public class Line extends Shape {

	public void draw(Graphics g) {
		g.setColor(color);
		g.drawLine(x1, y1, x2, y2);
	}

}

 

(3)在监听器中实现图形的存储

if (type.equals("line")) {
			// 创建直线对象
			Shape sh = new Line();
			sh.x1 = x1;
			sh.y1 = y1;
			sh.x2 = x2;
			sh.y2 = y2;
			sh.color = color;
			
			//绘制形状
			sh.draw(gr);
			//将形状对象存入队列
			DrawUI.shapes.add(sh);
			

		} else if (type.equals("rect")) {
			Shape sh = new Rect3D();
			sh.x1 = x1;
			sh.y1 = y1;
			sh.x2 = x2;
			sh.y2 = y2;
			sh.color = color;
			
			//绘制形状
			sh.draw(gr);
			//将形状对象存入队列
			DrawUI.shapes.add(sh);

  (4)在绘画面板处实现重绘

JPanel panel=new JPanel(){
            public void paint(Graphics g) {
		// 调用父类的方法来正确的绘制窗体
		super.paint(g);

		// 遍历形状队列,重新绘制图形
		for(int i=0;i<shapes.size();i++){
			Shape sh = shapes.get(i);
			//绘制形状
			sh.draw(g);
		}

	}
};

 

2、截屏之后遍历像素点实现重绘

       其原理为获得一个截屏,用二维数组记录每一点的颜色。重绘时,每一点颜色展示出来。即可以重绘了。

(1)由于截屏的方法需要用到机器人对象,所以首先创建一个机器人对象 

需注意的是,机器人不能通过new来直接创建 

       java.awt.Robot robot;
	public static int image[][];

	// 创建监听器对象的时候要求传入一个画布对象
	public DrawListener(Graphics gr, ButtonListener blis, JPanel panel) {
		this.gr = gr;
		this.blis = blis;
		this.panel = panel;

		try {
			robot = new java.awt.Robot();
		} catch (AWTException e) {
			e.printStackTrace();
		}

	}

 (2)截屏以及存储的实现

		// 获取绘画面板左上角的位置和窗体大小
		Point p = panel.getLocationOnScreen();
		Dimension dim = panel.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);
			}
		}

 需要注意下标与坐标的区别:
下标:先纵后横,先行后列;坐标:先横后纵

并且最好不要使用窗体得到截屏的效果,否则会出现标题栏那一部分的偏差,最好选择使用绘画面板。

(3)重绘的实现

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);
			}
		}
	}

}

 

3、两种重绘方式的优劣

 

当数据不是很大时,第一种方法,程序运行次数较少。 
当数据较大时,第一种方法,程序运行次数较多,第二种就比第一种简单。

不管画成什么样,第二种方法 记录的点颜色个数是一样的。而第一种随着形状的个数越来越多,存入的也越来越多。 

 

 

分享到:
评论

相关推荐

    BMP格式解析与保存 画图板的重绘

    在本文中,我们将深入探讨BMP格式的解析与保存,并结合画图板的重绘功能来讲解这一主题。 首先,我们需要理解BMP文件的结构。BMP文件分为两部分:文件头和图像数据。文件头包含文件信息,如文件大小、图像宽度、...

    Java画图板应用

    为了提供类似Windows画图板的橡皮擦功能,Java画图板应用可能实现了两种模式:一种是使用特定的橡皮擦工具,另一种是将画笔颜色设置为背景色,从而达到擦除的效果。此外,添加形状绘制功能,如矩形、圆形和多边形,...

    类似画图板的小程序-windows

    一般视图缩放的实现是通过DC的两个函数来实现:SetViewportExt和SetWindowExt,但是这两个函数只在MM_ISOTROPIC和MM_ANISOTROPIC这两种映射模式下有效果,而常用的带滚动条的视图类CScrollView却不支持这两种模式...

    Java简易画图板

    在这个简易画图板项目中,Java用于实现图形用户界面(GUI)和图形绘制逻辑。 2. **图形用户界面(GUI)**:Java提供了JavaFX和Swing两个主要的库来创建GUI应用。本项目可能使用了Swing,因为它是一个相对成熟的库,...

    android画图板

    本文将详细解析"android画图板"这个主题,介绍如何在Android中实现一个基本的画线功能,并探讨两种不同的实现方法。 首先,我们要了解Android中的画布(Canvas)和画笔(Paint)概念。Canvas是Android图形系统的一...

    仿 XP 系统画图板

    4. **重绘机制**:为了保证画图板的实时性,开发者可能利用了JAVA的重绘机制,如`repaint()`方法,当画布上的内容发生变化时,会自动调用该方法进行更新,确保用户能即时看到画图的效果。 5. **图像处理**:除了...

    JAVA+C#画图板

    4. **重绘优化**:与Java类似,C#的画图板也需要考虑重绘优化,可能通过`OnPaintBackground`方法和双缓冲技术来防止屏幕闪烁。 5. **数据绑定**:在C#中,可以利用数据绑定将用户界面元素(如颜色选择器、线条宽度...

    用java编写的画图板程序

    5. **橡皮擦功能**: 橡皮擦功能的实现可能有两种方式:一是改变绘图颜色为背景色,二是记录画布上的像素信息并在需要时恢复。后一种方法更为精确,但实现起来也相对复杂。 6. **事件处理**: 用户交互是通过监听鼠标...

    简易画图板

    虽然功能相对有限,但该项目在开发过程中运用了两种重要的技术——橡皮筋技术和双缓存技术,这在图形用户界面的设计中具有一定的实践价值。 首先,我们来探讨一下**橡皮筋技术**。橡皮筋技术常用于实现拖拽选择或者...

    C#编的画图板

    4. **重绘机制**:当画图板需要更新时,如清除屏幕或覆盖现有图形,我们需要重绘整个窗口。这通常通过覆盖`OnPaint`方法来完成,使用`Graphics`对象绘制所有图形。 5. **图形状态保存和恢复**:`Graphics`对象提供`...

    基于VC MFC程序设计——简易画图板

    - **图形文件保存与重绘**:软件支持将绘制的图形保存为WMF(Windows Metafile)格式,这是一种矢量图形文件格式,能够保留图形的所有细节而不失真。重绘功能则确保了在编辑过程中图形能够实时更新显示,通常通过...

    mfc 画图板 程序文档

    ### MFC 画图板程序知识点详解 #### 1. 简介 MTJHDraw1.0是一款基于Microsoft Foundation Classes (MFC)框架的画图程序,它旨在模仿并扩展Windows自带画图程序的功能。该程序由测控0701班的学生毛天骄开发,学号为...

    Java语言实现的画图程序

    Java语言实现的画图程序是一种基于图形用户界面(GUI)的应用,它允许用户在屏幕上绘制各种形状,如圆形、矩形和直线,并提供了一系列的编辑功能,如线条粗细的调整、线条颜色的更改以及橡皮擦和清屏功能。...

    labview画图

    LabVIEW支持两种主要的绘图技术:GDI+(Graphics Device Interface Plus)和OpenGL。GDI+主要用于创建2D图形,适合日常的数据可视化;而OpenGL则提供更高级的3D绘图能力,用于构建复杂的三维模型和动画。 2. **...

    用c#编写绘图板源码(很详细的哦)

    5. **Paint事件**:在窗体的Paint事件处理函数中,通常会进行实际的图形绘制,因为每次窗体重绘时,都会调用这个事件。 6. **图像保存**:项目可能还包括将用户绘制的图形保存为图像文件(如BMP或PNG)的功能,这...

    c# visual studio 2005 制作高仿真画图程序

    8. **重绘机制**:为了响应窗口大小变化或其他原因导致的重绘,可以覆盖Control类的OnPaint()方法,使用Graphics对象在Paint事件中进行绘制。 9. **源代码结构**:项目通常包括多个文件,如Form1.cs(包含用户界面...

    Android-LittleDrawBoardPC端是基于Socket实现的android端和PC端同步绘画板

    "Android-LittleDrawBoardPC端"就是这样一个案例,它实现了Android与PC之间的实时同步绘画功能,利用了Socket通信技术,让两端用户可以共享创作空间,共同进行绘图操作。本文将深入探讨这一技术的核心概念和实现细节...

    android画图源码

    在Android中,通常有两种方式实现屏幕上的图形绘制:`View`和`SurfaceView`。`View`适合于更新频率较低、交互性强的图形,而`SurfaceView`适用于需要高性能连续动画的场景。根据描述,此源码可能基于`View`类进行了...

    信息技术教案——画图.pdf

    退出“画图”窗口有两种方式:点击标题栏的“关闭”按钮或选择“文件”菜单中的“退出”命令。 课堂小结回顾了画图程序的基本操作,强调了铅笔工具的使用和颜色选择。扩展练习鼓励学生创新,设计出“美丽家园”的...

    java版画图程序

    这种方式可以避免频繁的屏幕重绘,提升用户体验。 6. 布局管理: Swing提供了一系列的布局管理器,如FlowLayout、BorderLayout、GridLayout等,它们决定了组件在窗口中的排列方式。选择合适的布局管理器可以有效地...

Global site tag (gtag.js) - Google Analytics