java Graphics repaint无法清除已经绘制的图形

我用自定义类构造了一个列表 使用变量里面的参数来绘制图形 点击button之后 修改列表的数据 调用repaint重绘 但是并不能消除之前的图形
不过如果直接使用一个变量t作为fillOval的部分参数来绘制图形 用同样的原理却能清除图形

代码如下

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;

import javax.swing.*;
//import javax.script.ScriptEngine;
//import javax.script.ScriptEngineManager;
//import javax.script.ScriptException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

class Bg{
    String col;
    double xMin,xMax,yMin,yMax;
}

class Pt{
    double x,y;
}

class Points{
    Boolean pad;
    String col;
    int wid,radius;
    ArrayList<Pt> p=new ArrayList<Pt>(); 
}

class Lines{
    String col;
    int wid;
    ArrayList<Pt> p=new ArrayList<Pt>();
}

class Line{
    String col,slope;  //斜率
    int wid;
    Pt p;
}

class Curve{
    String col,function;
    int wid,s,e;
}

class Shape{
    String col,type;
    int wid;
    double width,height,x,y;
    Boolean pad;
}

class Scale{
    String col,direction;
    int wid,from,amount,precision;
    double pos,step;
    
    public String toString()
    {
        return col+"\n"+wid+"\n"+direction+"\n"+pos+"\n"+from+"\n"+step+"\n"+amount+"\n"+precision+"\n";
    }
}

public class ConfigurableDrawing{
    int dFlag=0,eFlag=0;
    Scale ax;
    int length;
    int t,h;
    
    double xMax=1.0,yMax=1.0,xFrom=0,yFrom=0;
    
    JFrame frame=new JFrame("可配置绘图软件");
    MyCanvas canvas = new MyCanvas();
    JButton drawBtn=new JButton("绘图");
    JButton exmBtn=new JButton("配置样例");
    JTextArea text=new JTextArea(20,50);
    
    ArrayList<Scale> s=new ArrayList<Scale>();
    
    public ConfigurableDrawing()
    {
        frame.setBounds(100,100,1100,700);
        
        //设置分割面板
        JSplitPane sp=new JSplitPane();
        //支持连续布局
        sp.setContinuousLayout(true);
        sp.setDividerLocation(700);  
        sp.setDividerSize(4);
        
        JPanel p1=new JPanel(new BorderLayout());
        JPanel p2=new JPanel(new GridLayout(1,2,10,10));
        JButton drawBtn=new JButton("绘图");
        JButton exmBtn=new JButton("配置样例");
        p2.add(drawBtn);
        p2.add(exmBtn);
        
        p1.add(p2,BorderLayout.NORTH);
        
        text.setFont(new Font("楷体",0,16));
        JScrollPane jsp=new JScrollPane(text);
        p1.add(jsp);
        
        sp.setLeftComponent(canvas);
        sp.setRightComponent(p1);
        frame.add(sp);
        
        drawBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                dFlag=1;
                //s.get(0).step=0.2;
                creatXml();
                saveValue();
                
                canvas.repaint();
            }
        });
        
        exmBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                String xmlStr=turnXmltoString();
                text.append(xmlStr);
