当我们改变画图板时(如改变画图板尺寸大小时),会发现你绘制的图像在移动过程中消失了,这是为什么呢,我们又该如何解决这种问题呢?
Java窗体是写好的代码绘制出来的,每次改变窗体都会重绘组件,所以需要保存下来图形的数据,并在重写绘制窗体方法
1.创建子类继承JFrame
public class MFrame extends JFrame {
//重写组件的paint方法
public void paint(Graphics g){
//1.保留绘制组件的功能
super.paint(g);
}
在保留原有paint方法基础上,重写重绘功能。
2.创建一个类,通过对象来保存图形数据,并实现绘制图形的功能
public class Shapes {
//属性
public int x1,y1,x2,y2;
public String name;
public Shapes(int x1,int y1,int x2,int y2){
this.x1=x1;
this.x2=x2;
this.y1=y1;
this.y2=y2;
}
//方法:根据保存的数据还原图形
public void drawShape(Graphics g){
switch (name){
case "直线":
g.drawLine(x1,y1,x2,y2);
break;}
如重绘直线,需要保存起点和端点坐标,并画一条直线。建议用构造函数来保存,会简单一些。
3.创建数组来保存对象,进而保存对象中的图形数据
public class DrawMouse implements MouseListener, ActionListener {
//定义Shapes数组,保存图形对象
public Shapes[] shapeArr = new Shapes[100];
注意:在DrawListener中创建,因为是在每次完成绘图功能时就要保存数据。
4.将图形数据保存到数组中,并通过数组下标区分
Shapes shape=new Shapes(x1,y1,x2,y2);
shapeArr[index]=shape;
index++;
5.在继承JFrame子类中重写paint方法
//循环遍历数组中的数据
for(int i=0;i<shapeArr.length;i++) {
Shapes shape = shapeArr[i];
//NullPointerException 空指针异常
//用空对象调用属性/方法 null.drawShape(g);
if (shape != null) {
shape.drawShape(g);
}
}
注意避免空指针异常问题,且要在DrawUI类中将DrawListener的数组传递给继承JFrame的子类
public void initUI(){
MFrame jf = new MFrame();
jf.setTitle("画图工具");
jf.setSize(900,900);
jf.setLocationRelativeTo(null); //居中显示
jf.setDefaultCloseOperation(3); //退出进程
//流式布局
FlowLayout flow = new FlowLayout();
jf.setLayout(flow);
DrawMouse mouse = new DrawMouse();
//把shapeArr数组,从DrawMouse类传递给MFrame类
jf.shapeArr = mouse.shapeArr;