Java - Tabelas

De Aulas

Afluentes: Programação em Java

Modelos de Dados

  • Para trabalhar com Tabelas, precisamos trabalhar com Modelos de Dados (TableModel);
  • A maioria dos componentes do Swing permite que seus dados venham de classes separadas, conhecidas como Modelos;
  • A seguir é mostrado um exemplo de uma tabela para apresentar uma lista de pessoas.

Classe Pessoa

A classe Pessoa é usada para representar as informações que são usados pelo TableModel.

public class Pessoa {
    private String nome;
    private int idade;
    private boolean brasileiro;

    public Pessoa(String nome, int idade, boolean brasileiro) {
        setNome(nome);
        setIdade(idade);
        setBrasileiro(brasileiro);
    }

    // Getters e Setters

    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public int getIdade() {
        return this.idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    public boolean isBrasileiro() {
        return this.brasileiro;
    }

    public void setBrasileiro(boolean brasileiro) {
        this.brasileiro = brasileiro;
    }
}

Classe PessoaTableModel

A TableModel é o objeto que gerencia e organiza os dados na tabela. Faz a interface entre os dado e a tabela (apresentação visual).

Swing tablemodel00.png
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class PessoaTableModel extends AbstractTableModel {
    private static final long serialVersionUID = 1L;
    private List<Pessoa> pessoas = new ArrayList<Pessoa>();

    public void setPessoas(List<Pessoa> pessoas) {
        this.pessoas.clear();
        this.pessoas.addAll(pessoas);

        // fireTableDataChanged abaixo é um metodo herdado
        // do AbstractTableModel que avisa a tabela que os
        // dados foram alterados.

        fireTableDataChanged();
    }

    public int getRowCount() {
        return pessoas.size();
    }

    public int getColumnCount() {
        return 3;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Pessoa p = pessoas.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return p.getNome();
            case 1:
                return p.getIdade();
            case 2:
                return p.isBrasileiro();
            default:
                return null;
        }
    }

    public String getColumnName(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return "Nome";
            case 1:
                return "Idade";
            case 2:
                return "Brasileiro";
            default:
                return null;
        }
    }

    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return Integer.class;
            case 2:
                return Boolean.class;
            default:
                return null;
        }
    }
}

Criando a Tabela

Swing tablemodel01.png
 1import java.util.ArrayList;
 2import java.util.List;
 3import java.awt.*;
 4import javax.swing.JFrame;
 5import javax.swing.JScrollPane;
 6import javax.swing.JTable;
 7
 8public class Tabela extends JFrame {
 9    private static final long serialVersionUID = 1L;
10
11    public Tabela() {
12        super("Gerenciando Tabelas no Java");
13        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14        setLayout(new BorderLayout());
15        
16        List<Pessoa> pessoas = new ArrayList<Pessoa>();
17        pessoas.add(new Pessoa("Carlos", 25, true));
18        pessoas.add(new Pessoa("Juliana", 18, true));
19        pessoas.add(new Pessoa("John", 40, false));
20        
21        // Modelo lógico
22        PessoaTableModel ptm = new PessoaTableModel();
23        ptm.setPessoas(pessoas);
24
25        // Componente Gráfico
26        JTable tabela = new JTable();
27        tabela.setModel(ptm);
28
29        // Coloca a tabela em uma caixa com barra de rolagem
30        add(new JScrollPane(tabela), BorderLayout.CENTER);
31        pack();
32        setVisible(true);
33    }
34
35    public static void main(String[] args) {
36        new Tabela();
37    }
38}

Atividade

Faça um programa em Java usando Swing e AWT para criar uma interface de entrada de dados para uma tabela. O programa deve ter uma interface parecida com a apresentada abaixo:

Swing TableModel atividade01.png


Tplnote Bulbgraph.png

Certamente você consegue fazer uma iterface melhor que a minha.

Resolução

