Clique aqui para ler esse artigo em PDF.![]()
A Vida, o Universo e Tudo Mais
Formulários no Desktop
Criação de layouts simples e poderosos
Você precisa fazer uma interface para uma aplicação desktop em Java, coloca um botão e ele fica grande demais; posiciona alguns campos de texto e se tornam muito pequenos; tenta alinhá-los e parece que eles nunca terminam onde você quer. Você pode não saber, mas está tendo problemas com os Layout Managers. Muitos desenvolvedores Java passaram (ou ainda passam) por isso: os Layout Managers já causaram confusão na cabeça de muita gente. Acostumados a posicionar suas interfaces de forma fixa, muitos desenvolvedores não entendem porque ao criar uma aplicação em Java precisam usar essas classes, que insistem em posicionar os componentes com tamanhos e lugares aparentemente arbitrários...
Layout Managers: existe uma razão
Desenvolvedores de linguagens como VB e Delphi estão acostumados a posicionar seus componentes com tamanhos e extensões definidos. À primeira vista, essa parece ser a forma mais fácil de posicionar componentes. O que nem sempre é óbvio para o desenvolvedor é que os tamanhos dos botões, campos de texto, e mesmo das fontes na tela são diferentes de uma plataforma para outra. Ao posicionar componentes visuais de forma fixa, variações de alguns pixels no contorno dos componentes, por exemplo, pode tornar sua interface inutilizável em outra plataforma. E sabemos que um dos objetivos de Java é permitir o desenvolvimento de aplicações que rodem em muitas plataformas.
Essa é a principal razão de ser dos Layout Managers. Os "gerenciadores de layout" são responsáveis por posicionar e dimensionar componentes, garantir que se adaptem aos tamanhos da tela e de fonte e se ajustem às diferenças em decorações dos componentes (molduras, efeitos 3D etc.) entre plataformas. Ao utilizar Layout Managers, o desenvolvedor especifica como os componentes se relacionam, mas não define o local fixo de cada um, deixando os detalhes específicos de posicionamento e de tamanhos a cargo dos diversos gerenciadores de layout.
Essa separação entre a criação dos componentes e o seu posicionamento ajuda a tornar as interfaces mais flexíveis. Isso é fundamental para que a aplicação se adapte a outras plataformas, mas também é importante em outras situações. Por exemplo, na criação de aplicações multilingüe, onde tamanhos de textos – mesmo a ordem de componentes – varia dependendo do idioma. Essa adaptabilidade e maior capacidade de internacionalização é especialmente importante hoje, dado o enfoque cada vez maior na exportação de software no Brasil.
Aplicando Layout Managers
Os Layout Managers são uma propriedade dos Containers: (J)Panels, (J)Frames, (J)Windows, e seus similares. Cada container possui o seu gerenciador, e é trabalho do container posicionar e gerenciar os componentes contidos nele. De longe o container mais utilizado é o "painel" (JPanel no Swing, Panel no AWT). Como pode ser colocado dentro de outros painéis (ou de qualquer outro container), o painel é muito utilizado para compor layouts, como podemos ver na Figura 1.
Usando layouts dentro de layouts, e contando com a variedade de Layout Managers existentes, é possível criar telas bastante sofisticadas. Você pode também criar seus próprios Layout Managers, para posicionar componentes da forma que achar melhor. Na prática, uma composição dos gerenciadores genéricos, em especial os mais sofisticados e poderosos como o GridBagLayout, permite criar a maioria das interfaces.
O dia-a-dia dos layouts
Tratar com gerenciadores de layout, entretanto, nem sempre é fácil. A flexibilidade dessa estrutura de layouts pode ser benéfica para aplicações sofisticadas, mas acaba trazendo complicações desnecessárias para aplicações mais imediatas. Por conta disso, mostro aqui uma dica para ajudar a montar as telas mais comuns em praticamente qualquer aplicação: os formulários.
Sabemos das necessidades de um formulário. Precisamos alinhar labels, campos de texto e botões, os grupos de componentes precisam começar e terminar nos mesmos lugares, e devemos manter uma separação padrão. Precisamos também de consistência entre uma tela e outra. Qual Layout Manager padrão traz esse tipo de layout? Muitos sugeririam o GridLayout (que alinha componentes em uma grade rígida com células iguais), ou o ...