quarta-feira, 16 de fevereiro de 2011

Swing – WindowListener


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 java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.*; 
import javax.swing.*;  
public class JanelaTeste extends JFrame{
 private static void criaJanelaExemploGUI() {
   //Cria uma nova janela, instanciando um JFrame, afinal para fechar
   //uma janela, primeiro precisamos da janela!
  JFrame frame = new JFrame(“Janela Teste – Brincando com o botão Fechar”);
 
  //Seta o comportamento padrão para a ação “Fechar” da janela.
  //Neste caso, estamos informando “Não faça nada ao fechar” 
  frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
  
//Esse bloco não tem a menor necessidade, coloquei apenas para ter 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 zero, então 0, 1, 2…

  try {
      UIManager.LookAndFeelInfo[] instalados = UIManager.getInstalledLookAndFeels();
      UIManager.setLookAndFeel(instalados[2].getClassName());
  }catch(Exception e) { 
      e.printStackTrace();
  }  
 
 
 //Seta uma dimensão para a janela, que será assumida na inicialização;
//porporção larguxa x altura

  frame.setSize(400,100);
 
  //Adiciona o WindowListener ao frame, este listener possibilita capturar todos os eventos
  //da janela, ex.: Fechando, Minimizando, Restaurando, Recebendo Foco, Perdendo Foco, etç.

  frame.addWindowListener(new WindowAdapter() {
    //aqui estou informando que quero o evento fechando a janela    public void windowClosing (WindowEvent e) {
       //Nesta parte devemos colocar todo o que queremos que aconteça quando o botão
       //fechar for pressionado, neste caso apenas é exibida uma mensagem simples
       //e depois a aplicação é encerrada.
      JOptionPane.showMessageDialog(null,“A janela será fechada.”,
       “Você clicou em fechar.”,JOptionPane.PLAIN_MESSAGE);
     
      System.exit(0);
    }
  });
 
  //Deixa o frame visivel aos olhos dos mortais.  frame.setVisible(true);
 }

 public static void main(String[] args){
  criaJanelaExemploGUI();
 }
}

 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: Induzir ao Fechar, fecha 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 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 TrayIcon para colocar um icone na bandeja, mas o icone por si só não faz nada! É preciso também criar um MouseAdapter (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 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!

Nenhum comentário:

Postar um comentário