Classe Contato

 1public class Contato {
 2    private String nome;
 3    private int idade;
 4    private String telefone;
 5    private String email;
 6
 7    public Contato(String nome, int idade, String telefone, String email) {
 8        setNome(nome);
 9        setIdade(idade);
10        setTelefone(telefone);
11        setEmail(email);
12    }
13
14    public String getNome() {
15        return this.nome;
16    }
17
18    public void setNome(String nome) {
19        this.nome = nome;
20    }
21
22    public int getIdade() {
23        return this.idade;
24    }
25
26    public void setIdade(int idade) {
27        this.idade = idade;
28    }
29
30    public String getTelefone() {
31        return this.telefone;
32    }
33
34    public void setTelefone(String telefone) {
35        this.telefone = telefone;
36    }
37
38    public String getEmail() {
39        return this.email;
40    }
41
42    public void setEmail(String email) {
43        this.email = email;
44    }
45}

Classe ContatoTableModel

 1import java.util.ArrayList;
 2import java.util.List;
 3import javax.swing.table.AbstractTableModel;
 4
 5public class ContatoTableModel extends AbstractTableModel {
 6    private static final long serialVersionUID = 1L;
 7    private List<Contato> contatos = new ArrayList<Contato>();
 8    
 9    public void setContatos(List<Contato> contatos) {
10        this.contatos.clear();
11        this.contatos.addAll(contatos);
12        fireTableDataChanged();
13    }
14
15    public int getRowCount() {
16        return contatos.size();
17    }
18
19    public int getColumnCount() {
20        return 4;
21    }
22
23    public Object getValueAt(int rowIndex, int columnIndex) {
24        Contato c = contatos.get(rowIndex);
25        switch (columnIndex) {
26            case 0:
27                return c.getNome();
28            case 1:
29                return c.getIdade();
30            case 2:
31                return c.getTelefone();
32            case 3:
33                return c.getEmail();
34            default:
35                return null;
36        }
37    }
38
39    public String getColumnName(int columnIndex) {
40        switch (columnIndex) {
41            case 0:
42                return "Nome";
43            case 1:
44                return "Idade";
45            case 2:
46                return "Telefone";
47            case 3:
48                return "E-mail";
49            default:
50                return null;
51        }
52    }
53
54    public Class<?> getColumnClass(int columnIndex) {
55        switch (columnIndex) {
56            case 0:
57                return String.class;
58            case 1:
59                return Integer.class;
60            case 2:
61                return String.class;
62            case 3:
63                return String.class;
64            default:
65                return null;
66        }
67    }
68}

Classe Agenda

 1import java.util.ArrayList;
 2import java.util.List;
 3import java.awt.*;
 4import javax.swing.*;
 5
 6public class Agenda extends JFrame {
 7    private static final long serialVersionUID = 1L;
 8
 9    public Agenda() {
10        super("Agenda Telefônica");
11        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
12        setLayout(new BorderLayout());
13
14        JPanel entradas = new JPanel();
15        entradas.setLayout(new GridLayout(0,2));
16
17        entradas.add(new JLabel("Nome:"));
18        final JTextField nome = new JTextField(20);
19        entradas.add(nome);
20
21        entradas.add(new JLabel("Idade:"));
22        final JTextField idade = new JTextField(20);
23        entradas.add(idade);
24
25        entradas.add(new JLabel("Telefone:"));
26        final JTextField telefone = new JTextField(20);
27        entradas.add(telefone);
28
29        entradas.add(new JLabel("E-mail:"));
30        final JTextField email = new JTextField(20);
31        entradas.add(email);
32
33        final JButton btGravar = new JButton("Gravar");
34        entradas.add(btGravar);
35
36        final JButton btClear = new JButton("Limpara Campos");
37        entradas.add(btClear);
38
39        add(entradas, BorderLayout.NORTH);
40
41        List<Contato> contatos = new ArrayList<Contato>();
42        contatos.add(new Contato("Carlos", 25, "1234", "carlos@gmail.com"));
43        contatos.add(new Contato("Juliana", 18, "3423423", "juliana@hotmail.com"));
44        contatos.add(new Contato("John", 40, "3423234", "john@watson.com"));
45        
46        ContatoTableModel ptm = new ContatoTableModel();
47        ptm.setContatos(contatos);        
48        JTable tabela = new JTable();
49        tabela.setModel(ptm);
50        add(new JScrollPane(tabela), BorderLayout.CENTER);
51        pack();
52        setVisible(true);
53    }
54
55    public static void main(String[] args) {
56        new Agenda();
57    }
58}