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:



Nenhum comentário:

Postar um comentário