Pergunta

Como fechar uma janela através do ícone exibido na barra de título?

Resposta

Para fechar uma janela (java.awt.Frame) através do ícone correspondente a ação "Fechar", exibido tipicamente no canto superior direito da barra de título das janelas, é necessário monitorar os eventos do tipo janela (java.awt.event.WindowEvent) através de um event listener apropriado, no caso um WindowListener.

Existem várias formas de implementar-se um WindowListener, sendo assim mostraremos uma forma básica, bastante conveniente na maioria dos casos, que utiliza duas classes: uma correspondente a classe que trata os eventos (o WindowListener) e outra que produz os eventos (a janela que desejamos fechar).

Uma classe WindowListener pode ser facilmente construída através do subclassing de java.awt.event.WindowAdapter, uma classe de conveniência que implementa todos métodos necessários de um WindowListener mas de forma vazia. Estendendo tal classe podemos implementar apenas o método windowClosing(), responsável pelo fechamento de uma janela, sobrepondo o método original (overhiding) com o código desejado:

class WindowHandler extends WindowAdapter {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
}

No caso esta classe WindowListener encerra a aplicação quando a janela tem o ícone "Fechar" acionado. Esta classe precisa ser registrada pela janela que pretendemos encerrar para obtermos o efeito desejado.

Dada uma classe Janela, que exibe um janela do tipo java.awt.Frame, na sua inicialização (geralmente no seu construtor), devemos registrar a classe responsável por monitorar os eventos de janela produzidos através do método addWindowListener(). Note que a classe WindowListener é adicionada dentro da classe janela, como uma inner class (JavaFaq 0112):

import java.awt.*;
import java.awt.event.*;

public class Janela extends Frame{
  // Construtor
  public Janela() {
    super("Janela que Fecha");
    // adição de componentes, etc.

    // registro do WindowListener
    addWindowListener(new WindowHandler());
  }

  // WindowListener como inner class
  class WindowHandler extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
      System.exit(0);
    }
  }

  public static void main(String a[]) {
    new Janela().show();
  }
}