quarta-feira, 15 de fevereiro de 2012

Layout Manager #3 - Usando BoxLayout

Este tipo de gerenciador de layout controla a colocação de componentes em arranjos verticais ou horizontais. Os componentes são colocados em uma determinada formação que podem ser:

  • X_AXIS
  • Y_AXIS
  • LINE_AXIS
  • PAGE_AXIS
Os componentes são mudam de posição de acordo com o redimensionamento da tela. Vamos ver um exemplo para entendermos melhor. Vemos abaixo uma sequencia de três tamanhos para a mesma tela. Notem que os componentes não mudam de posição:

A tela acima foi criado com BoxLayout.Y_AXIS. Se alterarmos somente BoxLayout.X_AXIS para , teremos a seguinte saída:

Bacana!!!

segunda-feira, 6 de fevereiro de 2012

Layout Manager #2 - BorderLayout

Como utilizar BorderLayout

O layout manager padrão para os containers é BorderLayout. Para demonstrar o funcionamento deste layout vamos rodar o exemplo abaixo:

Com se pode ver nas chamadas acima nem todos os gerenciadores estão disponíveis em todos os ambientes. A linha acima foi rodada no Linux e o layout Windows não pode ser aberto.

Exemplo com METAL

Exemplo com MOTIF

Exemplo com SYSTEM

Note que este último é exatamente o formato adotado no ambiente linux (compare com a tela do terminal no início deste post).

Como é o código fonte que gera estas telas?


/*
 * ExemploBorderLayout.java
 *
 * baseado em http://docs.oracle.com/javase/tutorial/uiswing/examples/layout/BorderLayoutDemoProject/src/layout/BorderLayoutDemo.java
 * Mostra como utilizar o gerenciador de layout BorderLayout
 */
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;

public class ExemploBorderLayout {
    public static boolean RIGHT_TO_LEFT = false;
     
    public static void addComponentsToPane(Container painel) {
        
// verifica se o gerenciador de layout está correto
// obviamente está funcionando porque é o default
        if (!(painel.getLayout() instanceof BorderLayout)) {
            painel.add(new JLabel("Container nao utiliza BorderLayout!"));
            return;
        }
         
        if (RIGHT_TO_LEFT) {
            painel.setComponentOrientation(
                    java.awt.ComponentOrientation.RIGHT_TO_LEFT);
        }
         
        JButton botao = new JButton("Botao 1 (PAGE_START)");
        painel.add(botao, BorderLayout.PAGE_START);
         
        botao = new JButton("Botao 2 (CENTER)");
        botao.setPreferredSize(new Dimension(200, 100));
        painel.add(botao, BorderLayout.CENTER);
         
        botao = new JButton("Botao 3 (LINE_START)");
        painel.add(botao, BorderLayout.LINE_START);
         
        botao = new JButton("Botao 4 (PAGE_END)");
        painel.add(botao, BorderLayout.PAGE_END);
         
        botao = new JButton("Botao 5 (LINE_END)");
        painel.add(botao, BorderLayout.LINE_END);
    }
     
    private static void createAndShowGUI() {
         
        //cria a JFrame
        JFrame janela = new 
          JFrame("Exemplo utilizando BorderLayout - (Constantes de posicionamento)");
// define a saída do programa ao fechar
        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        //cria um content pane para colocarmos os botões que serão arranjados
        addComponentsToPane(janela.getContentPane());
        
// o formato default do gerenciador de layouts é BorderLayout,
// por isto não é necessária linha abaixo:
        //setLayout(new BorderLayout());
        
// mostra o frame
        janela.pack();
        janela.setVisible(true); // mostra
    }    


    public static int achaIndex(String[] tipo, String s) {
      for(int i = 0; i < tipo.length; i++) 
        if (tipo[i].equalsIgnoreCase(s)) {
          return i;
        }
      return -1; // não achou --> seleciona system
    }


    public static void main(String[] args) {
        String[] tipoLF = {"system", "Windows", "Motif", "GTK", "Metal"};


        // sugiro testar os diversos tipos para você ver como ficam
        try {
            int indice;
   if (args.length < 1) {
     indice = -1;
   } else {
     indice = achaIndex(tipoLF, args[0]);
            }
            switch ( indice ) {
case 1:
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
 break;
case 2:
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
 break;
case 3:
 UIManager.setLookAndFeel("com.sun.java.swing.plaf.gtk.GTKLookAndFeel");
 break;
case 4:
 UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
 break;
default:
          // utiliza uma chamada a UIManager.getSystemLookAndFeelClassName
          // para obter o layout manager do sistema
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
   }
            // pega as exceções
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        // desliga o uso das fontes BOLD para L&F metal
// com usamos botões para demarcar as áreas, desligamos BOLD para as
// letras nos botoes aparecerem normais nos textos
        UIManager.put("swing.boldMetal", Boolean.FALSE);
         
        // esta é a forma geral de abrir uma thread para rodar
        // cria o JFrame e abre a tela
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}

Vamos retirar o botão 2 e trocar por:

  JPanel painelInterno = new JPanel(new BorderLayout());
  painelInterno.setPreferredSize(new Dimension(200, 100));
painelInterno.add(new JButton("PAGE_START"), BorderLayout.PAGE_START);
painelInterno.add(new JButton("LINE_START"), BorderLayout.LINE_START);
painelInterno.add(new JButton("PAGE_END"), BorderLayout.PAGE_END);
painelInterno.add(new JButton("LINE_END"), BorderLayout.LINE_END);
painelInterno.add(new JButton("CENTER"), BorderLayout.CENTER);


  // adiciona no painel externo
  painel.add(painelInterno, BorderLayout.CENTER);

E temos uma janela com outro conjunto de botões no meio da tela:



quarta-feira, 1 de fevereiro de 2012

Layout Managers #1 - Swing Layouts

Normalmente quando somos apresentados ao Swing ou outro gerenciador de janelas, normalmente vemos  diversos componentes gráficos. O Java possui diversos gerenciadores de layout. Estas são classes associadas aos containers JFrame e JPanel para organizar automaticamente os componentes dentro destes containers. Alguns dos principais gerenciadores são:
Caso você não queira utilizar estes gerenciadores automáticos, é possível de utilizar GroupLayout ou GridBagLayout e uma ferramenta visual para colocação dos componentes em tela, como por exemplo utilizar o NetBeans.

Eu recomendo aprender a utilizá-los. Eles são extremamente úteis para criação de janelas que redimensionam sozinhas e que funcionam perfeitamente seja no Windows ou no Linux. Você verá que o posicionamento fixo não fica bom quando mudamos de sistema operacionais.