[Grupo de estudos – Java] Gerenciadores de Layout

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.

Anúncios

3 Respostas para “[Grupo de estudos – Java] Gerenciadores de Layout

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s