Ir ao conteúdo

Java Java: Problemas para fechar um JFrame


Ir à solução Resolvido por Joanderson Pereira,

Posts recomendados

Postado

Criei um jogo, a caráter de estudo, de lançar dados para dois jogadores onde um número aleatório(1-6) é gerado representando o dado e dependendo do número que sair pontos são adicionados para o jogador que efetuou a jogada.

No Menu (JFrame) é possível selecionar dois modos (melhor de 3 e 18 pontos), escolhendo qualquer um dos dois criará um novo View(JFrame onde é exibido o jogo), no inicio do construtor de View coloquei dois showImputDialog que pedem que seja digitado o nome do Jogador 1 e em seguida do Jogador 2.

 

Eu quero que durante esse showImputDialog caso o usuário clique em cancelar o JFrame de View não seja exibido na tela e retorne para o JFrame do Menu.

Tentei realizar uma lógica para que isso acontecesse porém quando o usuário clica em cancelar, o JFrame de View é aparentemente fechado porém ao voltar para o ActionListener(JButton do Menu)  o View é novamente aberto com todas as informações descarregadas. 

 

Não sei o que está acontecendo, segue aí o código (parcialmente gerado pelo WindowBuilder do Eclipse)

 

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.Random;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.Color;

public class View extends JFrame {

