Salve ragazzi,
volevo chiedermi se potevate darmi una mano con un problema. Sto sviluppando un applicazioncina che lavora sulle liste concatenate, quella presente in questo codice può essere sostituita con la Linked List di java.
Arrivo al dunque, ho creato un frame in cui è contenuto un pannello su cui vado a disegnare gli elementi contenuti nella lista.
All'inizio creo una lista, gli aggiungo un elemento e la passo al costruttore del pannello per poterla rappresentare, fin qui tutto ok.
Ho aggiunto un pulstante che se cliccato crea una nuova lista, vi aggiunge un elemento. questa lista viene passato al costruttore che riassegna l'area disegno. Qui ho il problema, ovvero l'area non viene aggiornata e mi rimangono le informazioni precedenti, anche richiamando il metodo "repaint()"


codice:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.font.*;
import java.awt.geom.*;
import java.util.ListIterator;

import javax.swing.*;

import poo.progetto.Lista;
import poo.progetto.ListaConcatenata;

public class FontTest
{  
   public static void main(String[] args)
   {  
	   TestFrame frame = new TestFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setVisible(true);
   }
}

/**
   A frame with a text message panel
*/
class TestFrame extends JFrame
{
	private Lista l = null;
	private Lista l2 = null;
	private AreaDisegno area = null;
   public TestFrame()
   {
      setTitle("TestFrame");
      setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
      
     
      l = new ListaConcatenata<String>();
      l.addFirst("prova");
      
      area = new AreaDisegno(l) ;
    
      JScrollPane scroll = new JScrollPane(area);
      
      JButton prova = new JButton("prova");
      
      prova.addActionListener(new ActionListener() {		
		@Override
		public void actionPerformed(ActionEvent arg0) {
			l2 = creaLista();
			l2.addFirst("aaaaaaaaaa");
			area = new AreaDisegno(l2);
			return;
			
		}
	});
     // scroll.setPreferredSize(new Dimension(200,200));
      add(scroll, BorderLayout.CENTER);
      add(prova, BorderLayout.SOUTH);

   }

   public static final int DEFAULT_WIDTH = 300;
   public static final int DEFAULT_HEIGHT = 200;  

public Lista creaLista(){
	return new ListaConcatenata<String>();
}}


class AreaDisegno extends JPanel{
	private Lista lista;
	Dimension spazioUtilizzato = new Dimension(0, 0);
	
	public AreaDisegno(){
		this.lista = null;
		this.setBackground(Color.WHITE);
		this.setPreferredSize(spazioUtilizzato);
	}
	
	public AreaDisegno(Lista l){
		this.lista = l;
		this.setBackground(Color.WHITE);
		
		this.setPreferredSize(spazioUtilizzato);
		
	}
	
	
	public void paintComponent(Graphics g) {
		if(lista==null)
	    	return;
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		//settiamo il font da utilizzare
		Font f = new Font("Serif", Font.BOLD, 30);
		g2.setFont(f);
	    //le coordinate iniziali 
	    double x = 20;
	    double y = 20;
	  
	    
	    ListIterator it = lista.listIterator();
	    
	    while(it.hasNext()){
	    	//acquisiamo le info per il rettangolo k contiene la parola
	    	
	    	String info = it.next().toString();
	    	
	    	FontRenderContext context = g2.getFontRenderContext();
	        Rectangle2D bounds = f.getStringBounds(info, context);
	        //per inserire bene il testo
	        double ascent = -bounds.getY();
	        double baseY = y + ascent;
	        //disegniamo la stringa
	        g2.drawString(info, (int)x, (int)baseY);
	        //disegnamo il rettangolo intorno
	        Rectangle2D rect = new Rectangle2D.Double(x-5, y-5, bounds.getWidth()+10, bounds.getHeight()+10);
	        g2.draw(rect);
	        if(it.hasNext()){ 
	        	int oldX = (int)(x+(bounds.getWidth()+5));
	        	int newX = (int) oldX+40-10;
	        	int lineY = (int) (y+(bounds.getHeight()/2));		        	
	        	g2.drawLine(oldX, lineY, newX, lineY);
	        }
	        x += bounds.getWidth()+10+30;
	    }
	    
	    if(x >= spazioUtilizzato.getWidth()){
	    	setPreferredSize(new Dimension((int)x, 0));
	    	revalidate();
	    }
	   
	}
}