ciao a tutti,
ho bisogno di un aiuto urgente. In pratica devo disegnare 10 ellissi di dimensione e posizione casuale che si aggiornano ogni volta che premo il pulsante aggiorna o inserisco un numero nella casella di testo.
Il problema è che non so come evitare il repaint delle ellissi se semplicemente abbasso o sposto la finestra. Grazie mille a chiunque possa aiutarmi

Questo il file contenente il metodo main

codice:
import javax.swing.JFrame;
public class Ellissi2Viewer {
	public static void main (String[] args){
		
		Ellissi2 frame = new Ellissi2 ();
		frame.setSize (800,800);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible (true);
		
	}	
}
E questo il file contenente pulsanti e disegno

codice:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.event.*;
import java.util.Random;

 public class Ellissi2 extends JFrame {
 	
 	//variabili istanza dei panel che creo
 	private JPanel componentiPanel;
 	private PannelloApplicazione disegnoPanel;//il Panel che creo dopo

 	//variabili istanza dei componenti
 	private JLabel etichetta;
 	private JTextField casellaTesto;
 	private JButton aggiornaButton;
 	
 	//variabili istanza
 	private int numEllissi = 10;
 	
 	public Ellissi2(){
 		
 		componentiPanel = new JPanel();
 		disegnoPanel = new PannelloApplicazione(this);
 		etichetta = new JLabel("numero di ellissi");
 		casellaTesto = new JTextField("10");//una casella di testo contenente "10"
 		aggiornaButton = new JButton("aggiorna");
 		
 		casellaTesto.setPreferredSize(new Dimension (100,25));
 		
 		//aggiungo i componenti a componentiPanel
 		componentiPanel.add(etichetta);
 		componentiPanel.add(casellaTesto);
 		componentiPanel.add(aggiornaButton);
 		
 		//aggiungo i panel al frame
 		//utilizzando come layout manager BorderLayout
 		add(componentiPanel, BorderLayout.NORTH);
 		add(disegnoPanel, BorderLayout.CENTER);
 		
 		//aggiungo i listener ai componenti
 		aggiornaButton.addActionListener(new AggiornaButtonListener());
 		casellaTesto.addActionListener(new CasellaTestoListener());
 					
 	}
 
 /**Una classe interna che contiene aggiornaButton
    e implementa l'interfaccia ActionListener 
  */
  private class AggiornaButtonListener implements ActionListener{
  	
  	public void actionPerformed(ActionEvent e){
  		
  		if (numEllissi != 10){
  			disegnoPanel.aggiornaDisegno();
  		}
  
  	}
  }//fine classe AggiornaButtonListener	
  
  	
 /**Una classe interna che contiene casellaTesto
    e implementa l'interfaccia ActionListener 
  */
   private class CasellaTestoListener implements ActionListener{

  	public void actionPerformed(ActionEvent event){
  		String numeroEllissi = casellaTesto.getText();
  		
  		try{
  			numEllissi = Integer.parseInt(numeroEllissi);
  		}
  		
  		//se il valore inserito non è valido
  		//imposto a 10 il numEllissi
  		catch (Exception e){
  			numEllissi = 10;
  			casellaTesto.setText("10");
  		}
  		disegnoPanel.aggiornaDisegno();
  	}  	 
  }//fine classe CasellaTestoListener
  
 /**metodo pubblico che verrà invocato dalla classe PannelloApplicazione
    per accedere al valore della variabile istanza numEllissi
  */
  public int getNumEllissi(){
  	return this.numEllissi;
  }  
  	
  }//qui finisce la classe Ellissi2

/**Una nuova classe che estende JPanel
   e rappresenta il pannello interno della finestra
 */
 class PannelloApplicazione extends JPanel{
 	
 	//variabili istanza
 	private Ellissi2 nE;//mi serve per invocare getNumEllissi()
 	                    //della classe Ellissi2
 	
 	/**Il costruttore della classe PannelloApplicazione
 	 */
 	 public PannelloApplicazione(Ellissi2 ellissiFrame){
 	 	nE = ellissiFrame;
 	 }
 	 
 	/**metodo pubblico che verrà invocato dai componenti
 	   della classe Ellissi2
 	 */
 	 public void aggiornaDisegno(){
 	 	
 	 	repaint ();//ogni volta che viene invocato aggiornaDisegno(),
                   //repaint richiama paintComponet di JPanel
 	 }
 	 
 	 /**metodo di JPanel sovrascritto da PannelloApplicazione
 	  */
 	  public void paintComponent (Graphics g){
 	  	
 	  	super.paintComponent (g); //per richiamare il metodo paintComponent
 	  	                         //della superclasse JPanel
 	  	
 	  	Graphics2D g2 = (Graphics2D) g;//con il cast recupero il riferimento
 	  	                               //a Graphics2D
 	  	
 	  	Random randomGenerator = new Random ();
 	  	
 	  	//disegno lo sfondo
 	  	int red = randomGenerator.nextInt(256);
 	  	int green = randomGenerator.nextInt(256);
 	  	int blue = randomGenerator.nextInt(256);
 	  	
 	  	g2.setColor(new Color(red, green, blue));
 	  	Rectangle sfondo = new Rectangle (0,0,800,800);
 	  	g2.fill(sfondo);
 	  	
 	  	//disegno le ellissi
 	  	g2.setColor (Color.black);
 	  	int diametro1 = 0;
 	  	int diametro2 =0;
 	  	int numeroEllissi = nE.getNumEllissi();
 	  	
 	  	for (int i=0; i<numeroEllissi; i++){
 	  		
 	  		//sceglie una posizione casuale per ogni ellisse
 	  		int xPosizione = randomGenerator.nextInt(601); 
 	  		int yPosizione = randomGenerator.nextInt(500);
 	  		
 	  		//sceglie per diametro1 un valore casuale tra 50 e 200
 	  		switch (randomGenerator.nextInt(2)){
 	  			case 0:
 	  				diametro1 = 50;
 	  				break;

 	  			case 1:
 	  				diametro1 = 200;
 	  				break;
 	  		}

 	  		//sceglie per diametro2 un valore casuale tra 50 e 200
 	  		switch (randomGenerator.nextInt(2)){
 	  			case 0:
 	  				diametro2 = 50;
 	  				break;

 	  			case 1:
 	  				diametro2 = 200;
 	  				break;
 	  		}
 	  		
 	  		g2.drawOval(xPosizione, yPosizione, diametro1, diametro2);  		
 	  		
 	  	}//fine ciclo for
 	  	                              
 	  }//fine paintComponet
 	
 }//qui finisce la classe PannelloApplicazione