Swing – WindowListener
Autor: Reinaldo Elias | Publicado: 2011-02-16T14:58:00-08:00


Iniciando a seção Swing (não pense em outra coisa, esse blog é de Java!!), vou postar um código-exemplo de WindowListener, mais precisamente o evento “Fechando a janela”, com esse exemplo é possível escolher qualquer comportamento ao fechar a jenela, só vai depender da sua criatividade:
Quer impossibilitar o fechamento? A vontade!
Quer enviar a janela para a bandeja do sistema? Você pode! (este exemplo não ensina a fazer isso, mas darei algumas dicas desta “POG” no final).Enfim, vamos ao que interessa, capturar o evento windowClosing, ou fechando a janela para os mais íntimos.
//Importação das bibliotecas que iremos precisar
import&nbsp;java.awt.event.WindowAdapter;
import&nbsp;java.awt.event.WindowEvent;
import&nbsp;javax.swing.JFrame;
import&nbsp;javax.swing.JOptionPane;
import&nbsp;java.awt.*;&nbsp;
import&nbsp;javax.swing.*;&nbsp;&nbsp;public class&nbsp;JanelaTeste&nbsp;extends&nbsp;JFrame{&nbsp;private static void&nbsp;criaJanelaExemploGUI() {
&nbsp;&nbsp;&nbsp;//Cria uma nova janela, instanciando um JFrame, afinal para fechar
&nbsp;&nbsp; //uma janela, primeiro precisamos da janela!&nbsp;&nbsp;JFrame frame =&nbsp;new&nbsp;JFrame(“Janela Teste – Brincando com o botão Fechar”);
&nbsp;
&nbsp;&nbsp;//Seta o comportamento padrão para a ação “Fechar” da janela.
&nbsp;&nbsp;//Neste caso, estamos informando “Não faça nada ao fechar”&nbsp;&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
&nbsp;&nbsp;//Esse&nbsp;bloco não tem a menor necessidade, coloquei apenas para ter&nbsp;algo
//adicional no código, neste caso a primeira linha dentro do TRY recolhe
//todos os looks instalados na máquina, depois eu seleciona o terceira da lista.
//lembrando que o array começa em&nbsp;zero, então 0, 1, 2…
&nbsp;&nbsp;try&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIManager.LookAndFeelInfo[] instalados = UIManager.getInstalledLookAndFeels();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIManager.setLookAndFeel(instalados[2].getClassName());
&nbsp;&nbsp;}catch(Exception e) {&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();
&nbsp;&nbsp;}&nbsp;&nbsp;
&nbsp;
&nbsp;
&nbsp;//Seta uma dimensão para a janela, que será assumida na inicialização;
//porporção larguxa x altura
&nbsp;&nbsp;frame.setSize(400,100);
&nbsp;
&nbsp;&nbsp;//Adiciona o WindowListener ao frame, este&nbsp;listener&nbsp;possibilita capturar todos os eventos
&nbsp;&nbsp;//da janela, ex.: Fechando, Minimizando, Restaurando, Recebendo Foco, Perdendo Foco, etç.
&nbsp;&nbsp;frame.addWindowListener(new&nbsp;WindowAdapter() {
&nbsp;&nbsp;&nbsp;&nbsp;//aqui estou informando que quero o evento fechando a janela&nbsp;&nbsp;&nbsp;&nbsp;public void&nbsp;windowClosing (WindowEvent e) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Nesta parte devemos colocar todo o que queremos que aconteça quando o botão
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //fechar for pressionado, neste caso apenas é exibida uma mensagem simples
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //e depois&nbsp;a&nbsp;aplicação é encerrada.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JOptionPane.showMessageDialog(null,“A janela será fechada.”,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“Você clicou em fechar.”,JOptionPane.PLAIN_MESSAGE);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;});
&nbsp;
&nbsp;&nbsp;//Deixa o frame visivel aos olhos dos mortais.&nbsp;&nbsp;frame.setVisible(true);
&nbsp;}

&nbsp;public static void&nbsp;main(String[] args){
&nbsp;&nbsp;criaJanelaExemploGUI();
&nbsp;}}
&nbsp;Alguns comentários adicionais…No comando “frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);“, estou setando a operação padrão de fechamento do frame, neste caso a opção desejada foi uma constante da classe JFrame, a constante DO_NOTHING_ON_CLOSE, não faça nada ao fechar, porém não existe somente esta, outras constantes podem ser passadas como parâmetros:
DISPOSE_ON_CLOSE:&nbsp;Induzir ao&nbsp;Fechar,&nbsp;fecha&nbsp;a janela.
HIDE_ON_CLOSE: Esconder ao Fechar, se quiser ver a jenela novamente basta aplicar um “setVisible(true)”.
EXIT_ON_CLOSE: Sai ao fechar, sai do sistema.Dentro do listener (windowListener), estamos invocando o evento windowClosing, para fiscalizar quando a janela é fechada, existem vários outros eventos úteis que podem ser utilizados, como por exemplo:
windowClosed: Invocado quando a janela é fechada
windowLostFocus: Invocado quando a janela perde o foco.
windowIconified: Invocado quando a janela é minimizada.
windowOpened: Invocado quando a janela é aberta.
E outros mais, que podem ser consultados na API da classe&nbsp;WindowAdapter.Agora sobre enviar a janela para a bandeja do sistema (ao lado do reógio), que comentei no inicio do tópico, bem isso não existe nenhum programa (ao menos em java) faz isso, o que acontece é o seguinte: Em determinado momento, quando é decidido que o programa tem que ir para a bandeja do sistema, deve-se esconder a janela, isso mesmo “setVisible(false)”, desta forma a janela some da visão do usuário, porém continua ativa.
Mas como fazer aquele icone com um menu bonitinho do lado do relógio? Para isso é preciso utilizar algumas artimanhas da classe&nbsp;TrayIcon&nbsp;para colocar um icone na bandeja, mas o icone por si só não faz nada! É preciso também criar um&nbsp;MouseAdapter&nbsp;(mouseClicked, mousePressed, etç, basta seguir o mesmo exemplo do WindowAdapter acima), para capturar o evento do mouse clicando neste icone e quando isso for feito devemos abrir um&nbsp;JPopupMenu, para abrir um menuzinho com as opções “Mostrar Janela”, “Sair”, “Etç, etç, etç”.
Dependendo da sua criatividade e boa vontade, da até pra fazer um efeitozinho da janela sendo “enviada” para a bandeja, exemplo: Um loop que vai alterando o tamanho e a posição da janela fazendo-a ficar menor e mais próxima do relógio antes de a escondermos.Fazer um exemplo/modelo de uma janela sendo enviada para a bandeja do sistema está na minha lista de tarefas, em breve postarei aqui!