Ir ao conteúdo
  • Cadastre-se

Java Java: Problemas para fechar um JFrame


Ir à solução Resolvido por Joanderson Pereira,

Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

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

 

Link para o comentário
Compartilhar em outros sites

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

 

 

Link para o comentário
Compartilhar em outros sites

@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;

 

Link para o comentário
Compartilhar em outros sites

  • Solução

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?

Link para o comentário
Compartilhar em outros sites

@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

Link para o comentário
Compartilhar em outros sites

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...