Problema com visualização de elementos em JPanel

0 respostas
D

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]

[img]http://img534.imageshack.us/img534/1746/pvzn.png[/img]

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

[img]http://img43.imageshack.us/img43/4747/cl6u.png[/img]

[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]

[img]http://img7.imageshack.us/img7/8152/ijsk.png[/img]

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:

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();
		
	}
	
}

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

Abraço.

Criado 29 de julho de 2013
Respostas 0
Participantes 1