Comando para fechar um JFrame

acabei de me lembrar do System.exit(0) acho que é isso
só não testei se esse comando fecha apenas a janela ou fecha a aplicação toda :slight_smile:

2 curtidas

[quote=thingol]setVisible(false) descarrega o tal frame, se ele estiver configurado para ser descarregado (ou seja, o JFrame foi configurado com “setDefaultCloseOperation(SwingConstants.DISPOSE_ON_CLOSE)”, se não me engano (não sei isso de cor.)
[/quote]

ele está configurado para setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE) pois foi o código gerado pelo netbeans

Use esse método:

jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

se vc quer descarregar explicitamente, use o jframe.dispose()

obrigado pelas dicas,
funcionou apenas quando chamei o método jframe.dispose() explicitamente.
vlw

Só para iluminar mais as idéias, o setVisible() só seta a visibilidade do JFrame, ou seja, true = visível e false = invisível.

Este defaultCloseOperation é usado quando você clica no “X” da janela.

flw

no meu caso eu queria um comando, para adicionar no ActionPerformed do botão cancelar, que fechache a janela. E agora funcionou certinho

Utilize:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Não há como errar

[quote=gustavo.magni]Utilize:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
[/quote]

O Netbeans não deixa vc alterar o código gerado por ele

Cara olhe as propriedade jo JFrame no netBeans

as propriedades são:
javax.swing.WindowConstants.EXIT_ON_CLOSE
javax.swing.WindowConstants.DISPOSE_ON_CLOSE
javax.swing.WindowConstants.BLABLÁ

não tem como mudar para JFrame.EXIT_ON_CLOSE, mas se essa variável for igual a primeira da lista, é a default do Netbeans, e mesmo assim não funciona.

Olá pessoal…

Para ter um JFrame que encerre toda a aplicação, a propriedade DefaultCloseOperation dele deve estar configurada como EXIT_ON_CLOSE.

Para ter um JFrame que não encerre toda a aplicação, que simplesmente se feche, a propriedade DefaultCloseOperation dele deve estar configurada como DISPOSE_ON_CLOSE.

Lembrando que no NetBeans, é possível alterar essa propriedade clicando com o botão direito do mouse sobre o JFrame em questão e na aba Properties é a primeira propriedade.

No caso de se ter um botão para fechar o JFrame, os códigos:
System.exit(0); encerra a aplicação.
this.dispose(); fecha somente o JFrame em questão, onde this = JFrame.

O método setVisible(); serve somente para exibir ou não o JFrame na tela.

Quanto a alocação e liberação do espaço de memória alocado, é a propria JVM que irá fazer através dos recursos de GarbageCollector, e no momento que ela julgar ser o melhor para não prejudicar a performance do sistema, ela irá remover todo objeto que não possui mais referências e liberar o espaço de memória que foi alocado para ele.
http://www.guj.com.br/java.tutorial.artigo.28.1.guj (Muito interessante tbem)

Espero ter ajudado pessoal, vlw t+

2 curtidas

Eu estava com essa mesma dúvida ha um tempo atrás e resolvi meu problema com os seguintes comandos no botão SAIR

private void jButton_exitActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
Runtime.getRuntime().exit(0);
}

isso mata akele processo q fica rodando quando vc dá um setVisible(false); e o netbeans diz q continua rodando uma IDE…

Acho q foi isso que vc perguntou…

[/]'s

1 curtida

[quote=Giulliano]Eu estava com essa mesma dúvida ha um tempo atrás e resolvi meu problema com os seguintes comandos no botão SAIR

private void jButton_exitActionPerformed(java.awt.event.ActionEvent evt) {
this.setVisible(false);
Runtime.getRuntime().exit(0);
}

isso mata akele processo q fica rodando quando vc dá um setVisible(false); e o netbeans diz q continua rodando uma IDE…

Acho q foi isso que vc perguntou…

[/]'s[/quote]

aqui funcionou com o comando jframe.dispose(), mas esse que vc falou eu não testei.

e cleiton, valeu pelas explicações

