`
时间被海绵吃了
  • 浏览: 6401 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
文章分类
社区版块
存档分类
最新评论

画图板重绘功能的改进

 
阅读更多
之前的画图板重绘功能是用每个形状的信息存储的(具体见前一篇博客),但是我们发现这样做既让代码冗长,又会出现很多错误,所以我们采用新的方法来重绘,这里就利用了Java里面向对象的思想。

首先是将自定义队列List进行改进,让这个队列不再存储很乱的信息像既有坐标又有颜色什么的,而是直接将一个形状封装成一个对象存储进队列,这样画一个形状存储一个,既不会出现前一篇博客中的类转换异常,又使代码简洁。

以直线举例:
if("line".equals(shape_command))		
{
	if(x1!=x2&&y1!=y2)
	{
		shape = new Line(x1, y1, x2, y2,color_command);
		shape.draw(g);
		list.add(shape);
	}
}

如上,直线被封装成了一个shape类,在list里存储的也就是这些shape类型了

由代码可以看到Shape类的创建中还用到了直线类Line,这是因为Shape类只是一个抽象的思想,
它是所有指定形状的共同点的体现,代码如下:
/** 
 * 顶级形状类 
 * */
public abstract class Shape {

	//形状的坐标
	public int x1,y1,x2,y2;
	
	//形状的颜色 
	public Color color;
	
	//画笔的宽度
	public int width;
	
	//矩形的圆角系数
	public int round;
	
	//是否填充
	public boolean isfill;
	
	public Shape(int x1,int y1,int x2,int y2,Color color)
	{
		this.x1 = x1;
		this.y1 = y1;
		this.x2 = x2;
		this.y2 = y2;
		this.color = color;
	}
	
	public abstract void draw(Graphics g);
}


所以其他形状只要继承它即可。以直线举例:
public class Line extends Shape{

	//构造方法
	public Line(int x1, int y1, int x2, int y2, Color color) {
		super(x1, y1, x2, y2, color);
	}

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


最后,List的代码也要相应改成存储Shape的了:
public class MyList {
	private Shape[] srcArray = new Shape[0];
	
	//获取数组长度的方法
	public int length()
	{
		return srcArray.length;
	}
	
	//获取元素的方法
	public Shape get(int i)
	{
		return srcArray[i];
	}
	
	//清空所有元素的方法
	public void clear()
	{
		srcArray = new Shape[0];
	}
	
	//在数组的最后添加元素的方法
	public void add(Shape elements)
	{
		Shape[] destArray = new Shape[srcArray.length+1];
		for(int i=0;i<srcArray.length;i++)
		{
			destArray[i] = srcArray[i];
		}
		destArray[srcArray.length] = elements;
		srcArray = destArray;
	}

	//删除一段区间元素的方法
	public void delete(int start)
	{
		if(start ==0)
		{
			clear();
		}else
		{
			Shape[] destArray = new Shape[start];
			for(int i=0;i<start;i++)
			{
				destArray[i] = srcArray[i];
			}
			srcArray = destArray;
		}
	}
	
	public void print()
	{
		for(int i=0;i<srcArray.length;i++)
			System.out.println(srcArray[i]);
	}
}
分享到:
评论

相关推荐

    C# 仿window画图板

    当控件需要重绘时,系统会触发这个事件。我们可以在事件处理函数中使用`Graphics`对象来绘制线条、曲线、形状等。 3. **Graphics对象**:`System.Drawing.Graphics`类是用于在设备上下文上执行图形操作的核心类。...

    android之简易绘图板

    9. **性能优化**:尽管这个项目未使用双缓冲,但可以通过其他方式优化性能,例如减少不必要的重绘,合理使用缓存,或者在适当时机清理绘图内容。 总之,“android之简易绘图板”项目虽然简单,但它涵盖了许多...

    基于VC++MFC程序设计简易画图板.doc

    《基于VC++ MFC程序设计简易画图板》是一篇本科毕业论文,主要探讨了如何使用微软的Visual C++(VC++)集成开发环境和Microsoft Foundation Classes (MFC)库来构建一个简单的画图应用程序。MFC是微软提供的一套C++...

    Java 从零开始实现一个画图板、以及图像处理功能,代码可复现.doc

    在本文档中,我们将探索如何使用Java从零开始构建一个画图板,并实现一系列图像处理功能。这个项目适合Java初学者,通过逐步迭代的方式降低学习难度。以下是实现这些功能的关键知识点: 1. **图形用户界面(GUI)**:...

    ios手绘画板app

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

    panel上画图

    - **受保护方法 PaintWindow**: 覆写了 `TPanel` 的 `PaintWindow` 方法,此方法在每次重绘面板时被调用。在此方法中,锁定画布,设置其句柄为设备上下文 (DC),执行绘制操作后释放 DC 并解锁画布。 - **构造函数 ...

    java版画图程序

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

    C#小弹球

    游戏循环是通过定时器(Timer)或异步操作来实现的,每帧更新游戏状态并重绘画面。 碰撞检测是弹球游戏的核心部分。开发者需要编写代码来判断弹球与挡板、墙壁或其他障碍物是否发生碰撞,并根据碰撞角度改变弹球的...

    gmt安装包(gmt 6.0.0-win64;gawk-3.1.6-1;gs921w64;gsv50w64)

    2. **数据处理**:可以对数据进行滤波、插值、统计分析,甚至进行重采样和空间插值。 3. **绘图模块**:包括等值线绘制、点、线、多边形的绘制,以及颜色梯度填充等,支持自定义颜色表和透明度设置。 4. **3D可视化*...

Global site tag (gtag.js) - Google Analytics