Hoje vou falar sobre o uso de diferentes gerenciadores de layouts. O layout basicamente determina a forma como os componentes são exibidos na tela. Cada gerenciador de layout serve bem a um determinado propósito, sendo assim, é possivel que um gerenciador não organize os componentes da forma esperada, mas seja útil em outra aplicação. Seja qual for o gerenciador escolhido, o intuito é agilizar a organização da GUI.
O primeiro gerenciador que vou abordar é o FlowLayout; tenho usado este gerenciador em todos os códigos postados até o momento. Este gerenciador posiciona os componentes um ao lado do outro, na ordem em que o componente é adicionado, sendo assim o mais simples dos gerenciadores. É um bom gerenciador para menus, barra de ícones, etc.
Para mostrar a diferença entre os gerenciadores vou usar o mesmo programa com 3 deles.
/**
*
* @author Luciano Santos
*/
//importando todas as classes dos pacotes AWT, Swing e Event
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class FlowLay extends JFrame {
// declarando os componentes
JLabel lblTitulo, lblPlus, lblEqual, lblTotal;
JButton btnSomar;
JTextField txtN1, txtN2;
FlowLay() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //definindo a acao de saida
setTitle("FlowLayout");//definindo titulo da janela
setSize(450, 60);//definindo tamanho da janela
setLayout(new FlowLayout());//definindo o layout
//configurando e adicionando componentes
lblTitulo = new JLabel("Digite dois valores");
add(lblTitulo);
txtN1 = new JTextField(5);
add(txtN1);
lblPlus = new JLabel("+");
add(lblPlus);
txtN2 = new JTextField(5);
add(txtN2);
btnSomar = new JButton("Somar");
add(btnSomar);
lblTotal = new JLabel("");
add(lblTotal);
btnSomar.addActionListener(new somar());//pondo o botao somar em espera
}
public class somar implements ActionListener {
public void actionPerformed(ActionEvent clic) {
//determinando a acao do botao
int n1 = Integer.parseInt(txtN1.getText());
int n2 = Integer.parseInt(txtN2.getText());
int soma = n1 + n2;
lblTotal.setText(Integer.toString(soma));
}
}
public static void main(String[] args) {
FlowLay lay1 = new FlowLay(); //instanciado o construtor
lay1.setVisible(true); //deixando a janela visivel
}
}
Resultado:

O próximo Gerenciador de Layout que mostrarei será o GridLayout. Este gerenciador serve como uma grade para os componentes. A grade é determinada no momentoem que se passa o parâmetro na definição de layout, no nosso código isso ocorre na linha 22, onde uma grade de 6 linhas e 1 coluna foi especificada. No próximo post sobre este assunto vou mostrar mais um caso de utilização deste gerenciador.
/**
*
* @author Luciano Santos
*/
//importando todas as classes dos pacotes AWT, Swing e Event
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridLay extends JFrame {
// declarando os componentes
JLabel lblTitulo, lblPlus, lblEqual, lblTotal;
JButton btnSomar;
JTextField txtN1, txtN2;
GridLay() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //definindo a acao de saida
setTitle("GridLayout");//definindo titulo da janela
setSize(190, 180);//definindo tamanho da janela
setLayout(new GridLayout(6,1));//definindo o layout
//configurando e adicionando componentes
lblTitulo = new JLabel("Digite dois valores");
add(lblTitulo);
txtN1 = new JTextField(5);
add(txtN1);
lblPlus = new JLabel("+");
add(lblPlus);
txtN2 = new JTextField(5);
add(txtN2);
btnSomar = new JButton("Somar");
add(btnSomar);
lblTotal = new JLabel("");
add(lblTotal);
btnSomar.addActionListener(new somar());//pondo o botao somar em espera
}
public class somar implements ActionListener {
public void actionPerformed(ActionEvent clic) {
//determinando a acao do botao
int n1 = Integer.parseInt(txtN1.getText());
int n2 = Integer.parseInt(txtN2.getText());
int soma = n1 + n2;
lblTotal.setText(Integer.toString(soma));
}
}
public static void main(String[] args) {
GridLay lay2 = new GridLay(); //instanciado o construtor
lay2.setVisible(true); //deixando a janela visivel
}
}
Resultado:

