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.