//                yMax=2.0;
//                step=0.2;
//                precision=2;
//                yFrom=0.2;
            }
        });
        
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
    public String turnXmltoString()
    {
        try {
            // 读取 xml 文件
            File fileinput = new File("test.xml");
            DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
            Document doc = dBuilder.parse(fileinput);

            DOMSource domSource = new DOMSource(doc);
            StringWriter writer = new StringWriter();
            StreamResult result = new StreamResult(writer);
            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer transformer = tf.newTransformer();
            transformer.transform(domSource, result);

            return writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    public Document saveStr(String str)
    {
        Document doc=null;
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder;
        InputSource is = new InputSource(new StringReader(str));
        try {
            builder = factory.newDocumentBuilder();
            doc = builder.parse(is);
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return doc;
    }
    
    public void creatXml()
    {
        try {
            // 判断文件是否存在,如存在就删掉它
            File file = new File("test.xml");
            if (file.exists()) 
                file.delete();
            
            String str=text.getText();
//            System.out.println(str);
//           String str = "<?xml version=\"1.0\" encoding=\"utf-8\"?><bg>    <col> 255,255,255 </col>    <xRange> -0.1, 1.1 </xRange>    <yRange> -0.1, 1.1 </yRange>    </bg>";
            str=str.replaceAll("\r\n|    ", "");
//            System.out.println(str);
            
            Document document=saveStr(str);
            /** 将document中的内容写入文件中 */
            TransformerFactory tFactory = TransformerFactory.newInstance();
            Transformer transformer = tFactory.newTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource source = new DOMSource(document);
            StreamResult result = new StreamResult(new FileOutputStream("test.xml"));
            transformer.transform(source, result);
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public void saveValue() 
    {
        try{
            File f=new File("test.xml");
            DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builder=factory.newDocumentBuilder();
            Document doc = builder.parse(f);
            NodeList n1 = doc.getElementsByTagName("scale");
            //System.out.println(nl.getLength());
            
            for (int i=0;i<n1.getLength();i++)
            {
                Scale sc=new Scale();
                Element b=(Element)n1.item(i);  //获取第一个scale结点
                sc.col=b.getElementsByTagName("col").item(0).getFirstChild().getNodeValue().trim();
                sc.wid=Integer.parseInt(b.getElementsByTagName("wid").item(0).getFirstChild().getNodeValue().trim());
                sc.direction=b.getElementsByTagName("direction").item(0).getFirstChild().getNodeValue().trim();
                sc.pos=Double.parseDouble(b.getElementsByTagName("pos").item(0).getFirstChild().getNodeValue().trim());
                sc.from=Integer.parseInt(b.getElementsByTagName("from").item(0).getFirstChild().getNodeValue().trim());
                sc.step=Double.parseDouble(b.getElementsByTagName("step").item(0).getFirstChild().getNodeValue().trim());        
                sc.amount=Integer.parseInt(b.getElementsByTagName("amount").item(0).getFirstChild().getNodeValue().trim());
                sc.precision=Integer.parseInt(b.getElementsByTagName("precision").item(0).getFirstChild().getNodeValue().trim());
                s.add(sc);
                
            }
//            for(int i=0;i<s.size();i++)
//            {
//                Scale a=s.get(i);
//                System.out.println(a.toString());
//            }
        }catch(Exception e){
            e.printStackTrace();
        }
        
        
    }
    
    class MyCanvas extends JPanel 
    {
        /**
         * 
         */
        private static final long serialVersionUID = -4279250266143507850L;
        
        public Color getColor(String c)
        {
            Color color;
            try {
                Field field = Class.forName("java.awt.Color").getField(c);
                color = (Color)field.get(null);
            } catch (Exception e) {
                color = null; // Not defined
            }
            return color;
        }
        
        @Override 
        public void paintComponent(Graphics g) 
        {
            
            
            if(dFlag==1)
            {
                Graphics2D g2 = (Graphics2D)g;
                
                // 下面这句话把整个的Canvas清空,以便下次绘制,这句话在画图中很重要:
                g2.clearRect(0, 0, (int)getBounds().getWidth(), (int)getBounds().getHeight());
                
                for(int i=0;i<s.size();i++)
                {
                    ax=s.get(i);
                    g2.setColor(getColor(ax.col));
                    g2.setStroke(new BasicStroke(ax.wid));
                    
                    length=50*ax.amount+50;
                    t=50;h=600;
                    
                    BigDecimal bStep = new BigDecimal(ax.step+"");
                    BigDecimal c=new BigDecimal(ax.from+"");
                    
                    if(ax.direction.equals("x"))
                    {
                        g2.drawLine(50, h, length, h);  //x轴
            
                        for(int j=0;j<=ax.amount;j++)
                        {
                            //System.out.println(t+" "+base);
                            g2.drawLine(t, h, t, h-5);
                            c=c.setScale(ax.precision, RoundingMode.HALF_UP);
                            g2.drawString(c+"", t-6, h+10);
                            t+=50;
                            c=c.add(bStep);
                        }
                    }
                    
                    else {
                        length=ax.amount*50;
                        t=h;c=new BigDecimal(yFrom+"");
                        g2.drawLine(50, h-length, 50, h);  //y轴
                        for(int j=0;j<=ax.amount;j++)
                        {
                            g2.drawLine(50, t, 50+5, t);
                            //System.out.println("50"+" "+t);
                            c=c.setScale(ax.precision, RoundingMode.HALF_UP);
                            g2.drawString(c+"", 25, t+5);
                            t-=50;
                            c=c.add(bStep);
                        }
                    }
                    
                    //g2.fillOval((int) (0.2*t+26), (int)(0.2*t+26), 10,10);    
                }
    
            }
        }
    }
    public static void main(String[] args)
    {
        new ConfigurableDrawing();
    }
}

把paintComponent方法改为paint方法试试。