	private JPanel contentPane;
	private int rodadas = 0;
	private int objetivo = 18;
	private Dado dado = new Dado();
	int vez = new Random().nextInt(1);
	private Jogador j1 = new Jogador();
	private Jogador j2 = new Jogador();


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					View frame = new View();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public View() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(View.class.getResource("/imagem/view/icons8-dado-24.png")));
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBackground(Color.WHITE);
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);

		Menu.btnNewButton.setEnabled(false);
		Menu.btnMelhorDe.setEnabled(false);

		String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
		if(nomeJ1 != null) {
			j1.setNome(nomeJ1);
			String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);
			
			if(nomeJ2 != null) {
				j2.setNome(nomeJ2);

				JLabel lblNewLabel = new JLabel("");
				lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (8).jpg")));
				;
				lblNewLabel.setBounds(197, 11, 227, 222);
				contentPane.add(lblNewLabel);

				//nomes
				JLabel jogador_1_Pontos = new JLabel("");
				jogador_1_Pontos.setBounds(10, 109, 153, 23);
				jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos");
				contentPane.add(jogador_1_Pontos);

				JLabel jogador_2_Pontos = new JLabel("");
				jogador_2_Pontos.setBounds(10, 196, 153, 23);
				jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos");
				contentPane.add(jogador_2_Pontos);

				JLabel jogador_1_Nome = new JLabel(j1.getNome());
				jogador_1_Nome.setBounds(10, 78, 153, 23);
				contentPane.add(jogador_1_Nome);

				JLabel jogador_2_Nome = new JLabel(j2.getNome());
				jogador_2_Nome.setBounds(10, 165, 153, 23);
				contentPane.add(jogador_2_Nome);

				JLabel vezJogador = new JLabel("");
				vezJogador.setBounds(10, 230, 153, 23);
				contentPane.add(vezJogador);

				JLabel rodadasLbl = new JLabel("Prepare-se para o duelo!");
				rodadasLbl.setFont(new Font("Times New Roman", Font.BOLD | Font.ITALIC, 14));
				rodadasLbl.setBounds(232, 236, 167, 14);
				contentPane.add(rodadasLbl);







				JButton btnNewButton = new JButton("Jogar Dado");
				btnNewButton.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						if(Menu.regra1) {
							if (j1.getPontos() < objetivo && j2.getPontos() < objetivo) {
								int i = dado.jogarDado();						

								if (vez == 0) {
									j1.aumentarPontos(i);
									jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos.");
									vezJogador.setText("Vez de " + j2.getNome());
									vez = 1;
								}
								else {
									j2.aumentarPontos(i);
									jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos.");
									vezJogador.setText("Vez de " + j1.getNome());
									vez = 0;
								}


								dado.showImagem(i, lblNewLabel);

								rodadas++;
								rodadasLbl.setText("Rodada " + String.valueOf(rodadas));

								if (j1.getPontos() >= objetivo) {
									JOptionPane.showMessageDialog(null,j1.vitoria());
									Menu.btnNewButton.setEnabled(true);
                                  		Menu.btnMelhorDe.setEnabled(true);
									dispose();
								}


								else if (j2.getPontos() >= objetivo) {
									JOptionPane.showMessageDialog(null,j2.vitoria());
									Menu.btnNewButton.setEnabled(true);
                                 		Menu.btnMelhorDe.setEnabled(true);
									dispose();
								}

							}

							else {
								if (j1.getPontos() > j2.getPontos())
									JOptionPane.showMessageDialog(null,j1.vitoria());

								else if (j1.getPontos() == j2.getPontos())
									JOptionPane.showMessageDialog(null,"Empatou");

								else
									JOptionPane.showMessageDialog(null,j2.vitoria());

								Menu.btnNewButton.setEnabled(true);
                               		Menu.btnMelhorDe.setEnabled(true);
								dispose();
							}
						}	
						else {//melhor de 3, ainda não está pronto

							if (rodadas <= 6) {
								int i = dado.jogarDado();						


								if (vez == 0) {
									j1.setPontosRodada(i);
									jogador_1_Pontos.setText(String.valueOf(j1.getPontos()) + " pontos.");
									vez = 1;
								}
								else {
									j2.setPontosRodada(i);
									jogador_2_Pontos.setText(String.valueOf(j2.getPontos()) + " pontos.");
									vez = 0;
								}

								if (j1.getPontosRodada() != 0 && j2.getPontosRodada() != 0) {
									if (j1.getPontosRodada() > j2.getPontosRodada()) {
										j1.aumentarPontos(i);
										j1.setPontosRodada(0);
										j2.setPontosRodada(0);
									}
									else if (j1.getPontosRodada() == j2.getPontosRodada()) {
										j1.aumentarPontos(i);
										j2.aumentarPontos(i);
										j1.setPontosRodada(0);
										j2.setPontosRodada(0);
									}
									else
										j2.aumentarPontos(i);
									j1.setPontosRodada(0);
									j2.setPontosRodada(0);
								}
								dado.showImagem(i, lblNewLabel);

								rodadas++;
								rodadasLbl.setText("Rodada " + String.valueOf(rodadas));

								if (j1.getPontos() >= objetivo) {
									JOptionPane.showMessageDialog(null,j1.vitoria());
									Menu.btnNewButton.setEnabled(true);
                                    	Menu.btnMelhorDe.setEnabled(true);
									dispose();
								}


								else if (j2.getPontos() >= objetivo) {
									JOptionPane.showMessageDialog(null,j2.vitoria());
									Menu.btnNewButton.setEnabled(true);
                                    	Menu.btnMelhorDe.setEnabled(true);
									dispose();
								}

							}

							else {
								if (j1.getPontos() > j2.getPontos())
									JOptionPane.showMessageDialog(null,j1.vitoria());

								else if (j1.getPontos() == j2.getPontos())
									JOptionPane.showMessageDialog(null,"Empatou");

								else
									JOptionPane.showMessageDialog(null,j2.vitoria());

								Menu.btnNewButton.setEnabled(true);
                                	Menu.btnMelhorDe.setEnabled(true);
								dispose();
							}

						}
					}
				});
				btnNewButton.setBounds(10, 24, 100, 23);
				contentPane.add(btnNewButton);
			}
				
			else {
				Menu.btnNewButton.setEnabled(true);
				Menu.btnMelhorDe.setEnabled(true);
				dispose();
				
			}
				
		}


		else {
			Menu.btnMelhorDe.setEnabled(true);
			Menu.btnNewButton.setEnabled(true);
			dispose();
		}
			










	}
}
import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import javax.swing.UIManager;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Toolkit;
import java.awt.Color;

public class Menu extends JFrame {

	private JPanel contentPane;

