Escolar Documentos
Profissional Documentos
Cultura Documentos
21 - Trabalhando Com Layouts
21 - Trabalhando Com Layouts
1 Introduo
Em um Panel podemos inserir componentes para criarmos nossa janela. Para posicionar nossos componentes usaremos ferramenta poderosa do Java, LAYOUT. Os layouts organizam nossos componentes de maneira inteligente, poupando tempo de programao, j que o prprio layout calcula o tamanho e reorganizao dos componentes caso nossa janela aumente ou diminua de tamanho.
Todos os Content Panes so inicializados com Border Layout. Um Content Pene um Panel que faz parte de um continer de componentes. O Border Layout divide nosso Panel em 5 regies, onde a regio central a mais importante. Quando colocamos um componente na regio central, esse ocupa todo o espao vazio do nosso Panel independente do valor que atribumos ao tamanho desse componente. Quem controla isso o layout e caso nossa janela mude de tamanho, o componente que est na regio central ser redimensionado.
Esse layout organiza os componentes em uma coluna ou linha, depende de como estiver configurado.
Esse layout nos ajuda a implementar uma rea que contem diferentes componentes a cada momento. Esse layout, por exemplo, pode ser controlado por uma ComboBox, onde o estado dessa combo determina qual ser o conjunto de componentes mostrados pelo Card Layout.
Esse o layout padro do JPanel. Simplesmente ordena os componentes em uma linha e quando no h mais espao, uma nova linha criada.
Esse layout sofisticado e flexvel. Permite alinhar, distanciar, configurar mudanas de tamanho etc. um dos mais utilizados para organizao de componentes em janelas com grande quantidade e variedade de componentes.
2 Configurando um layout
Podemos modificar o layout do componente usando o mtodo setLayout().
public class FramePrincipal extends JFrame { public FramePrincipal() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); } }
public class FramePrincipal extends JFrame { public FramePrincipal() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new BorderLayout()); } }
Como mostrado na figura abaixo, podemos ver como o layout dividido em 5 regies, sendo que a regio central sempre ocupa o maior espao possvel.
Irei usar como exemplo uma janela com um JPanel e um JToolBar. O JToolBar interessante nesse caso por ter uma integrao interessante com o Border Layout. Se posicionarmos o toolbar em uma das laterais, poderemos clicar e arrastar o componente para fora ou para outra posio do layout. Como j vimos, sempre que quisermos inserir um componente em um continer usamos o mtodo add(), mas dependendo do layout utilizado, podemos passar parmetros para configurar o layout para cada componente individualmente. No caso do Border Layout podemos usar as constantes da classe BorderLayout: PAGE_START, LINE_START, PAGE_END, LINE_END e CENTER. Quando inserimos um componente usando o mtodo add() passando apenas o componente, ou seja, sem passar em qual posio queremos posiciona-lo, esse componente ser colocado na regio central.
public class FramePrincipal extends JFrame { public FramePrincipal() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); Panel panelPrincipal = new Panel(); panelPrincipal.setBackground(Color.DARK_GRAY); add(panelPrincipal); JToolBar toolBar = new JToolBar(); toolBar.add(new JButton("Teste"));
add(toolBar, BorderLayout.PAGE_START); } }
Notem que o panelPrincipal inserido sem passar a posio, mas seria o mesmo do que chamar o mtodo add() passando BorderLayout.CENTER como segundo parmetro. No segundo caso, passamos PAGE_START como segundo parmetro, ou seja, posicionando o toolbar na parte superior da tela. Tente arrastar o toolbar para outra posio do layout ou para fora.
Muito bom, agora que temos nosso layout configurado vamos fazer algumas experincias. Vamos primeiro adicionar alguns componentes para possibilitar o cadastro de clientes com nome, telefone e CPF.
public class FramePrincipal extends JFrame { private JTextField _fieldNome = null; private JTextField _fieldTelefone = null; private JTextField _fieldCPF = null; public FramePrincipal() { ... Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); panelPrincipal.add(new JLabel("Nome:")); _fieldNome = new JTextField(15); panelPrincipal.add(_fieldNome); panelPrincipal.add(new JLabel("Telefone:")); _fieldTelefone = new JTextField(15); panelPrincipal.add(_fieldTelefone); panelPrincipal.add(new JLabel("CPF:")); _fieldCPF = new JTextField(15); panelPrincipal.add(_fieldCPF); add(panelPrincipal); } }
Hum... no ficou muito bom. Isso acontece porque quando inserimos componentes em um GridBagLayout sem configurar o layout para ele, os componentes so organizados em uma linha apenas e como no possvel desenhar todos os componentes em uma linha por falta de espao,
automaticamente os JTextFields so configurados para seu tamanho mnimo. Caso precisarmos modificar o tamanho mnimo para o componente iremos usar o mtodo setMinimumSize(). Se voc expandir a tela, os componentes sero desenhados em seu tamanho normal.
Seguindo esse diagrama poderemos posicionar nossos componentes da seguinte forma: lable Nome na posio 0 , 0; field Nome na posio 1 , 0; label Telefone na posio 0 , 1 e assim por diante.
public class FramePrincipal extends JFrame { public FramePrincipal() { ... Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; panelPrincipal.add(new JLabel("Nome:"), gbc); _fieldNome = new JTextField(15); gbc.gridx = 1; gbc.gridy = 0; panelPrincipal.add(_fieldNome, gbc); gbc.gridx = 0; gbc.gridy = 1; panelPrincipal.add(new JLabel("Telefone:"), gbc); _fieldTelefone = new JTextField(15); gbc.gridx = 1; gbc.gridy = 1; panelPrincipal.add(_fieldTelefone, gbc); gbc.gridx = 0;
Eixo Y de 0
gbc.gridy = 2; panelPrincipal.add(new JLabel("CPF:"), gbc); _fieldCPF = new JTextField(15); gbc.gridx = 1; gbc.gridy = 2; panelPrincipal.add(_fieldCPF, gbc); add(panelPrincipal); } }
Como estamos utilizando o mesmo objeto GridBagConstraints para todos os posicionamentos, as configuraes que fizemos para os componentes anteriores continuam para o componente atual. Temos que prestar ateno, pois caso configuremos uma propriedade do layout no componente anterior e no queremos que essa seja usada no componente atual, teremos que reconfigur-la.
public class FramePrincipal extends JFrame { public FramePrincipal() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); JToolBar toolBar = new JToolBar(); toolBar.add(new JButton("Teste")); add(toolBar, BorderLayout.PAGE_START); Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 10); panelPrincipal.add(new JLabel("Nome:"), gbc); _fieldNome = new JTextField(15); gbc.gridx = 1; gbc.gridy = 0; gbc.insets = new Insets(10, 0, 10, 10); panelPrincipal.add(_fieldNome, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets(0, 10, 10, 10); panelPrincipal.add(new JLabel("Telefone:"), gbc); _fieldTelefone = new JTextField(15); gbc.gridx = 1; gbc.gridy = 1; gbc.insets = new Insets(0, 0, 10, 10); panelPrincipal.add(_fieldTelefone, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets(0, 10, 10, 10); panelPrincipal.add(new JLabel("CPF:"), gbc); _fieldCPF = new JTextField(15); gbc.gridx = 1; gbc.gridy = 2; gbc.insets = new Insets(0, 0, 10, 10); panelPrincipal.add(_fieldCPF, gbc); add(panelPrincipal); } }
Irei posicionar os labels no final da linha usando a constante LINE_END. Observe o cdigo.
public class FramePrincipal extends JFrame { public FramePrincipal() { ... Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("Nome:"), gbc); _fieldNome = new JTextField(15); gbc.gridx = 1;
gbc.gridy = 0; gbc.insets = new Insets(10, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldNome, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets(0, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("Telefone:"), gbc); _fieldTelefone = new JTextField(15); gbc.gridx = 1; gbc.gridy = 1; gbc.insets = new Insets(0, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldTelefone, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets(0, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("CPF:"), gbc); _fieldCPF = new JTextField(15); gbc.gridx = 1; gbc.gridy = 2; gbc.insets = new Insets(0, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldCPF, gbc); add(panelPrincipal); } }
centralizados em relao a tela, iremos usar para isso um panel auxiliar configurado como Flow Layout que o padro. Iremos inicialmente posicionar nosso panel logo abaixo no label CPF, ou seja, na posio 0, 3. Usaremos ainda, dois outras propriedades: fill e gridwidth. Nesse novo panel, poderemos inserir os botes sem se preocupar com como iremos centraliz-los, j que o Flow Layout tem como caracterstica principal posicionar os componentes sempre no centro horizontal. Alm disso, para melhorar a visualizao da ocupao do panel, iremos modificar para cinza escuro o fundo do panel onde colocaremos os botes.
Agora precisamos configurar para que o panel ocupe duas colunas e inserir os botes.
add(panelPrincipal); } }
public class FramePrincipal extends JFrame { private JTextField _fieldNome = null; private JTextField _fieldTelefone = null; private JTextField _fieldCPF = null; public FramePrincipal() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(400, 300); setLocationRelativeTo(null); JToolBar toolBar = new JToolBar(); toolBar.add(new JButton("Teste")); add(toolBar, BorderLayout.PAGE_START); Panel panelPrincipal = new Panel(); panelPrincipal.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.insets = new Insets(10, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("Nome:"), gbc); _fieldNome = new JTextField(15); gbc.gridx = 1; gbc.gridy = 0; gbc.insets = new Insets(10, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldNome, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.insets = new Insets(0, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("Telefone:"), gbc); _fieldTelefone = new JTextField(15);
gbc.gridx = 1; gbc.gridy = 1; gbc.insets = new Insets(0, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldTelefone, gbc); gbc.gridx = 0; gbc.gridy = 2; gbc.insets = new Insets(0, 10, 10, 10); gbc.anchor = GridBagConstraints.LINE_END; panelPrincipal.add(new JLabel("CPF:"), gbc); _fieldCPF = new JTextField(15); gbc.gridx = 1; gbc.gridy = 2; gbc.insets = new Insets(0, 0, 10, 10); gbc.anchor = GridBagConstraints.CENTER; panelPrincipal.add(_fieldCPF, gbc); JPanel panelBotes = new JPanel(); panelBotes.add(new JButton("Processar")); panelBotes.add(new JButton("Limpar")); gbc.gridx = 0; gbc.gridy = 3; gbc.insets = new Insets(0, 10, 10, 10); gbc.anchor = GridBagConstraints.CENTER; gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridwidth = 2; panelPrincipal.add(panelBotes, gbc); add(panelPrincipal); } }