E finalmente o último Gerenciador de Layout que irei abordar hoje é o Border Layout. Este gerenciador é utilizado para organizar diversos contêiners numa interface. Os códigos que tenho postado, inclusive os de hoje, tem usado somente o contêiner padrão de interface, este gerenciador organiza componentes em cinco regiões, norte, sul, leste, oeste e centro. Somente cinco componentes podem ser inclusos desta forma, mas esses componentes podem ser menus, contêiners, etc. O uso de painéis será abordado mais tarde, em outros posts. Tendo a limitação de cinco componentes, eu tive que remover um dos componentes do código, mostrando a posição de cada componente adicionado.
/**
*
* @author Luciano Santos
*/
//importando todas as classes dos pacotes AWT, Swing e Event
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class BorderLay extends JFrame {
// declarando os componentes
JLabel lblTitulo, lblPlus, lblEqual, lblTotal;
JButton btnSomar;
JTextField txtN1, txtN2;
BorderLay() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //definindo a acao de saida
setTitle("BorderLayout - Digite dois valores");//definindo titulo da janela
setSize(350, 90);//definindo tamanho da janela
setLayout(new BorderLayout());//definindo o layout
//configurando e adicionando componentes
txtN1 = new JTextField(5);
add(txtN1, BorderLayout.WEST);
lblPlus = new JLabel("+");
add(lblPlus, BorderLayout.CENTER);
txtN2 = new JTextField(5);
add(txtN2, BorderLayout.EAST);
btnSomar = new JButton("Somar");
add(btnSomar, BorderLayout.SOUTH);
lblTotal = new JLabel(" ");
add(lblTotal, BorderLayout.NORTH);
btnSomar.addActionListener(new somar());//pondo o botao somar em espera
}
public class somar implements ActionListener {
public void actionPerformed(ActionEvent clic) {
//determinando a acao do botao
int n1 = Integer.parseInt(txtN1.getText());
int n2 = Integer.parseInt(txtN2.getText());
int soma = n1 + n2;
lblTotal.setText(Integer.toString(soma));
}
}
public static void main(String[] args) {
BorderLay lay3 = new BorderLay(); //instanciado o construtor
lay3.setVisible(true); //deixando a janela visivel
}
}
Resultado:

Mas espere, você deve estar se perguntando se não há uma alternativa mais flexivel, que permita a organização dos componentes através de coordenadas, onde você possa determinar o tamanho de cada componente. Adivinhe, esta opção existe!
Emborar trabalhar sem nenhum gerenciador de layout será mais trabalhoso, essa opção permite uma customização maior das interfaces. Definindo o layout como Null você ganha liberdade para posicionar cada componente onde desejar, além de definir o tamanho do mesmo. Ao optar por este layout o programador adiciona um quarto passo ao esquema de adição de componentes, que seria fixar o componente. Para fixar o componente você passa a distância em pixels do canto superior esquerdo do contêiner, além das medidas de altura e largura do mesmo. Perceba que o setBounds é aplicado a cada componente adicionado, esse procedimento exige paciência, é claro que visualisar o conteiner como um plano cartesiano ajuda, para dominar as distâncias e tamanhos dos componentes basta criar uam interface e alterar os valores do setBounds para ver as diferenças.
/**
*
* @author Luciano Santos
*/
//importando todas as classes dos pacotes AWT, Swing e Event
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class NullLay extends JFrame {
// declarando os componentes
JLabel lblTitulo, lblPlus, lblEqual, lblTotal;
JButton btnSomar;
JTextField txtN1, txtN2;
NullLay() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //definindo a acao de saida
setTitle("Null");//definindo titulo da janela
setSize(400, 170);//definindo tamanho da janela
setLayout(null);//definindo o layout
//configurando e adicionando componentes
lblTitulo = new JLabel("Digite dois valores");
lblTitulo.setBounds(130,10,200,20);
add(lblTitulo);
txtN1 = new JTextField(5);
txtN1.setBounds(140,50,50,20);
add(txtN1);
lblPlus = new JLabel("+");
lblPlus.setBounds(190,50,10,20);
add(lblPlus);
txtN2 = new JTextField(5);
txtN2.setBounds(200,50,50,20);
add(txtN2);
btnSomar = new JButton("Somar");
btnSomar.setBounds(140,90,120,20);
add(btnSomar);
lblTotal = new JLabel(" ");
lblTotal.setBounds(170,120,200,20);
add(lblTotal);
btnSomar.addActionListener(new somar());//pondo o botao somar em espera
}
public class somar implements ActionListener {
public void actionPerformed(ActionEvent clic) {
//determinando a acao do botao
int n1 = Integer.parseInt(txtN1.getText());
int n2 = Integer.parseInt(txtN2.getText());
int soma = n1 + n2;
lblTotal.setText(Integer.toString(soma));
}
}
public static void main(String[] args) {
NullLay lay4 = new NullLay(); //instanciado o construtor
lay4.setVisible(true); //deixando a janela visivel
}
}
Resultado:

Espero que eu tenha conseguido fazer uma boa apresentação sobre o assunto, existem outros gerenciadores de layout que veremos em outros posts, mas deixo a visualização das quatro interfaces para que comparem, e sugiro que vocês criem novas interfaces para sentir a usabilidade de cada um desses gerenciadores de layout.
![]() |
![]() |
![]() |
|
![]() |
|

04/10/2011 às 12:03
Muito Bom, excelente explicação
09/12/2011 às 10:34
Belo post , gostei !!!
Nos meus projetos estou usando o MigLayout muito bom , é como se eu tivesse todos os gerenciadores de layouts em um.
Segue links para quem estiver interessado em conhecer:
http://www.miglayout.com/
http://www.miglayout.com/QuickStart.pdf
01/01/2012 às 13:20
Legal Luciano, isso ajuda muito quem ta começando…