Salve, a metà giugno ho l'esame di programmazione orientata agli oggetti e sto facendo esercizi per prepararmi ma ho qualche problema su un certo tipo di esercizi

L'esercizio che sto facendo è una gui dove cliccando su un pulsante vengono creati dei thread che visualizzano una figura che si alza dalla parte bassa del jpanel fino a salire ad una certa altezza e poi si espandono.
Problemi:
1) non capisco perché quando clicco sul pulsante non vedo niente, ma se allargo la finestra o la riduco vedo l'animazione. Non riesco a capire perché non si vede solo premendo il pulsante. L'es è quasi identico ad uno del professore (mancano alcune parti ma penso di averle completate correttamente).
2) come faccio a fare sparire la figura dopo che si è espansa?
Ecco i codici:
codice:
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
import javax.imageio.stream.*;
import java.io.*;
import java.awt.geom.*;
import java.awt.*;
import javax.imageio.ImageIO;
import java.util.*;

class Figura extends Thread{
	private Color colore;
	private Color[] colori={Color.white, Color.yellow, Color.red};
	private double x,y;
	private double yMax, startX=0.5, startY=0.0;
	private Random rnd=new Random();
	private double theta;
	private int idFigura;
	private final int NrSPOT=10;
	private Finestra.PanTracciatura panTraccia;
	private static int nrFigura=0;
	private boolean espandi;
	private boolean eliminato;
	private int kTime;
	
	public Figura(Finestra.PanTracciatura panTraccia){
		nrFigura++;
		idFigura=nrFigura-1;
		colore=colori[rnd.nextInt(colori.length)];
		this.panTraccia=panTraccia;
		//yMax tra 0.7 e 0.9
		yMax=0.7+(0.2*rnd.nextDouble());
		espandi=false;
		eliminato=false;
		//theta casuale tra 80 e 89 oppure 91 e 100
		boolean temp=rnd.nextBoolean();
		double deg;
		if(temp)
			deg=80.0+(9.0*rnd.nextDouble());
		else
			deg=91.0+(9.0*rnd.nextDouble());
		theta=(Math.PI/180.0)*deg;
	}
	public Color getColore(){ return colore; }
	public double getX(){ return x; }
	public double getY(){ return y; }
	public int getIdFigura(){ return idFigura; }
	public boolean getEspandi(){ return espandi; }
	public boolean getEliminato(){ return eliminato; }
	public int getKTime(){ return kTime;}
	public void run(){
		double spostamento=yMax/NrSPOT;
		x=startX;
		y=startY;
		while(y<yMax-spostamento){
			//calcolo nuove coordinate
			y=y+spostamento;
			x=startX+(y-startY)/Math.tan(theta);
			panTraccia.drawFigura();
			try{
				sleep(200);
			}catch(InterruptedException e){}
		}
		//finito la salita, si espande
		espandi=true;
		for(kTime=1;kTime<20;kTime++){
			panTraccia.drawFigura();
			try{
				sleep(200);
			}catch(InterruptedException e){}
		}
		eliminato=true;
		panTraccia.drawFigura();			
	}
	
}
codice:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.Random;
import javax.imageio.stream.*;
import java.io.*;
import java.awt.geom.*;
import javax.imageio.ImageIO;
import java.util.*;

class Finestra extends JFrame{
	protected PanTracciatura panTracciatura;
	private JButton bFire;
	private int w,h;
	public Finestra(int w,int h){
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle(getClass().getName());
		setSize(w,h);
		Container cnt=getContentPane();
		panTracciatura=new PanTracciatura();
		cnt.add(panTracciatura,BorderLayout.CENTER);
		bFire=new JButton("Fuoco");
		bFire.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				Figura figura=new Figura(panTracciatura);
				panTracciatura.setFigura(figura);
				figura.start();
			}
		});
		cnt.add(bFire,BorderLayout.SOUTH);
		setVisible(true);
	}
	class PanTracciatura extends JPanel{
		private ArrayList<Figura> lsFigura=new ArrayList<Figura>();
		public void setFigura(Figura figura){
			lsFigura.add(figura.getIdFigura(), figura);
		}
		public PanTracciatura() { setBackground(Color.BLUE); }
		public void drawFigura(){ paintImmediately(0,0,w,h); }
		public void paintComponent(Graphics g){
			super.paintComponent(g);
			Graphics2D g2=(Graphics2D) g;
			Dimension dim=getSize();
			int wSize=dim.width;
			int hSize=dim.height;
			if(!lsFigura.isEmpty()){
				ListIterator<Figura> ite=lsFigura.listIterator();
				while(ite.hasNext()){
					Figura figura=ite.next();
					double xInit=0.0;
					double yInit=hSize;
					double y=figura.getY();
					double x=figura.getX();
					double xReale=x*wSize;
					double yReale=y*hSize;
					AffineTransform at=new AffineTransform();
					AffineTransform espansione=new AffineTransform();
					if(!figura.getEspandi()){ //figura non ancora espanda, quindi in movimento
						at.setToTranslation(xInit+xReale,yInit-yReale);
					}
					else{ //figura arrivata all'altezza massima e ora si espande
						at.setToTranslation(xInit+xReale,yInit-yReale);
						int kTime=figura.getKTime();
						espansione.setToScale(0.5*kTime,0.5*kTime);
						at.concatenate(espansione);
					}
					Shape figuraImage=new FiguraImage().getFiguraImage();
					g2.setTransform(at);
					Color colore=figura.getColore();
					g2.setColor(colore);
					g2.fill(figuraImage);
				}
			}
		}
	}
}
L'altra classe FiguraImage fornisce solo uno shape con il disegno da visualizzare.
Più una classe col main.

Grazie a chi mi da una mano