重绘指的是,将画出来的图形进行保存,重绘分为三种:记坐标,记点,记步骤。
我们在此主要讲习记坐标的方法;
如果我们想要画出一个直线,最主要的是要记录它的两个坐标,所以我们应该建立一个数组来记录,这两个坐标。
代码如下:
public class Shape {
int x1,y1,x2,y2;
String name;
Color color;
public Shape(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
}
//这里就需要重新建一个类来保存坐标。这一步应该为第一步,应首先建立一个类
public class DrawFrame extends JPanel {
Shape[] shape = new Shape[20];
//这里建立一个shape数组;同时extends为的是要重写那个JPanel中的方法;
// 设计左侧的布局
// JPanel jp2 = new JPanel();
this.setPreferredSize(new Dimension(850, 700));
this.setBackground(Color.WHITE);
jf.add(this);
/***********/
this.addMouseListener(lg);
this.addMouseMotionListener(lg);
这里的this指的是我们的面板,我们在重写方法的时候要吧画图的那个JPanel来用this的方法使用。
public void paint(Graphics g) {
super.paint(g);
for (int i = 0; i < shape.length; i++) {
if (shape[i] != null) {
if ("直线".equals(shape[i].name)) {
g.setColor(shape[i].color);
g.drawLine(shape[i].x1, shape[i].y1, shape[i].x2,
shape[i].y2);
}
if ("圆形".equals(shape[i].name)) {
g.setColor(shape[i].color);
g.drawOval(Math.min(shape[i].x1, shape[i].x2), Math.min(shape[i].y1, shape[i].y2), Math.abs(shape[i].x1 - shape[i].x2),
Math.abs(shape[i].y1 - shape[i].y2));
}
if ("正方形".equals(shape[i].name)) {
g.setColor(shape[i].color);
g.drawRect(Math.min(shape[i].x1,shape[i].x2), Math.min(shape[i].y1, shape[i].y2), Math.abs(shape[i].x1 - shape[i].x2),
Math.abs(shape[i].y1 - shape[i].y2));
}
}
}
}
//这里的是最重要的一步重写,是重写JPanel中的方法,paint方法是在JPanel中自动调用的。所以不用刻意添加。
private Shape[] shape;
private int index;
public void setShape(Shape[] shape) {
this.shape = shape;
}
//这里就是在监听类中添加方法,这里是将shape传到监听机制的类中。
Shape line = new Shape(x1, y1, x4, y4);
line.name = "直线";
line.color = co;
shape[index] = line;
index++;
//接着就是在每一个方法中添加那个数组来保存坐标。
这样重写就完成了,谢谢!