	static boolean regra1 = true;
	static JButton btnNewButton = new JButton("18 pontos");
	static JButton btnMelhorDe = new JButton("Melhor de 3");
	
	
	


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Menu frame = new Menu();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Menu() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png")));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Dados Arcade");
		lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow"));
		lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18));
		lblNewLabel.setBounds(236, 39, 138, 33);
		contentPane.add(lblNewLabel);
		
		
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				regra1 = true;
				new View().setVisible(true);
			}
		});
		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setBounds(246, 83, 104, 23);
		contentPane.add(btnNewButton);
		
		
		btnMelhorDe.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				regra1 = false;
				new View().setVisible(true);
			}
		});
		btnMelhorDe.setForeground(Color.BLACK);
		btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground"));
		btnMelhorDe.setBounds(246, 124, 104, 23);
		contentPane.add(btnMelhorDe);
		
		JLabel label = new JLabel("");
		label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg")));
		label.setBounds(10, 0, 277, 192);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("");
		label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png")));
		label_1.setBounds(0, 0, 434, 261);
		contentPane.add(label_1);
	}
}

public class Jogador {
	private String nome = null;
	private int pontos;
	private int pontosRodada = 0;
	
	public void aumentarPontos(int pontos) {
		this.pontos += pontos;
	}
	
	public String vitoria() {
		
		return "Parabéns " + this.nome + " você venceu com " + String.valueOf(pontos) + "!!";
	}
	
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	public void setPontosRodada(int pontosRodada) {
		this.pontosRodada = pontosRodada;
	}
	
	public String getNome() {
		return nome;
	}
	
	public int getPontos() {
		return pontos;
	}
	
	public int getPontosRodada() {
		return pontosRodada;
	}
}
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Dado {
	private int numeroLados = 6;
	
	public int jogarDado() {
		int escolhido = new Random().nextInt(numeroLados) + 1;
		
		return escolhido;
	}
	
	public void showImagem(int i, JLabel lblNewLabel) {

		if( i == 1)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (3).jpg")));

		else if(i == 2)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (4).jpg")));


		else if(i == 3)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (5).jpg")));


		else if(i == 4)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (6).jpg")));


		else if(i == 5)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/download (7).jpg")));


		else if(i == 6)
			lblNewLabel.setIcon(new ImageIcon(View.class.getResource("/imagem/View/images (1).jpg")));
	}
}

 

dddd.png

download (2).jpg

download (3).jpg

download (4).jpg

download (5).jpg

download (6).jpg

download (7).jpg

download (8).jpg

icons8-dado-24.png

images (1).jpg

Postado

Na classe View, coloca uma condição depois de pegar cada um dos nomes:

String nome1 = JOptionPane.showInputDialog(null, "Digite o primeiro nome", "Informação", JOptionPane.PLAIN_MESSAGE);
if (nome1 == null) {
    System.exit(0);
}

String nome2 = JOptionPane.showInputDialog(null, "Digite o segundo nome", "Informação", JOptionPane.PLAIN_MESSAGE);
if (nome2 == null) {
    System.exit(0);
}

// Continua seu código

 

Postado
Em 18/05/2019 às 09:54, AdrianoSiqueira disse:

Na classe View, coloca uma condição depois de pegar cada um dos nomes:


String nome1 = JOptionPane.showInputDialog(null, "Digite o primeiro nome", "Informação", JOptionPane.PLAIN_MESSAGE);
if (nome1 == null) {
    System.exit(0);
}

String nome2 = JOptionPane.showInputDialog(null, "Digite o segundo nome", "Informação", JOptionPane.PLAIN_MESSAGE);
if (nome2 == null) {
    System.exit(0);
}

// Continua seu código

 

Com System.exit(0) ele encerra toda a aplicação, quero fechar apenas a janela View (impedir que ela seja exibida) e voltar para Menu.

Acredito ter resolvido o problema:

Em 17/05/2019 às 20:55, Joanderson Pereira disse:

