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.

 

lfpuglfig01.JPG
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.

O valor 0 (zero) indica que o objeto não vai ser expandido automaticamente

weighty

Especifica como distribuir o espaço vertical  extra quando o contêiner foir redimensionado.

O valor 0 (zero) indica que o objeto não vai ser expandido automaticamente

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