Qual é a maneira correta JFrame
de fechar um, da mesma forma que se o usuário tivesse pressionado o X
botão Fechar ou pressionado Alt+ F4(no Windows)?
Tenho minha operação de fechamento padrão definida da maneira que desejo, via:
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Faz exatamente o que eu quero com os controles acima mencionados. Esta questão não é sobre isso.
O que realmente quero fazer é fazer com que a GUI se comporte da mesma maneira que pressionar um botão X
Fechar faria com que ela se comportasse.
Suponha que eu estenda WindowAdaptor
e adicione uma instância do meu adaptador como ouvinte via addWindowListener()
. Gostaria de ver a mesma seqüência de chamadas através windowDeactivated()
, windowClosing()
e windowClosed()
como ocorreria com o X
botão de fechar. Não tanto rasgar a janela como dizer para ela se rasgar, por assim dizer.
Respostas:
Se você deseja que a GUI se comporte como se tivesse clicado no
X
botão Fechar, será necessário enviar um evento de fechamento de janela para oWindow
. AExitAction
partir do fechamento de um aplicativo, você pode adicionar essa funcionalidade a um item de menu ou a qualquer componente que useAction
s facilmente.fonte
Não é muito complicado.
fonte
Se, com Alt-F4 ou X, você quer dizer "Sair do aplicativo imediatamente, sem considerar o que outros Windows ou threads estão executando",
System.exit(...)
fará exatamente o que deseja de maneira muito brusca, de força bruta e possivelmente problemática.Se por Alt-F4 ou X você quer dizer ocultar a janela,
frame.setVisible(false)
é assim que você "fecha" a janela. A janela continuará consumindo recursos / memória, mas poderá ser tornada visível novamente muito rapidamente.Se por Alt-F4 ou X você quer dizer ocultar a janela e dispor de todos os recursos que está consumindo,
frame.dispose()
é assim que você "fecha" a janela. Se o quadro foi a última janela visível e não há outros threads que não sejam daemon em execução, o programa será encerrado. Se você exibir a janela novamente, será necessário reinicializar todos os recursos nativos novamente (buffer gráfico, identificadores de janela, etc.).dispose()
pode estar mais próximo do comportamento que você realmente deseja. Se o seu aplicativo tiver várias janelas abertas, você deseja que o Alt-F4 ou X saia do aplicativo ou simplesmente feche a janela ativa?O tutorial do Java Swing nos ouvintes da janela pode ajudar a esclarecer as coisas para você.
fonte
Se você fez isso para garantir que o usuário não possa fechar a janela:
Então você deve mudar seu
pullThePlug()
método para serEu achei que essa é a única maneira que funciona bem com o
WindowListener
eJFrame.DO_NOTHING_ON_CLOSE
.fonte
Aqui estão suas opções:
fonte
Sair do processo de execução do Java é muito fácil, basicamente você precisa fazer apenas duas coisas simples:
System.exit(...)
no ponto de encerramento do aplicativo. Por exemplo, se seu aplicativo for baseado em quadros, você poderá adicionar ouvinteWindowAdapter
e chamarSystem.exit(...)
dentro de seu métodowindowClosing(WindowEvent e)
.Nota: você deve ligar
System.exit(...)
caso contrário, seu programa está envolvido com erros.System.exit(...)
no ponto certo, mas isso não significa que o método possa ser chamado sempre, pois exceções java inesperadas podem impedir que o método seja chamado.Isso está fortemente relacionado às suas habilidades de programação.
** A seguir, é apresentado um exemplo mais simples (
JFrame
baseado) que mostra como chamar o método de saídafonte
Não apenas para fechar o JFrame, mas também para acionar os eventos WindowListener, tente o seguinte:
fonte
A melhor maneira de fechar programaticamente um quadro oscilante é fazê-lo se comportar como faria quando o botão "X" for pressionado. Para fazer isso, você precisará implementar o WindowAdapter que atenda às suas necessidades e definir a operação de fechamento padrão do quadro para não fazer nada (DO_NOTHING_ON_CLOSE).
Inicialize seu quadro assim:
Você pode fechar o quadro programaticamente enviando o evento WINDOW_CLOSING, desta forma:
Isso fechará o quadro como se o botão "X" fosse pressionado.
fonte
Se você realmente não deseja que seu aplicativo seja encerrado quando um JFrame for fechado,
usar :
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
ao invés de :
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Aqui está uma sinopse da aparência da solução,
fonte
Esta resposta foi dada por Alex e eu gostaria de recomendá-la. Funcionou para mim e outra coisa é direta e simples.
fonte
Este exemplo mostra como realizar a operação de fechamento de janela confirmada.
A janela possui um adaptador de janela que alterna a operação de fechamento padrão para
EXIT_ON_CLOSE
ouDO_NOTHING_ON_CLOSE
depende da sua resposta noOptionDialog
.O método
closeWindow
doConfirmedCloseWindow
acionamento de um evento de janela fechada e pode ser usado em qualquer lugar, ou seja, como uma ação de um item de menufonte
Com base nas respostas já fornecidas aqui, é assim que eu a implementei:
O JFrame faz com que o evento seja fechado e, ao fechar, sai.
fonte
É necessário inserir a chamada na fila de mensagens do AWT para que todo o tempo ocorra corretamente, caso contrário não enviará a sequência de eventos correta, especialmente em um programa multiencadeado. Quando isso for feito, você poderá manipular a sequência de eventos resultante exatamente como faria se o usuário clicasse no botão [x] para um JFrame decorado com SO fornecido.
fonte
Eu tentei isso, escreva seu próprio código para o evento formWindowClosing () .
Isso pergunta ao usuário se ele deseja sair do quadro ou do aplicativo.
fonte
Publicando o que estava no corpo da pergunta como resposta da CW.
Queria compartilhar os resultados, derivados principalmente do seguinte link do camickr. Basicamente, eu preciso jogar um
WindowEvent.WINDOW_CLOSING
na fila de eventos do aplicativo. Aqui está uma sinopse da aparência da soluçãofonte
Se você não deseja que seu aplicativo seja encerrado quando um JFrame estiver fechado, use: setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE)
em vez de: setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
A partir da documentação:
DO_NOTHING_ON_CLOSE (defined in WindowConstants)
: Não faça nada; requer que o programa manipule a operação no método windowClosing de um objeto WindowListener registrado.HIDE_ON_CLOSE (defined in WindowConstants)
: Oculte automaticamente o quadro depois de chamar qualquer objeto WindowListener registrado.DISPOSE_ON_CLOSE (defined in WindowConstants)
: Oculte e descarte automaticamente o quadro depois de chamar qualquer objeto WindowListener registrado.EXIT_ON_CLOSE (defined in JFrame)
: Saia do aplicativo usando o método de saída do sistema. Use isso apenas em aplicativos.ainda pode ser útil: você pode usar
setVisible(false)
no seu JFrame se desejar exibir o mesmo quadro novamente. Caso contrário, chamedispose()
para remover todos os recursos da tela nativa.copiado de Peter Lang
https://stackoverflow.com/a/1944474/3782247
fonte
fonte
setVisible(false)
.setVisible(false); .setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);