Utilização de Gerenciadores de Layout
O primeiro gerenciador que iremos executar é o FlowLayout, que é mais simples e sua característica principal é o alinhamento dos componentes no centro e na parte superior da janela.
Outra característica desse gerenciador é que os componentes mantêm suas dimensões originais quando a janela é redimensionada e mesmo que a janela não possui largura suficiente para que todos os componentes caibam, eles são deslocados em várias linhas.
Abaixo um exemplo de FlowLayout prático:
import java.awt.*;
import javax.swing.*;
public class ExemploFlowLayout {
public static void main(String[] args){
//Declaramos o visual do nosso frame
JFrame.setDefaultLookAndFeelDecorated(true);
//Criamos nosso Frame
JFrame minhaJanela = new JFrame("Exemplo de Flow Layout");
//Criaremos alguns botões
JButton bt1 = new JButton("Menu 1");
JButton bt2 = new JButton("Menu 2");
JButton bt3 = new JButton("Menu 3");
JButton bt4 = new JButton("Menu 4");
JButton bt5 = new JButton("Menu 5");
JButton bt6 = new JButton("Menu 6");
//Configuramos nosso JFrame
minhaJanela.setSize(600,400);
minhaJanela.setLocation(200,200);
//Declaramos será utilizado o gerenciador FlowLayout
minhaJanela.getContentPane().setLayout(new FlowLayout());
//Adicionamos os componentes em nossa janela
minhaJanela.getContentPane().add(bt1);
minhaJanela.getContentPane().add(bt2);
minhaJanela.getContentPane().add(bt3);
minhaJanela.getContentPane().add(bt4);
minhaJanela.getContentPane().add(bt5);
minhaJanela.getContentPane().add(bt6);
minhaJanela.setVisible(true);
}
}
Listagem 01. ExemploFlowLayout.java
A utilização ao pacote da biblioteca AWT é necessário em virtude dos gerenciadores de layout serem definidos nessa biblioteca.
A classe JFrame possui o método getContentPane() que permite a execução de diversas ações, como configuração do tipo de layout a ser utilizado ou adição de componentes à interface.
Para especificar o layout utilizado na aplicação foi através de setLayout() que passamos como parâmetro a expressão new FlowLayout(), indicando que será utilizado o gerenciados FlowLayout.
Tente diminuir ou aumentar o tamanho da janela, assim você pode constar que os botões permanecem com a mesma dimensão.
Nosso próximo gerenciador é o GridLayout, onde sua principal característica é a possibilidade de dividir a área do container como se fosse uma grande formada por linhas e colunas, cujo cruzamento constituiu uma célula onde algum componente poderá ser adicionado.
O tamanho original dos componentes será ajustado automaticamente à medida que a janela é redimensionada.
Vejamos um exemplo simples:
import java.awt.*;
import javax.swing.*;
public class ExemploGridLayout {
public static void main(String[] args){
//Criaremos alguns botões
JButton bt1 = new JButton("Botão 1");
JButton bt2 = new JButton("Botão 2");
JButton bt3 = new JButton("Botão 3");
JButton bt4 = new JButton("Botão 4");
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame minhaJanela = new JFrame("Exemplo de GridLayout");
minhaJanela.setSize(400,400);
minhaJanela.setLocation(100,100);
minhaJanela.getContentPane().setLayout(new GridLayout(2,2));
minhaJanela.getContentPane().add(bt1);
minhaJanela.getContentPane().add(bt2);
minhaJanela.getContentPane().add(bt3);
minhaJanela.getContentPane().add(bt4);
minhaJanela.setVisible(true);
}
}
Listagem 02. ExemploGridLayout.java
Confira que no método setLayout() ao definir que iremos utilizar o gerenciador GridLayout, passamos dois parâmetros inteiros para o construtor de GridLayout (new GridLayout(2,2)), neste momento estamos informando que queremos um gerenciador de GridLayout com 2 linhas e 2 colunas.
Depois de ter gravado o código, compile e rode o exemplo. A figura 1 deve ser demonstrada de acordo com o código digitado.
Figura 1. Exemplo de GridLayout
Ajuste o tamanho da janela para ver o efeito dos botões sendo redimensionados de acordo com a dimensão da janela.
Nosso próximo gerenciador de layout BorderLayout permite que o container seja dividido em cinco seções: norte(parte superior), sul (parte inferior), leste (lado direito), oeste(lado esquerdo) e centro.
Como ocorre em GridLayout, cada seção pode ter apenas um componente. Já o tamanho original dos componentes é afetado quando há um redirecionamento da janeja.
Vejamos um exemplo:
import javax.swing.*;
import java.awt.*;
public class ExemploBorderLayout {
public static void main(String[] args){
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame minhaJanela = new JFrame("Exemplo de BorderLayout");
JButton bt1 = new JButton("Botão direito");
JButton bt2 = new JButton("Botão esquerdo");
JButton bt3 = new JButton("Botão área superior");
JButton bt4 = new JButton("Botão área inferior");
JButton bt5 = new JButton("Botão área central");
minhaJanela.setSize(500,500);
minhaJanela.setLocation(150,150);
minhaJanela.getContentPane().setLayout(new BorderLayout());
minhaJanela.getContentPane().add(bt1, BorderLayout.EAST);
minhaJanela.getContentPane().add(bt2, BorderLayout.WEST);
minhaJanela.getContentPane().add(bt3, BorderLayout.NORTH);
minhaJanela.getContentPane().add(bt4, BorderLayout.SOUTH);
minhaJanela.getContentPane().add(bt5, BorderLayout.CENTER);
minhaJanela.setVisible(true);
}
}
Listagem 03. ExemploBorderLayout.java
Observe que os componentes são inseridos de acordo com as seções configuradas no código.
Se você ajustar o tamanho da janela, verá que os componentes (botões) também são ajustados.
Nosso último gerenciador de layout a ser apresentado é o GridBagLayout, o mais flexível de todos, mas também o mais complexo em termos de uso.
Para poder utilizá-lo o ideal é esboçar como será a tela com os componentes e suas posições adequadamente.
Suas características principais são:
· O container é dividido numa grande de células formadas por linhas e colunas
· O alinhamento do componente dentro da célula, pode ou não manter suas dimensões originais quando houver redimensionamento da janela.
· Cada célula pode haver apenas um componente a ser expandida de forma a ocupar uma área correspondente a uma ou mais linhas e/ou colunas.
Vejamos um exemplo:
import javax.swing.*;
import java.awt.*;
public class ExemploGridBagLayout extends JFrame {
private JButton bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8;
public ExemploGridBagLayout(){
super("Exemplo de GridBagLayout");
}
public void AdicionaItem(int Linha, int Coluna, int Largura, int Altura, int EscalaX, int EscalaY, JComponent componente){
GridBagConstraints ItemGrade = new GridBagConstraints();
ItemGrade.gridx = Coluna;
ItemGrade.gridy = Linha;
ItemGrade.gridwidth = Largura;
ItemGrade.gridheight = Altura;
ItemGrade.weightx = EscalaX;
ItemGrade.weighty = EscalaY;
ItemGrade.fill = GridBagConstraints.BOTH;
ItemGrade.anchor = GridBagConstraints.CENTER;
getContentPane().add(componente, ItemGrade);
}
public void ExecutaGrid(){
bt1 = new JButton("Botão 1");
bt2 = new JButton("Botão 2");
bt3 = new JButton("Botão 3");
bt4 = new JButton("Botão 4");
bt5 = new JButton("Botão 5");
bt6 = new JButton("Botão 6");
bt7 = new JButton("Botão 7");
bt8 = new JButton("Botão 8");
setSize(500,300);
setLocation(200,200);
setLayout(new GridBagLayout());
AdicionaItem(0,0,4,1,0,0,bt1);
AdicionaItem(1,0,1,1,0,0,bt2);
AdicionaItem(1,1,1,1,0,0,bt3);
AdicionaItem(1,2,1,1,0,0,bt4);
AdicionaItem(1,3,1,1,0,0,bt5);
AdicionaItem(2,0,1,1,0,1,bt6);
AdicionaItem(3,0,1,1,0,1,bt7);
AdicionaItem(2,1,3,4,1,1,bt8);
setVisible(true);
}
public static void main(String[] args){
JFrame.setDefaultLookAndFeelDecorated(true);
new ExemploGridBagLayout().ExecutaGrid();
}
}
Listagem 04. ExemploGridBagLayout.java
Um código bem mais complexo que os anteriores. Vamos analisar alguns pontos importantes deste exemplo.
Um ponto interessante neste exemplo é o fato de haver uma função responsável pela adição dos componentes às suas áreas no container.
O método responsável pela adição dos componentes AdicionaItem() recebe seis parâmetros, onde configuramos a posição inicial (linha e coluna), o tamanho (largura e altura) e a escala referentes ao componente que está sendo adicionado (EscalaX e EscalaY). O último parâmetro se refere ao componente que será adicionado à célula da grade.
Essa célula é criada através da instrução GridBagConstrains ItemGrade = new GridBagConstrains().
Abaixo a Tabela 1 descreve os atributos utilizados no método AdicionaItem()
Atributo |
Descrição |
gridx |
Indica a coluna onde o objeto será posicionado |
gridY |
Indica a linha onde o objeto será posicionado |
gridwidth |
Indica o número de colunas a serem ocupadas pelo objeto |
gridheight |
Indica o número de linhas a serem ocupadas pelo objeto |
weightx |
Especifica como distribuir o espaço horizontal extra quando o contêiner foir redimensionado. |
weighty |
Especifica como distribuir o espaço vertical extra quando o contêiner foir redimensionado. |
fill |
Utilizamos esse atributo quando a área referente ao componente é menor do que o necessário para que ele caiba dentro dela |
anchor |
Utilizamos esse atributo quando o tamanho do componente é menor que a área em que ele foi inserido. |
Tabela 1 Descrição dos métodos