Pergunta

Como determinar o tamanho das bordas e da barra de título de uma janela?

Resposta

Para determinarmos o tamanho das bordas e barra de título de uma janela qualquer de uma aplicação devemos utilizar o método getInsets() que retorna um objeto java.awt.Insets tal como abaixo:

Insets i = getInsets(); // no local onde deseja obter tais medidas

Fazendo-se isto podemos utilizar os campos públicos top, bottom, left e right do objeto Insets retornado que contêm as medidas em pixels das bordas e barra de título:

Assim, a largura e a altura da área útil da uma janela podem ser determinadas utilizando-se também as medidas totais da janela retornadas num objeto java.awt.Dimension através da chamada do método getSize():

Dimension d = getSize(); // obtêm tamanho da janela
Insets i = getInsets();
int larguraJanela = d.width - i.left - i.right;
int alturaJanela = d.height - i.top - i.bottom;

Algumas observações importantes:

  1. O resultado retornado por getSize() só é válido após uma primeira exibição da janela, portanto cuidado no seu uso em construtores.
  2. O resultado retornado getInsets() só é válido após a criação do componente peer do sistema gráfico em uso, portanto seu uso em construtores deve ser precedido por uma chamada ao método addNotify() que espera pela criação do componente peer necessário.
  3. O sistema de coordenadas das janelas tem como origem canto superior esquerdo que fica "embaixo" da barra de título. Num método paint você pode transladar tal origem para o início da área útil com uma chamada ao método translate(int, int) do contexto gráfico java.awt.Graphics:
g.translate(i.left, i.top);

Segue um pequeno exemplo onde uma janela exibe sua altura e largura útil.

// FrameSize.java
import java.awt.*;

public class FrameSize extends Frame {

  public FrameSize() {
    super("FrameSize");
    setSize(200, 150);
    addWindowListener(new CloseAndExit());
  }

  public void paint(Graphics g) {
    Dimension d = getSize(); // obtêm tamanho da janela
    Insets i = getInsets();
    int larguraJanela = d.width - i.left - i.right;
    int alturaJanela = d.height - i.top - i.bottom;
    g.translate(i.left, i.top);
    g.setColor(Color.red);
    g.drawLine(larguraJanela/2, 0, larguraJanela/2, alturaJanela);
    g.drawString("Altura "+alturaJanela,
                 10+larguraJanela/2, alturaJanela/4);
    g.setColor(Color.blue);
    g.drawLine(0, alturaJanela/2, larguraJanela, alturaJanela/2);
    g.drawString("Largura "+larguraJanela,
                 10, 20+alturaJanela/2);
  }

  public static final void main(String args[]) {
    (new FrameSize()).show();
  }
}