19/09/07
Gerenciadores de Layout
Mrio Antonio Meireles Teixeira DEINF UFMA
Baseado em material original de Joo Carlos Pinheiro CEFET/MA
Objetivos
Apresentar os gerenciadores de layout:
FlowLayout BorderLayout GridLayout BoxLayout GridBagLayout
19/09/07
Gerenciadores de Layouts
So fornecidos para organizar componentes GUI em um container para propsitos de apresentao
processam a maioria dos detalhes, fornecendo uma maneira automtica de posicionar os componentes grficos nos containers
Todos os gerenciadores de Layout implementam a interface LayoutManager ou a subinterface LayoutManager2 Cada container como um Painel ou Frame (molduras) possui um gerenciador de layout padro associado
3
Gerenciadores de Layouts
possvel desativar o Gerenciador de Layout caso o programador queira definir o tamanho ou posio dos componentes Para desligar layouts:
recipiente.setLayout(null);
Porm torna-se necessrio definir posio e tamanho de cada componente:
componente.setBounds(x, y, larg, alt);
4
19/09/07
Exemplo
1. public class NullLayout extends JFrame { 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. } } private JButton b1, b2, b3; NullLayout(String nome) { super(nome); Container ct = this.getContentPane(); ct.setLayout(null); b1 = new JButton("Maa"); b2 = new JButton("Pera"); b3 = new JButton("Uva"); // parametros: x, y, largura e altura b1.setBounds(10,10,150,40); b2.setBounds(10,60,150,40); b3.setBounds(10,110,150,40); ct.add(b1); ct.add(b2); ct.add(b3); this.setSize(180, 200); this.setVisible(true); Desativa o gerenciador de Layout
Tamanho e Posio dos Componentes
Um container mantm uma referncia a uma instncia particular do Gerenciador de Layout Sempre quando for necessrio posicionar o componente
ser invocado o Gerenciador de Layout Ou seja, se o usurio tentar definir o tamanho ou posio dos componentes (setSize() ou setLocation()) o Gerenciador de Layout ir anular a deciso
19/09/07
Tamanho e Posio dos Componentes
public class TamanhoComp extends JFrame { public static void main(String[] args) { JFrame frame = new JFrame(); JPanel panel = new JPanel(); for (int i=0; i<2; i++) { JButton btn = new JButton("No adianta chamar setSize"); btn.setSize(300, 300); Esta linha, no tem panel.add(btn); efeito, pois o boto } adicionado ao painel, frame.getContentPane().add(panel); que chama o seu frame.setSize(450, 70); gerenciador de layout frame.setVisible(true); para decidir a sua } posio e quo grande o } componente deve ficar 7
Poltica de Layout
Cada componente Java tem um tamanho preferencial: Normalmente o menor tamanho necessrio para apresentar o componente de maneira visualmente significativa
Exemplo de um boto o tamanho de sua etiqueta de texto
O Gerenciador de Layout equilibra duas consideraes: a poltica de layout e o tamanho preferencial de cada componente. A prioridade para a poltica de layout
8
19/09/07
Etapas para se construir uma interface
Cada Painel montado em quatro etapas:
1. 2. Construir (instanciar) o painel Dar ao painel o gerenciador de layout
Quando um container instanciado (etapa 1) ele recebe um gerenciador de layout padro. Esta etapa pode ser pulada se o gerenciador a ser utilizado for o padro
3. 4.
Preencher o painel
Envolve montar componentes e acrescent-los ao painel
Acrescentar o painel ao seu prprio container
OBS: Se algum dos componentes for ele prprio um painel, as etapas 1 4 precisam ser executadas sucessivamente 9
Gerenciadores de Layouts
Existem vrios gerenciadores de layouts disponvel com a linguagem Java FlowLayout, BorderLayout, GridLayout BoxLayout, GridBagLayout Principais mtodos da classe java.awt.Container setLayout(LayoutManager m) void add(Component c) adiciona um componente ao container sob o controle do gerenciador de layout utilizado
10
19/09/07
FlowLayout
o gerenciador de layout mais simples Dispe os objetos seqencialmente da esquerda para a direita na ordem em que foram adicionados
container.setLayout(new FlowLayout());
Permite aos componentes serem alinhados esquerda, centralizados (padro) ou direita
objetoLayout.setAlignment(FlowLayout.RIGHT);
11
FlowLayout
Todos os componentes possuem um mtodo chamado getPreferredSize(), usado pelos gerenciadores de layout para perguntar o tamanho de cada componente o padro para
java.awt.Applet, java.awt.Panel e javax.swing.JPanel
12
19/09/07
FlowLayout - Principais construtores
FlowLayout()
Centraliza os componentes deixando uma distncia entre eles (gap) de 5 pixels.
FlowLayout(int align)
Constri um layout com alinhamento estabelecido (FlowLayout.CENTER, FlowLayout.LEFT, FlowLayout. RIGHT)
FlowLayout(int align, int hgap, int vgap)
Define o alinhamento e a distncia horizontal e vertical, respectivamente
Confira: FlowLayoutDemo.java 13
BorderLayout
o gerenciador padro para JFrames, JApplets e Caixas de Dilogo A classe BorderLayout herda diretamente da classe Object e implementa a interface LayoutManager2 (uma subinterface de LayoutManager) Organiza os componentes em cinco reas
Norte, Sul, Leste, Oeste e Centro
14
19/09/07
BorderLayout
Os componentes devem ser adicionadas a regies nomeadas no gerenciador de layout, caso contrrio no ficaro visveis:
NORTH, SOUTH, EAST, WEST, CENTER
Norte e Sul tm prioridade sobre Leste e Oeste, que tm prioridade sobre Centro Se for adicionado um componente ao Centro, este se expande at ocupar todo o espao restante na janela O componente colocado em uma regio pode ser um container ao qual sero anexados outros componentes (p.ex., JPanel) Confira: BorderLayoutDemo.java 15
GridLayout
Fornece flexibilidade para colocao de componentes Divide o container em uma grade de modo que os componentes podem ser colocados em linhas e colunas A classe GridLayout herda diretamente da classe Object e implementa a interface LayoutManager
16
19/09/07
GridLayout
Com o gerenciador GridLayout, a posio relativa dos componentes no alterada quando a rea redimensionada Os componentes so adicionados iniciando na clula na parte superior esquerda da grade e prosseguindo da esquerda para a direita at a linha estar cheia. Ento, o processo continua na prxima linha
Confira: GridLayoutDemo.java
17
Gerenciando layouts complexos com Painis
Interfaces complexas exigem que cada componente seja colocado numa localizao exata Para tanto, geralmente usam-se mltiplos painis, cada um com seu layout especfico Container -> JComponent -> JPanel
Confira: PanelDemo.java 18
19/09/07
Classe container Box
Permite colocar uma nica linha ou coluna de componentes com mais flexibilidade do que o GridLayout Existe um Container - a classe Box cujo gerenciador de layout padro BoxLayout: Fornece mtodos estticos para criar um BoxLayout horizontal ou vertical: Box b = Box.createHorizontalBox( ) So organizados da esquerda para direita Box b = Box.createVerticalBox( ) So organizados de cima para baixo
19
Gerenciador BoxLayout e a classe container Box
Depois, adicionam-se os componentes da maneira usual:
b.add(btnOk); b.add(btnSair);
Confira: TextAreaDemo.java 20
10
19/09/07
Referncias
Deitel & Deitel. Java como Programar, 6 ed. Caps. 11 e 22; Materiais do site da SUN (http://java.sun.com)
21
11