java图形重绘

 当我们改变画图板时(如改变画图板尺寸大小时),会发现你绘制的图像在移动过程中消失了,这是为什么呢,我们又该如何解决这种问题呢?

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值