Ecco il codice:
codice:
package visualizzatore;
import  geometrie.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.geom.Point2D;
import javax.swing.border.TitledBorder;


public class ClsParam extends JApplet  {
    private DrawPanel dPanel;
    private ShapePanel cerchiPanel,quadratiPanel;
    private JButton traccia = new JButton("Traccia");
    
     public void init()
    {
        try{
            // this is a workaround for a security conflict with some browsers
            // including some versions of Netscape & Internet Explorer which do 
            // not allow access to the AWT system event queue which JApplets do 
            // on startup to check access. May not be necessary with your browser. 
            JRootPane rootPane = this.getRootPane(); 
            rootPane.putClientProperty("defeatSystemEventQueueCheck", Boolean.TRUE);
            JPanel panelS = new JPanel();
            dPanel = new DrawPanel(100,100); 
            cerchiPanel = new ShapePanel(9,"numCerchi","c(x,y)","raggio");
            quadratiPanel = new ShapePanel(9,"numQuadrati","p(x,y)","lato");
            panelS.add(cerchiPanel);
            panelS.add(quadratiPanel);
            panelS.setLayout(new GridLayout(2,1));  
            dPanel.setLayout(new FlowLayout());
            add(dPanel);
            add(BorderLayout.EAST, panelS);
            add(BorderLayout.SOUTH, traccia); 
            traccia.addActionListener(new TracciaListener(cerchiPanel,quadratiPanel,dPanel,this));
            // provide any initialisation necessary for your JApple
           
        }
        catch(Exception e){
            add(new JLabel("Eccezione: "+e.toString()));
        }
    }
class ShapePanel extends JPanel{
    JLabel lShape;
    Sequenza<JLabel> pointLabels,scalarLabels;
    JTextField tShape;
    Sequenza<JTextField> xBox,yBox,scalarBox; 
    
    public ShapePanel(int rows,String label,String pointLabel,String scalarLabel){ 
        setLayout(new GridLayout(rows+1,5));
        setBorder(new TitledBorder("pannello "+label));
        lShape = new JLabel(label);
        tShape = new JTextField();
        pointLabels = new Sequenza<JLabel>();
        scalarLabels = new Sequenza<JLabel>();
        xBox = new Sequenza<JTextField>();
        yBox = new Sequenza<JTextField>();
        scalarBox = new Sequenza<JTextField>();
        add(lShape);
        add(tShape);
        add(new JLabel());
        add(new JLabel());
        add(new JLabel());
         
        for(int i=0;i<rows;i++){
            pointLabels.addItem(new JLabel((i+1)+": "+pointLabel));
            scalarLabels.addItem(new JLabel((i+1)+": "+scalarLabel));
            xBox.addItem(new JTextField(6));
            yBox.addItem(new JTextField(6));
            scalarBox.addItem(new JTextField(6)); 
        } 
        pointLabels.setToFirst();
        scalarLabels.setToFirst();
        xBox.setToFirst();
        yBox.setToFirst();
        scalarBox.setToFirst();
        
        while((pointLabels.existsNext())&&(scalarLabels.existsNext())&&(xBox.existsNext())&&
                                              (yBox.existsNext())&&(scalarBox.existsNext())){
                add(pointLabels.getItem());
                add(xBox.getItem());
                add(yBox.getItem());
                add(scalarLabels.getItem());
                add(scalarBox.getItem()); 
                pointLabels.setToNext();
                scalarLabels.setToNext();
                xBox.setToNext();
                yBox.setToNext();
                scalarBox.setToNext();
            
        }
    }
    public Sequenza<Cerchio> getDataCrc(){
       int numCerchi = Integer.parseInt(tShape.getText());
       Sequenza<Cerchio> crc = new Sequenza<Cerchio>();
       double x,y;
       int raggio;
       xBox.setToFirst();
       yBox.setToFirst();
       scalarBox.setToFirst();
       for(int i=0;i<numCerchi;i++){
           if(xBox.existsNext() && yBox.existsNext() && scalarBox.existsNext()){
                x = Double.parseDouble(xBox.getItem().getText()); 
                y = Double.parseDouble(yBox.getItem().getText());
                raggio = Integer.parseInt(scalarBox.getItem().getText());
                crc.addItem(new Cerchio(new Point2D.Double(x,y),raggio)); 
                xBox.setToNext();
                yBox.setToNext();
                scalarBox.setToNext();   
            }
        }
        return crc;  
    }
    public Sequenza<Quadrato> getDataQdr(){
       int numQuadrati = Integer.parseInt(tShape.getText());
       Sequenza<Quadrato> qdr = new Sequenza<Quadrato>();
       double x,y;
       int lato;
       xBox.setToFirst();
       yBox.setToFirst();
       scalarBox.setToFirst();
       for(int i=0;i<numQuadrati;i++){
           if(xBox.existsNext() && yBox.existsNext() && scalarBox.existsNext()){
                x = Double.parseDouble(xBox.getItem().getText()); 
                y = Double.parseDouble(yBox.getItem().getText());
                lato = Integer.parseInt(scalarBox.getItem().getText());
                qdr.addItem(new Quadrato(new Point2D.Double(x,y),lato)); 
                xBox.setToNext();
                yBox.setToNext();
                scalarBox.setToNext();   
            }
        }
        return qdr;  
    } 
}
class DrawPanel extends JPanel{
    private Sequenza<Cerchio> seqCrc;
    private Sequenza<Quadrato> seqQdr;
    public DrawPanel(){
        setBorder(new TitledBorder("Lavagna da disegno"));
        setCerchio(new Sequenza<Cerchio>());
        setQuadrato(new Sequenza<Quadrato>());
    }
    public DrawPanel(int height,int width){
        this();
    }
    public void setCerchio (Sequenza<Cerchio> seqCrc) { this.seqCrc = seqCrc; }
    public void setQuadrato (Sequenza<Quadrato> seqQdr) { this.seqQdr = seqQdr; }
    public void paintComponent (Graphics g) {
        //JOptionPane.showMessageDialog(this, "creazione Graphics");
        Graphics2D g2 = (Graphics2D) g;
        //JOptionPane.showMessageDialog(this, "Graphics creata");
        if (seqCrc != null)
        if (! seqCrc.isEmpty()) {
            //JOptionPane.showMessageDialog(this, "cerchi ok");
            seqCrc.setToFirst();
            Cerchio crc = seqCrc.getItem();
            crc.draw (g2);
            while (seqCrc.existsNext()) {
                seqCrc.setToNext();
                crc = seqCrc.getItem();
                crc.draw (g2);
            }
        }
        if (seqQdr != null)
        if (! seqQdr.isEmpty()) {
            //JOptionPane.showMessageDialog(this, "qdrati ok");
            seqQdr.setToFirst();
            Quadrato qdr = seqQdr.getItem();
            qdr.draw (g2);
            while (seqQdr.existsNext()) {
                seqQdr.setToNext();
                qdr = seqQdr.getItem();
                qdr.draw (g2);
            }
        }
    }
}
class TracciaListener implements ActionListener{
    ShapePanel crcPanel,qdrPanel;
    DrawPanel  dPanel;
    ClsParam clsParam;
    public TracciaListener(ShapePanel crcPanel,ShapePanel qdrPanel,DrawPanel dPanel,ClsParam clsParam){
        this.crcPanel = crcPanel;
        this.qdrPanel = qdrPanel;
        this.dPanel = dPanel;
        this.clsParam = clsParam;
    }
    public void actionPerformed(ActionEvent e){
        dPanel.setCerchio(crcPanel.getDataCrc());
        dPanel.setQuadrato(qdrPanel.getDataQdr());
        dPanel.paintComponent(crcPanel.getGraphics());
        dPanel.repaint();
    }
}
}
Qui le classi esterne importate Figura e i suoi figli Cerchio e Quadrato
codice:
package geometrie;
import java.awt.*;
import java.awt.geom.Point2D;

