Problema com visualização de elementos em JPanel

Olá, pessoal.

Estou estudando Java pelo livro "Use a Cabeça! JAVA" e em seu último capítulo há um pequeno programa de lançamento de dados.

Nesse programa, o usuário escolhe um quantidade de dados a ser jogada (1 a 5) que serão lançados e, após isso, os dados são exibidos na tela.

Ok. Quanto a lógica, tudo bem: É sorteado um número de 1 a 6, para cada dado "lançado".

O problema é em relação a GUI:

Criei três objetos JPanel, para testar a exibição com múltiplos componentes no frame.

O primeiro "painelBot" contém um botão sem utilidade alguma.

O segundo "pDados" com o método paintComponent() sobreposto, que desenha os quadrados referentes à quantidade de dados sorteados e seus respectivos círculos/pontos.

E o terceiro "painelPrinc" para inserção dos dois anteriores.

Tenho dois problemas:

[color=red]1º) Quando executo o programa, são exibidos alguns elementos duplicados:[/color]

Obs.: A numeração dos dados é informada de maneira correta, conforme exibido no prompt:

[color=red]2º) Quando redimensiono a tela de exibição com o mouse, através da borda da mesma, alguns objetos desaparecem da tela:[/color]

Obs.: Já tentei usar vários gerenciadores de layout, mas nenhum exibia sequer o painel dos dados, até encontrar o BoxLayout.

Segue o código da implementação:

[code]import java.awt.;
import javax.swing.
;
import java.awt.event.;
import java.io.
;

public class DadosTeste{

int xIni = 50;
int yIni = 50;
int tamDado = 50;
int dimCirc = 5;

boolean c;
boolean t1;
boolean t2;
boolean b1;
boolean b2;
boolean e;
boolean d;

int metDado = tamDado/2;

int xCent = 0;
int yCent = 0;
	
int xEsq = 0;
int yEsq = 0;

int xT1 = 0;
int yT1 = 0;

int xDir = 0;
int yDir = 0;
	
int xB1 = 0;
int yB1 = 0;
	
int xT2 = 0;
int yT2 = 0;
	
int xB2 = 0;
int yB2 = 0;

JFrame frame = new JFrame();
JComboBox numDados;
PainelDados pDados;

class PainelDados extends JPanel{
	
	public void paintComponent(Graphics g){
	
		g.setColor(Color.orange);
		g.fillRect(xIni, yIni, tamDado, tamDado);
					
		g.setColor(Color.black);
		
		if(c == true){
			g.fillOval(xCent, yCent, dimCirc, dimCirc);
		}
		if(e == true){
			g.fillOval(xEsq, yEsq, dimCirc, dimCirc);
		}
		if(d == true){
			g.fillOval(xDir, yDir, dimCirc, dimCirc);
		}
		if(t1 == true){
			g.fillOval(xT1, yT1, dimCirc, dimCirc);
		}
		if(t2 == true){
			g.fillOval(xT2, yT2, dimCirc, dimCirc);
		}
		if(b1 == true){
			g.fillOval(xB1, yB1, dimCirc, dimCirc);
		}
		if(b2 == true){
			g.fillOval(xB2, yB2, dimCirc, dimCirc);
		}
	
	}	
}

//Define o ponto superior esquerdo de cada dado
public void calcPontoIni(int tamDado){

	xIni = xIni + tamDado + 20;

}

//Define quais círculos serão exibidos de acordo com o valor de cada dado
public void pontosVis(int numDado){

	if((numDado == 1)||(numDado == 3)||(numDado == 5)){
		c = true;
	}
	if((numDado == 4)||(numDado == 5)||(numDado == 6)){
		t1 = true;
		b2 = true;
	}
	if((numDado == 2)||(numDado == 3)||(numDado == 4)||(numDado == 5)||(numDado == 6)){
		t2 = true;
		b1 = true;
	}
	if((numDado == 6)){
		e = true;
		d = true;
	}
	
}

//Calcula a posição dos círculos a serem exibidos em cada dado
public void calcPosCirc(int xIni, int yIni){

	xCent = xIni + metDado;
	yCent = yIni + metDado;
	
	xEsq = xCent - metDado + tamDado/10;
	yEsq = yCent;

	xT1 = xEsq;
	yT1 = yEsq - metDado + tamDado/10;

	xDir = xCent + metDado - tamDado/10;
	yDir = yEsq;
	
	xB1 = xEsq;
	yB1 = yEsq + metDado - tamDado/10;
	
	xT2 = xDir;
	yT2 = yT1;
	
	xB2 = xDir;
	yB2 = yB1;
	
}

//Constroi e exibe a GUI
public void cGUI(){

	JPanel painelPrinc = new JPanel();
	painelPrinc.setLayout(new BoxLayout(painelPrinc, BoxLayout.Y_AXIS));
	
	JPanel painelBot = new JPanel(new BorderLayout());
	painelBot.setBackground(Color.yellow);
	
	JButton botao = new JButton("Botão");
	
	pDados = new PainelDados(); 
	pDados.setBackground(Color.red);
	
	pDados.setPreferredSize(new Dimension(250, 500));
	
	painelBot.add(botao, BorderLayout.CENTER);
		
	painelPrinc.add(painelBot);
	painelPrinc.add(pDados);
	
	frame.getContentPane().add(painelPrinc, BorderLayout.CENTER);
	frame.setSize(500, 500);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	
	//Lança 3 dados
	for(int i = 0; i < 3; i++){
			
		c = false; e = false; d = false;
		t1 = false; t2 = false;
		b1 = false; b2 = false;
				
		int r = (int) ((Math.random() * 6) + 1);
			
		calcPontoIni(tamDado);				
		calcPosCirc(xIni, yIni);
		pontosVis(r);
	
		//Forma que encontrei de manter a exibição de todos os dados, como na figura 1
		try{
			Thread.sleep(50);
		}catch(Exception ex){}
				
		pDados.repaint();
		System.out.println("Numero sorteado: "+r);
	}
	
}

public static void main(String[] args){
	
	DadosTeste obj = new DadosTeste();
	
	obj.cGUI();
	
}

}[/code]

Será que alguém pode me ajudar a sanar esse problema?

Abraço.