TableModel ta legal?[RESOLVIDO]

9 respostas
guisantogui

Aí gente fiz um TableModel, mas queria dar uma conferida se ta tudo ok, e não está faltando nada para continuar programando, vlw a força e segue o código

public class PessoasTableModel extends AbstractTableModel {

    public static final String[] COLUNAS = {"Nome","Endereço","CPF/CNPJ","Data","E-mail","Telefones"};
    private List<Pessoa> pessoas;

    public PessoasTableModel(List<Pessoa> pessoas) {
        this.pessoas = pessoas;
    }

    public void addRow(Pessoa p){
        pessoas.add(p);
        fireTableRowsInserted(pessoas.size()-1, pessoas.size()-1);
    }

    public void removeRow(Pessoa p){
        fireTableRowsDeleted(pessoas.indexOf(p), pessoas.indexOf(p));
        pessoas.remove(p);
    }

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

    public int getColumnCount() {
        return COLUNAS.length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Pessoa p = pessoas.get(rowIndex);
        switch(columnIndex){
            case 1: return p.getNome();
            case 2: return p.getEndereco();
            case 3: return p.getDocumento();
            case 4: return p.getData();
            case 5: return p.getEmail();
            case 6: return p.getTelefones();
            default: return "ERRO OPÇÃO NÃO ENCONTRADA";
        }
    }

    @Override
    public Class<?> getColumnClass(int columnIndex){
        return String.class;
    } 

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        return false;
    }

    @Override
    public String getColumnName(int column){
        return COLUNAS[column];
    }
}

9 Respostas

Marky.Vasconcelos

Quase, só valtou um método get(int row) que retorna a Pessoa que representa a linha.

guisantogui

Isso, certo?

public Pessoa getPessoa(int row){
        return pessoas.get(row);
    }

vlw a força marky

ViniGodoy

Isso mesmo. Com isso você pode deixar o getValueAt e o setValueAt para o próprio JTable.
Na sua tela, use esse get aí, que já retorna a classe certa, sem necessidade de cast, conversão nem outras coisas feias desse tipo.

guisantogui

Então eu não preciso desse trecho de código?

public Object getValueAt(int rowIndex, int columnIndex) { Pessoa p = pessoas.get(rowIndex); switch(columnIndex){ case 1: return p.getNome(); case 2: return p.getEndereco(); case 3: return p.getDocumento(); case 4: return p.getData(); case 5: return p.getEmail(); case 6: return p.getTelefones(); default: return "ERRO OPÇÃO NÃO ENCONTRADA"; } }

Marky.Vasconcelos

Precisa, o JTable que vai chamar estes para renderizar a tabela.

Mas na suas classes que precisam dos dados da tabela, use apenas o get e voce já tem o objeto inteiro da linha.

Invés de:

TableModel model = jTable.getModel();
Pessoa p = new Pessoa();
p.setNome((String)model.getValueAt(row,1));
p.setIdade(model.getValueAt(row,2));
//E etc..

Voce faz somente o seguinte.

PessoasTableModel model = (PessoasTableModel) jTable.getModel();
Pessoa p = model.getPessoa(row);

E p já tem todos atributos que voce precisa de pessoa.

Mais simples não?

guisantogui

Acho que eu entendi eu deixo o getValueAt para o JTable se achar, mas quando eu for manipular os dados eu uso o outro get, certo?

ViniGodoy

Precisa sim. O que estou falando é que quem vai usar esse método é o JTable, não você.

Ou seja, quando vc tiver implementando, por exemplo, um botão de editar, o código vai ficar assim:

public void btnSalvar_actionPerformed(ActionEvent evt) {
   int selected = seuTable.getSelectedRow();
   if (selected == -1) return;
   Pessoa p = seuTableModel.get(selected);
   EditarPessoaDialog dlg = new EditarPessoaDialog(this, p);
   dlg.setVisible(true);
}

Veja, não há chamada ao setValueAt nesse código. Não houve a necessidade de recarregar a pessoa do banco. Não teve casts. Não teve a necessidade de ter a coluna do ID sendo exibida na tabela.

Quem usa o default faz assim.

public void btnSalvar_actionPerformed(ActionEvent evt) {
   int selected = seuTable.getSelectedRow();
   if (selected == -1) return;
   //Cast, e a coluna id teve que estar visível
   //O código da interface também precisa conhecer qual é o número da coluna id, que no caso está na constante COLUNA_ID
   //Se a coluna mudar, a constante deverá ser alterada também.

   int idPessoa = (Integer) seuTableModel.getValueAt(COLUNA_ID, selected); 
   Pessoa p = PessoaDao.carregar(idPessoa); //Obrigado a recarregar a pessoa do banco

   EditarPessoaDialog dlg = new EditarPessoaDialog(this, p);
   dlg.setVisible(true);
}
ViniGodoy

Isso.

guisantogui

Pode crê, vlw pela força gurizada =D

Criado 3 de janeiro de 2011
Ultima resposta 3 de jan. de 2011
Respostas 9
Participantes 3