Java - Gerenciamento de layout, chckbox, radiobutton, combobox, listas

De Aulas

Afluentes: Programação em Java

Gerenciamento de Layout

A independência de plataforma gera alguns problemas:

  • Alguns controles ocupam áreas de tela diferentes em plataformas distintas;
  • Exemplo: uma linha de edição de texto ocupa uma área de tela menor no Windows que no X-Windows;
  • Problema: como posicionar os controles na janela levando em conta o tamanho diferente em cada plataforma?
Swing layout problema.png

Solução: controladores de posicionamento:

  • Cada container indica seu controlador posicionamento;
  • Os controles são inseridos no container sem posição;
  • O controlador de posicionamento ajusta a posição e tamanho dos controles, de acordo com as características da plataforma.

O controle de posicionamento determina o tamanho e a posição dos componentes de um painel:

  • Todos os containers possuem um layout manager;
  • O layout manager é um objeto responsável por posicionar e determinar o tamanho dos componentes do container;
  • Os componentes podem indicar seus tamanhos e posições desejadas, mas o layout manager decide sobre suas dimensões finais em cada container.

Sempre que o desenvolvedor utilizar o método add() de um container, o layout manager deve ser considerado;

  • Alguns layout managers exigem a especificação de um segundo parâmetro no método add();
  • O segundo parâmetro traz informações sobre a posição do componente inserido;
  • Por exemplo, o layout manager BorderLayout exige que o desenvolvedor especifique a posição relativa de seus componentes.
Indicando o layout manager de um painel
  • O método setLayout() de um painel permite alterar seu layout manager, que é passado como parâmetro.
JPanel painel = new JPanel();
painel.setLayout(new BorderLayout());
Um componente pode indicar suas dimensões para seus layout managers
  • O método setMinimumSize() indica o tamanho mínimo do componente;
  • O método setMaximumSize() indica o tamanho máximo do componente;
  • O método setPreferredSize() indica o tamanho desejado pelo componente;
  • O desenvolvedor pode chamar estes métodos após criar seus componente.

FlowLayout

Os componentes são organizados em linhas:

  • Cada componente ocupa o seu tamanho desejado;
  • Se o espaço horizontal não for suficiente para todos os componentes, o layout manager utiliza diversas linhas;
  • Dentro de uma linha, o desenvolvedor pode especificar o alinhamento dos componentes.
Swing flowlayout.png
Exemplo
Container painel = frame.getContentPane();
painel.setLayout(new FlowLayout());
painel.add(new JButton("Button 1"));
painel.add(new JButton("Button 2"));
painel.add(new JButton("Button 3"));

BorderLayout

Componentes são organizados nas bordas do container:

  • Quando um componente é inserido, o método add() deve receber sua posição relaNva no container.
Swing borderlayout.png
Exemplo
Container painel = frame.getContentPane();
painel.setLayout (new BorderLayout ());
painel.add (new JButton ("Button 1"), BorderLayout.NORTH);
painel.add (new JButton ("Button 2"), BorderLayout.CENTER);
painel.add (new JButton ("Button 3"), BorderLayout.WEST);
painel.add (new JButton ("Button 4"), BorderLayout.SOUTH);
painel.add (new JButton ("Button 5"), BorderLayout.EAST);

GridLayout

Componentes são organizados em uma grade:

  • Cada componente ocupa uma célula da grade;
  • Todas as células possuem o mesmo tamanho;
  • O tamanho das células é determinado pelo espaço ocupado pelo container.
