Qual é a maneira correta de encerrar um aplicativo Swing do código e quais são as armadilhas?
Tentei fechar meu aplicativo automaticamente depois que um cronômetro disparou. Mas apenas chamar dispose()
o JFrame
não funcionou - a janela desapareceu, mas o aplicativo não foi encerrado. No entanto, ao fechar a janela com o botão Fechar, o aplicativo é encerrado. O que devo fazer?
Respostas:
A ação de fechamento padrão do JFrame pode ser definida como "
DISPOSE_ON_CLOSE
" em vez deEXIT_ON_CLOSE
(por que as pessoas continuam usando EXIT_ON_CLOSE está além da minha compreensão).Se você tiver janelas não dispostas ou threads não daemon, seu aplicativo não será encerrado. Isso deve ser considerado um erro (e resolvê-lo com System.exit é uma ideia muito ruim).
Os culpados mais comuns são java.util.Timer e um Thread personalizado que você criou. Ambos devem ser configurados para daemon ou explicitamente eliminados.
Se você quiser verificar todos os quadros ativos, pode usar
Frame.getFrames()
. Se todos os Windows / Frames forem descartados, use um depurador para verificar se há threads que não sejam daemon que ainda estão em execução.fonte
back
janela? Se a segunda janela for fechada e você usarDISPOSE_ON_CLOSE
o programa não termina porque a primeira janela ainda está "não-disposta" ... há uma maneira de resolver isso sem usarDISPOSE_ON_CLOSE
?Eu acho um EXIT_ON_CLOSE
antes
System.exit(0)
é melhor, pois você pode escrever um Window Listener para fazer algumas operações de limpeza antes de realmente deixar o aplicativo.Esse listener de janela permite que você defina:
fonte
Experimentar:
Rude, mas eficaz.
fonte
Pode ser que o caminho seguro seja algo como:
fonte
Frame
com uma letra maiúscula, exatamente como o nome de uma classe…O programa a seguir inclui código que encerrará um programa sem threads estranhos sem chamar explicitamente System.exit (). Para aplicar este exemplo a aplicativos que usam threads / ouvintes / temporizadores / etc, basta inserir o código de limpeza solicitando (e, se aplicável, aguardando) seu encerramento antes de WindowEvent ser iniciado manualmente em actionPerformed ().
Para aqueles que desejam copiar / colar código capaz de funcionar exatamente como mostrado, um método principal um pouco feio, mas irrelevante, está incluído no final.
fonte
Se bem entendi, você deseja fechar o aplicativo mesmo que o usuário não tenha clicado no botão Fechar. Você precisará registrar WindowEvents talvez com addWindowListener () ou enableEvents (), o que for mais adequado às suas necessidades.
Você pode então invocar o evento com uma chamada para processWindowEvent (). Aqui está um código de amostra que criará um JFrame, aguarde 5 segundos e feche o JFrame sem interação do usuário.
Como você pode ver, o método processWindowEvent () faz com que o evento WindowClosed seja disparado onde você tem a oportunidade de fazer algum código de limpeza antes de fechar o aplicativo.
fonte
Dê uma olhada na documentação da Oracle .
A partir do JDK 1.4, um aplicativo será encerrado se:
Cornercases:
O documento afirma que alguns pacotes criam componentes exibíveis sem liberá-los. Um programa que chama Toolkit.getDefaultToolkit () não termina. é, entre outros, dado como exemplo.
Além disso, outros processos podem manter o AWT ativo quando, por qualquer motivo, estão enviando eventos para a fila de eventos nativos.
Também notei que em alguns sistemas leva alguns segundos antes que o aplicativo realmente seja encerrado.
fonte
Eu acho que a ideia aqui é o WindowListener - você pode adicionar qualquer código que gostaria de executar antes de desligar
fonte
Em resposta a outros comentários, DISPOSE_ON_CLOSE não parece sair do aplicativo corretamente - ele apenas destrói a janela, mas o aplicativo continuará em execução. Se você deseja encerrar o aplicativo, use EXIT_ON_CLOSE.
fonte