No Menu (JFrame) é possível selecionar dois modos (melhor de 3 e 18 pontos), escolhendo qualquer um dos dois criará um novo View(JFrame onde é exibido o jogo), no inicio do construtor de View coloquei dois showImputDialog que pedem que seja digitado o nome do Jogador 1 e em seguida do Jogador 2.

Maneira 1 -

O View é instanciado no momento que o usuário clica em um dos dois botões, parte das informações do JFrame estavam sendo carregadas antes do showImputDialog ser exibido (estavam fora do if que verificava o nome do usuário), coloquei elas dentro do if, mas acho verdadeiro problema estava no new View().setVisible(true) dentro da classe Menu, que configura a janela como visivel.

 

Criei um objeto View (chamado frame) não instanciado dentro da classe View, quando o usuário clica em cancelar (no showImputDialog) o programa vai tentar um frame.dispose(); Como frame não está instanciado o programa gera um NullPointerException e encerra a aplicação relacionada com a classe View. Voltando para Menu (que continua aberto).

 

Maneira 2 - 

Eu achei que essa maneira não é a correta para resolver o problema, então eu recortei os showImputDialog do construtor da classe View para os Jbuttons da classe Menu, tornei os dois jogadores de View public e realizei a verificação dentro desses Jbuttons, se o usuário clica em cancelar View.setVisible(true) não é rodado.

O problema é que o Java carrega toda a janela sem necessidade e meus jogadores agora são public :(

 

Quero perguntar agora se a primeira maneira de resolver esse problema é mesmo errada.

 

Segue o código da maneira 2, não quero meus jogadores public ;-;

public class View extends JFrame {

	private JPanel contentPane;
	private int rodadas = 0;
	private int objetivo = 18;
	private Dado dado = new Dado();
	int vez = new Random().nextInt(1);
	Jogador j1 = new Jogador();
	Jogador j2 = new Jogador();

 

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.ImageIcon;
import javax.swing.UIManager;
import java.awt.Font;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Toolkit;
import java.awt.Color;

public class Menu extends JFrame {

	private JPanel contentPane;

	static boolean regra1 = true;
	static JButton btnNewButton = new JButton("18 pontos");
	static JButton btnMelhorDe = new JButton("Melhor de 3");
	
	View view;
	
	


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Menu frame = new Menu();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Menu() {
		setIconImage(Toolkit.getDefaultToolkit().getImage(Menu.class.getResource("/imagem/view/icons8-dado-24.png")));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JLabel lblNewLabel = new JLabel("Dados Arcade");
		lblNewLabel.setForeground(UIManager.getColor("InternalFrame.borderDarkShadow"));
		lblNewLabel.setFont(new Font("Lucida Sans", Font.BOLD, 18));
		lblNewLabel.setBounds(236, 39, 138, 33);
		contentPane.add(lblNewLabel);
		
		
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				regra1 = true;
				view = new View();
				String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
				if (nomeJ1 != null) {
					view.j1.setNome(nomeJ1);
					String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);

					if (nomeJ2 != null) {
						view.j2.setNome(nomeJ2);
						btnNewButton.setEnabled(true);
						btnMelhorDe.setEnabled(true);
						view.setVisible(true);
					}
					else {
						btnNewButton.setEnabled(true);
						btnMelhorDe.setEnabled(true);
					}
					
				}
				else {
					btnNewButton.setEnabled(true);
					btnMelhorDe.setEnabled(true);
				}
				
			
			}
		});
		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setBounds(246, 83, 104, 23);
		contentPane.add(btnNewButton);
		
		
		btnMelhorDe.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				regra1 = false;
				view = new View();
				String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
				if (nomeJ1 != null) {
					view.j1.setNome(nomeJ1);
					String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);

					if (nomeJ2 != null) {
						view.j2.setNome(nomeJ2);
						
						view.setVisible(true);
					}
					
					else {
						btnNewButton.setEnabled(true);
						btnMelhorDe.setEnabled(true);
					}
									
				}
				else {
					btnNewButton.setEnabled(true);
					btnMelhorDe.setEnabled(true);
				}
			}
		});
		btnMelhorDe.setForeground(Color.BLACK);
		btnMelhorDe.setBackground(UIManager.getColor("FormattedTextField.inactiveBackground"));
		btnMelhorDe.setBounds(246, 124, 104, 23);
		contentPane.add(btnMelhorDe);
		
		JLabel label = new JLabel("");
		label.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/download (2).jpg")));
		label.setBounds(10, 0, 277, 192);
		contentPane.add(label);
		
		JLabel label_1 = new JLabel("");
		label_1.setIcon(new ImageIcon(Menu.class.getResource("/imagem/View/dddd.png")));
		label_1.setBounds(0, 0, 434, 261);
		contentPane.add(label_1);
	}
}

 

 