Swinig gridlayout.png
Exemplo
Container painel = frame.getContentPane();
painel.setLayout(new GridLayout(0,2));    // duas colunas e quantas linhas forem necessárias
painel.add(new JButton("Button 1"));
painel.add(new JButton(Button 2"));
painel.add(new JButton("Button 3"));

Posicionamento

Como o posicionamento é realizado?

  • Depois de inserir os componentes de uma janela, o desenvolvedor deve chamar o método pack();
  • O layout manager calcula o tamanho desejado da janela, somando o tamanho de suas bordas ao tamanho preferido dos componentes inseridos diretamente na janela.

Bordas

Swing bordas01.png
  • O método setBorder() indica a borda do componente;
  • O swing define uma fábrica que deve ser uNlizada para criar as bordas dos componentes.
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createLineBorder(Color.black));
Swing bordas02.png

Bordas Simples

  • Representam os tipos mais simples de bordas.
Swing bordas03.png
Exemplo de criação das bordas a partir de Factory
comp1.setBorder (BorderFactory.createLineBorder(Color.black);
comp2.setBorder (BorderFactory.createRaisedBevelBorder());
comp3.setBorder (BorderFactory.createEtchedBorder());
comp4.setBorder (BorderFactory.createLoweredBevelBorder());
comp5.setBorder (BorderFactory.createEmptyBorder());

Bordas com Títulos

  • Bordas com título são bordas simples que apresentam títulos;
  • Se nenhuma borda for especificada junto ao título, o look & feel utiliza uma borda default.
Swing bordas04.png
Exemplo
comp9.setBorder (BorderFactory.createTitledBorder(teste"));
//...
Border linha = BorderFactory.createLineBorder (Color.black);
TitledBorder titulo = BorderFactory.createTitledBorder(linha, ”teste");
titulo.setTitleJustification(TitledBorder.CENTER);
titulo.setTitlePosition(TitledBorder.BOTTOM);
comp10.setBorder(titulo);

Atividade 1

Usando o exercício feito na Atividade 3, da última aula, modifique-o utilizando diferentes layouts, paineis com bordas e títulos, cores diferentes, posições. Experimente diferentes ideias da tela.

Checkbox

Possuem as caracterísNcas de um botão genérico

  • O método getSelected() determina se o check box foi selecionado pelo usuário;
  • O método setSelected() seleciona ou deseleciona o check box, de acordo com seu parâmetro booleano.
Swing checkbox.png

radiobutton

Radio buttons são criados em grupos

  • Somente um botão de um grupo pode estar selecionado em um determinado instante;
  • A classe ButtonGroup permite a criação de grupos de botões.
Swing radiobutton.png
Exemplo
JRadioButton birdButton = new JRadioButton(Bird);
JRadioButton catButton = new JRadioButton(Cat);
JRadioButton dogButton = new JRadioButton(Dog);

ButtonGroup group = new ButtonGroup();
group.add(birdButton);
group.add(catButton);
group.add(dogButton);

birdButton.setSelected(true);

combobox

Combo boxes permitem a seleção de um item de uma lista, ocupando um espaço delimitado da janela

  • Apenas um item está selecionado em cada instante;
  • A combo box pode ser inicializada com um array ou com um conjunto de Strings;
Swing combobox.png
Acesso aos dados
  • O método setSelectedIndex() altera o item selecionado, indicando o índice do novo item na lista de opções;
  • O método getSelectedIndex() retorna o índice do item selecionado na lista de opções.
String[] pets = { "Bird", "Cat", "Dog", "Rabbit", "Pig" };
JComboBox petList = new JComboBox (pets);
petList.setSelectedIndex(4);

Combo boxes podem ser editáveis

  • O método setEditable() altera o modo de edição de uma combo box de acordo com seu parâmetro booleano;
  • O método getSelectedItem() retorna o item selecionado na combo box ou o texto digitado pelo usuário.
Swing combobox02.png
Modelos
  • Uma combo box pode ser inicializada com um modelo;
  • O modelo permite a atualização dos itens da combo;
  • O programa pode inserir e remover itens durante a execução;
  • O método setModel() altera o modelo de uma combo box.
DefaultComboModel
  • O modelo é representado pela interface ComboModel;
  • A classe DefaultComboModel implementa a interface;
  • A classe possui métodos para inserção e remoção de itens.
Alguns métodos da DefaultComboModel
  • O método insertItemAt() insere o item recebido como parâmetro em uma determinada posição da combo;
  • O método addItem() insere um novo item ao fim da combo;
  • O método removeAllItems() remove todos os itens da combo;
  • O método removeItem() remove da combo o item recebido como parâmetro;
  • O método getItemCount() retorna o número de itens da combo.
Exemplo
DefaultComboModel modelo = new DefaultComboModel ();
modelo.addElement (Item 1");
modelo.addElement ("Item 2");
modelo.addElement ("Item 3");
modelo.addElement ("Item 4");
JComboBox combo = new JComboBox (modelo);
modelo.addElement (“Item 5”);

listas

Listas permitem diversos modos de seleção de itens

  • O método setSelecNonMode() altera o modo de seleção dos itens de uma lista:
    • SINGLE_SELECTION
    • SINGLE_INTERVAL_SELECTION
    • MULTIPLE_INTERVAL_SELECTION
Swing listas.png

Listas devem ser inseridas em painéis de rolamento

String[] pessoas = { Eu, Você, Ele, Ela};
JList lista = new JList (pessoas);
lista.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
JScrollPane scroll= new JScrollPane (lista);
painel.add(scroll);

Atividade 2

Em um jogo de RPG de mesa, precisamos da ficha dos personagens que dizem características, poderes, níveis, pontos de experiência, história do personagem, idade, etc. Crie em um formulário de cadastro de Personagem usando todos os recursos vistos até agora. Pense que um jogo deve ser atraente e divertido, então seja criativo para criar uma tela de cadastro atraente e divertida.