public abstract class Figura
{
   protected abstract void draw(Graphics g);
   protected abstract void trasla (int dx,int dy);
   protected abstract boolean contains (Point2D p);
}
-----------------------------------------------------
package geometrie;
import java.awt.*;
import java.awt.geom.*;
import java.lang.Double;

public class Quadrato extends Figura {
    private Point2D vertSupSx;
    private int lato;
    
    public Quadrato (Point2D vertSupSx, int lato) {
        this.vertSupSx = vertSupSx;
        this.lato = lato;
    }
    public void draw (Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.fill (new Rectangle2D.Double (vertSupSx.getX(), vertSupSx.getY(),
        lato, lato));
    }
   public void trasla (int dx, int dy) {
       vertSupSx = new Point2D.Double (vertSupSx.getX() + dx,
       vertSupSx.getY() + dy);
    }
    public boolean contains (Point2D p) {
        Rectangle2D r = new Rectangle2D.Double (vertSupSx.getX(),
        vertSupSx.getY(), lato, lato);
        return r.contains (p);
    }
}
----------------------------------------------------------------------
package geometrie;
import java.awt.*;
import java.awt.geom.*;
import java.lang.Double;

public class Cerchio extends Figura {
    private Point2D centro;
    private int raggio;
    
    public Cerchio (Point2D centro, int raggio) {
        this.centro = centro;
        this.raggio = raggio;
    }
    public void draw (Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.fill (new Ellipse2D.Double (centro.getX() - raggio, centro.getY() - raggio,
        2*raggio, 2*raggio));
    }
    public void trasla (int dx, int dy) {
        centro = new Point2D.Double (centro.getX() + dx, centro.getY() + dy);
    }
    public boolean contains (Point2D p) {
        Ellipse2D e = new Ellipse2D.Double (centro.getX() - raggio,
        centro.getY() - raggio, 2*raggio, 2*raggio);
        return e.contains (p);
    }
}
il problema sta che quando disegno una qualsiasi figura nella lavagna mi disegna anche il Button e il repaint() non funziona, se "sovvrascrivo" una figura per rimpicciolirla rimane com'è, o meglio me la disegna ma sotto quella precedente, ovvero il repaint non me la cancella ma me la lascia lì.
Qualcuno puo' aiutarmi, per favore?

Ringrazio in anticipo chiunque abbia una soluzione a questo problema.

Kimal.