Postado

@Joanderson Pereira Olá. Pra começar eu não programo em Java Swing (comecei direto com o JavaFX) mas experimenta fazer algo assim no class Menu:

btnMelhorDe.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {

        boolean validado = false;

        while (true)  {
            jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);

            jogador2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);

            if (jogador1 == null && jogador2 == null) {
                JOptionPane.showMessageDialog(null, "Cancelado!");
                frame.setVisible(true);
                break;
            } else if (jogador1.equals("") && jogador2.equals("")) {
                JOptionPane.showMessageDialog(null, "O nome dos jogadores deve ser informado");
                frame.setVisible(true);
                break;
            } else if (!jogador1.equals("") && !jogador2.equals("")) {
                validado = true;
                break;
            }

        }

        if (validado) {
            // começa o jogo
            frame.setVisible(false);
        }

    }
});

Se quiser pode fazer uma verificação logo depois de pedir o nome do jogador 1 e depois do nome do jogador 2 e não como mostrei acima, onde primeiro peço o nome dos dois jogadores para depois validar

Não sei se tem como atribuir um evento caso o botão Cancelar seja clicado em Java Swing no caso de JOptionPane (esse é o problema)

Qualquer dúvida é só perguntar, ok?

 

Outro ponto: Se quer gerar de forma randômica que começa o jogo na classe View seria isso:

int vez = new Random().nextInt(2); // retorna 0 ou 1

Ou assim, que fica bem melhor:

int vez = (int) (Math.random() * 2);

Caramba! Programar com o JavaFX é bem mais fácil e simples

Não tô nem conseguindo abrir a janela do jogo no Java Swing rs...

Obs: Tem dois métodos main no seu código (!?)

 

Vou dar um dica, apesar de estar feliz em ver seu desempenho no Java: Invista no JavaFX!

O Java Swing já foi descontinuado pela Oracle, ou seja, a Oracle parou de fazer qualquer tipo de investimento no Java Swing e está investindo pesado no JavaFX 😉

 

Também daria para simplificar e fazer como o @AdrianoSiqueira mostrou, com algumas mudanças:

frame.setVisible(false);

while (true) {
    jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação",
                                           JOptionPane.PLAIN_MESSAGE);

    if (jogador1 == null) {
        frame.setVisible(true);
        break;
    }

    jogador2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação",
                                           JOptionPane.PLAIN_MESSAGE);

    if (jogador2 == null) {
        frame.setVisible(true); 
        break;
    }
}

Fica a seu critério escolher qual achar melhor, se gostou das dicas, claro :)

 

Defini o frame e o nome dos jogadores como atributos da class Menu para fazer do forma como estou mostrando:

private static Menu frame;
private String jogador1 = null;
private String jogador2 = null;

 

  • Solução
Postado

Resolvi, o problema todo estava nessa linha do código:

new View().setVisible(true);

Eu estava chamando o showImputDialog dentro do construtor da classe View, eu pensava que o ato de criar e colocar informações no JFrame o tornava visível. Só que não era bem assim que estava acontecendo.

 

Em 17/05/2019 às 20:55, Joanderson Pereira disse:

Eu quero que durante esse showImputDialog caso o usuário clique em cancelar o JFrame de View não seja exibido na tela e retorne para o JFrame do Menu.