Olá, por exemplo se vc tiver um cadastro e quiser sair de um frame mas não fechar o aplicativo então utilize:
this.dispose();

Assim apenas aquele frame que será fechado :!: :!: :!:

Estou aqui para agradecer por solucionarem esta dúvida.
Ajudou-me demais este comando this.dispose(). funcionou corretamente como eu queria.

Só para ajudar alguém que possa ter o mesmo problema que o meu, eu usei este comando para fechar uma tela de login que
fiz no meu sistema e abrir a tela principal do sistema.
E funcionou corretamente.
Ao logar no sistema, a tela de login fechou e a principal abriu numa boa.

Obrigado!

Eu preciso fazer usando While. Estou tentando evitar o erro de exceção.
Mas quero que a aplicação se feche apenas quando o usuário clicar no botão “cancelar” do JOptionPane.

boolean valido = true;
while (true) {


}

Ou seja se o usuário deixar algum campo em branco, mostra a mensagem de erro, mas o programa não fecha.
Já pesquisei em vários lugares, mas nada do que encontrei, me atendeu.
To postando o código pra vcs entenderem melhor.


package Atividade6;

import javax.swing.JOptionPane;

/**
 *
 * @author David Renan
 */
public class Principal {

   public static void main(String[] args) {
        // TODO code application logic here
        //String[] valores;
        String valores;
        int  numeros[], n;
        Cadastro cad = new Cadastro();
        String entrada;
        boolean valido = true;
        while (true) {
           try {
               entrada=JOptionPane.showInputDialog("1- Adicionar sorteio aleatorio \n 2- Adicionar sorteio "
                    + "\n 3- Imprimir");
                int opcao = Integer.parseInt(entrada);
               if (entrada != null) {
                    if (opcao==1) {
                       try {
                           n=Integer.parseInt(JOptionPane.showInputDialog("Quantos elementos terá o vetor?"));
                           cad.add(new Sena(n));
                       } 
                       catch (NumberFormatException excecao)
                        {
                            JOptionPane.showMessageDialog(null, "Verifique se digitou os dados corretamente.");
                        }

                    }
                    else if (opcao==2) {
                        try {
                            valores = JOptionPane.showInputDialog("Entre com os numeros separados por ;");
                            cad.add(new Sena(valores));    
                        }
                        catch (NumberFormatException excecao)
                        {
                            JOptionPane.showMessageDialog(null, "Verifique se digitou os dados corretamente.");
                        }
                    
                }
                else if (opcao==3) {
                    cad.imprimir();
                }
               
           }
          
           }
           catch (NumberFormatException excecao) {
                
               JOptionPane.showMessageDialog(null, "Digite a informaçao corretamente");
           }
            
        }
        
}
        
    
}

Eu faço da seguinte forma:

JFrame frame = new JFrame(); frame.setVisible(true); dispose();
Ah e colocar this.dispose(); dependendo da estrutura fecha todos janelas abertas. Opto por nesse caso somente dispose();

Galera, boa noite, estou reabrindo um tópico, pois estou tendo quase o mesmo problema que o cara estava tendo. Eu preciso fechar um JFrame, mas acredito que estou passando os comandos certos e não está funcionando. Este método abaixo, funcionava muito bem quando estava na classe da tela. Porém, por questões de manutenção e clean code, eu quis mudar todos os métodos referentes a menu para uma classe especifica. Desde então, sempre que estou em uma tela e tento mudar de tela usando alguma opção do menu a outra tela é aberta, porém a tela anterior continua aberta em segundo plano. Alguém consegue me ajudar?

	private JMenuItem getJMenuItemEmail() {
		if (jMenuItemEmail == null) {
			jMenuItemEmail = new JMenuItem();
			jMenuItemEmail.setText("Enviar E-MAIL");
			jMenuItemEmail.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					EmailVIEW email = new EmailVIEW();
			
					// Alterando a forma de fechamento da tela.
					email.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
					EmailController.getInstance().abrirTela();
					//TODO
					// Fechando a tela quando chamar algum menu.
					dispose();
					
				}
			});
		}
		return jMenuItemEmail;
	}