之前的画图板重绘功能是用每个形状的信息存储的(具体见前一篇博客),但是我们发现这样做既让代码冗长,又会出现很多错误,所以我们采用新的方法来重绘,这里就利用了Java里面向对象的思想。
首先是将自定义队列List进行改进,让这个队列不再存储很乱的信息像既有坐标又有颜色什么的,而是直接将一个形状封装成一个对象存储进队列,这样画一个形状存储一个,既不会出现前一篇博客中的类转换异常,又使代码简洁。
以直线举例:
如上,直线被封装成了一个shape类,在list里存储的也就是这些shape类型了
由代码可以看到Shape类的创建中还用到了直线类Line,这是因为Shape类只是一个抽象的思想,
它是所有指定形状的共同点的体现,代码如下:
所以其他形状只要继承它即可。以直线举例:
最后,List的代码也要相应改成存储Shape的了:
首先是将自定义队列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]);
}
}