Tentei realizar uma lógica para que isso acontecesse porém quando o usuário clica em cancelar, o JFrame de View é aparentemente fechado porém ao voltar para o ActionListener(JButton do Menu)  o View é novamente aberto com todas as informações descarregadas.

 

Em View( ) { de new View.setVisible(true);} o construtor da classe é chamado, o compilador "para" apenas para executar as linhas do construtor de View, ou seja, o compilador ainda não chegou em .setVisible(true); 

 

O comando que exibe a janela na tela é setVisible(true), o que o meu showImputDialog estava fazendo era decidir se as informações da janela seriam carregadas ou não, quando usuário terminava de interagir com o showImputDialog independentemente das informações da janela serem carregadas o compilador continuava a ler a linha {new View.setVisible(true);}. E exibia o que estivesse no JFrame

 

Ou seja com as informações carregadas ou não, o JFrame era exibido quando chegava em .setVisible(true);

 

Então eu coloquei o setVisible(true) dentro do construtor da classe View (mas especificamente,dentro do if do showImputDialog), agora a janela só é exibida caso os dois nomes sejam informados, caso contrário o programa retorna para Menu.

 

//Classe Menu
btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				regra1 = true;
				new View();
				
				
				
				
			
			}
		});
		btnNewButton.setBackground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setForeground(UIManager.getColor("FormattedTextField.selectionForeground"));
		btnNewButton.setBounds(246, 83, 104, 23);
		contentPane.add(btnNewButton);
		
		
		btnMelhorDe.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				regra1 = false;
				new View();
			
			}
		});
//Construtor da Classe View
String nomeJ1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação", JOptionPane.PLAIN_MESSAGE);
		if (nomeJ1 != null) {			
			String nomeJ2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação", JOptionPane.PLAIN_MESSAGE);

			if (nomeJ2 != null) {
				j1.setNome(nomeJ1);
				j2.setNome(nomeJ2);
				Menu.btnNewButton.setEnabled(true);
				Menu.btnMelhorDe.setEnabled(true);
				setVisible(true);
				
				Menu.btnNewButton.setEnabled(false);
				Menu.btnMelhorDe.setEnabled(false);

P.S: Meus jogadores estão private novamente :) 

 

adicionado 25 minutos depois
Em 21/05/2019 às 19:46, r_Tray disse:

int vez = new Random().nextInt(2); // retorna 0 ou 1

No meu estava errado, só retornava 0, por isso que o jogador um sempre jogava primeiro, eu pensava que era apenas sorte :D

 

Em 21/05/2019 às 19:46, r_Tray disse:

Obs: Tem dois métodos main no seu código (!?)

O código é gerado pelo WindowBuilder, então sim, como eu executava apenas a classe principal (Menu) que chamava as outras não estava dando problemas, não sei se um pontoJar iria dar problema. (Obs agora só tem um método main no código)

 

Em 21/05/2019 às 19:46, r_Tray disse:

int vez = (int) (Math.random() * 2);

Ok, alterei aqui.

 

Em 20/05/2019 às 16:57, Joanderson Pereira disse:

Quero perguntar agora se a primeira maneira de resolver esse problema é mesmo errada.

Não é correto deixar o compilador lidar com as exceções, como programadores é ideal que tratemos elas (Pelo que entendi).

Null refere-se a uma posição vazia na memória, é comum que métodos retornem null, mas apenas em métodos que procuram algo.

Correto:

Um método pegarLivroNaPosicao(int posicao), se não tiver um livro naquela posição quer dizer que ela está vazia, o método retorna null e podemos tratar essa exceção, por exemplo, com uma mensagem para o usuário avisando que não tem livro naquela posição.

Errado: 

Um método comprarLivro(Livro livro), vejamos, o livro está aí, se esse método depender de um saldo para que a compra seja efetuada, o retorno deve ser um true ou false, ou ainda uma mensagem para o usuário. retornar null é uma má prática de programação.

 

No meu código (maneira 1)  eu estava forçando um erro para fechar a janela indesejada, isso também é uma má prática de programação.

 

Em 21/05/2019 às 19:46, r_Tray disse:

Também daria para simplificar e fazer como o @AdrianoSiqueira mostrou, com algumas mudanças:

frame.setVisible(false);

while (true) {
    jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação",
                                           JOptionPane.PLAIN_MESSAGE);

    if (jogador1 == null) {
        frame.setVisible(true);
        break;
    }

    jogador2 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 2", "Informação",
                                           JOptionPane.PLAIN_MESSAGE);

    if (jogador2 == null) {
        frame.setVisible(true); 
        break;
    }
}

Percebi que tanto você como Adriano colocaram esse if (que se verdadeiro, encerra o programa) "no meio do código", tenho o hábito de fazer o contrário. A minha maneira é uma prática ruim, ou algo do tipo?

if (jogador != null) {
...continua o código com as funções que quero executar
.
.
.
.
.
}
else {
fecha o programa ou exibe o erro
}

 

Em 21/05/2019 às 19:46, r_Tray disse:

Vou dar um dica, apesar de estar feliz em ver seu desempenho no Java: Invista no JavaFX!

O Java Swing já foi descontinuado pela Oracle, ou seja, a Oracle parou de fazer qualquer tipo de investimento no Java Swing e está investindo pesado no JavaFX 😉

Devo parar de ver Java Swing?

Postado

@Joanderson Pereira Olá. Quanto a essa questão:

Em 23/05/2019 às 16:16, Joanderson Pereira disse:

Percebi que tanto você como Adriano colocaram esse if (que se verdadeiro, encerra o programa) "no meio do código", tenho o hábito de fazer o contrário. A minha maneira é uma prática ruim, ou algo do tipo?

Nesse caso não precisa se preocupar pois com o passar do tempo você vai saber exatamente como resolver

Só perceba esse ponto com relação a essa validação:

private String jogador1 = null; 
private String jogador2 = null;	

// restante do código

while (true) {

    jogador1 = JOptionPane.showInputDialog(null, "Digite o nome do Jogador 1", "Informação",
							JOptionPane.PLAIN_MESSAGE);
  
    if (jogador1 == null) { // Clicou no botão cancelar
        JOptionPane.showMessageDialog(null, "Cancelado!");
        // ver o que quer fazer 
        break;
    } else if (jogador1.equals("")) { // clicou no botão ok sem informar o nome
        JOptionPane.showMessageDialog(null, "O nome do jogador 1 deve ser informado");
        // ver o que quer fazer
        break;
    }
    // continua
}

Tem uma diferença entre o nome do jogador ficar como null e não ser preenchido (vazio)

 

 

Em 23/05/2019 às 16:16, Joanderson Pereira disse:

Devo parar de ver Java Swing?

Uma das características de todo bom programador é estar constantemente atualizado

Como falei, o Java Swing já foi descontinuado pela Oracle já há um tempinho, logo, estudar isso (Java Swing) equivale a estudar algo que já pode ser visto como defasado e, nesse caso, não vale a pena, sendo que com o JavaFX você pode fazer a mesma coisa e ainda com a vantagem de poder criar interfaces gráficas de modo gráfico (na base de arrasta e solta botões) de maneira muito mais fácil e ainda rica em detalhes e é algo que está bem atualizado

Agora estamos no Java 12 (não sei se sabia disso) devido as mudanças que a Oracle fez quanto as versões do Java

Se quiser saber mais sobre o assunto recomendo esse blog:

Java vai ser pago? Entenda as mudanças da Oracle

E mesmo assim inda tem muita gente que não sabe disso (acredite ou não)

Devido a isso, a tão famosa IDE Netbeans (para o Java) ficou também defasada, pois simplesmente não está rodando com as versões mais atuais do Java (9, 10, 11, 12 até onde sei) apenas Java 8, logo, não é recomendada

Creio que seria isso. Fica a seu critério agora escolher entre Java Swing e JavaFX. Eu recomendo que invista no JavaFX! 

Sucesso com seus estudos, está no caminho certo! :)

 

Obs: Se puder, poste o seu código, pronto agora, para a gente ver como ficou

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!