GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

TableModel ou DefaultTableModel

Pessoal;

A maioria das pessoas indicam não usar DefaultTableModel, porém, no meu caso eu quero criar uma tabela vazia onde o usuário irá preencher as linhas de cada coluna existente na minha JTable.

Com o DefaultTableModel eu consigo tratar esses dados e inserir no Banco de Dados com sucesso, já no TableModel eu não consigo criar nem a tabela vazia, somente consegui cria - lá adicionando dados a partir de um ArrayList.

Neste caso(tabela vazia para o usuário digitar os dados), qual das opções eu deveria utilizar ? se caso for o TableModel, teria um exemplo ?

Eu sempre recomendo nunca, absolutamente nunca, usar o DefaultTableModel.

Sua tabela vazia que representa o que? Algum tipo de dado? Se representa um tipo de dado, então sua classe de negócios deveria ser usada para preencher a tabela, e seu model deveria validar a entrada.

E nada impede vc de inicializar seu próprio TableModel com um ArrayList vazio.

Então, o que eu quero é iniciar meu table vazio em uma tela Swing, onde o usuário iria digitar os dados(em cada linhs) nas suas respectivas colunas.

O que você recomendaria, iniciar meu table com array vazio, deixar as células editáveis para preenchimento e após este, pegar os dados e inserir no banco por exemplo e claro, usando o TableModel ?

Salve…

Na assinatura do Vini Godoy tem uns links que apontam para mais de uma alternativa para resolver isso. Eu particularmente usei isso recentemente e deu muito certo pro que eu precisava: http://www.guj.com.br/java/149034-duvidas-ao-fazer-uma-consulta#808003

Em algum post o Vini citou como motivos para não usar DefaultTableModel os seguintes:

  1. É mais difícil que escrever seu próprio TableModel;
  2. É mais lento (usa classes sincronizadas);
  3. Ocupa mais espaço em memória (duplica seus dados);
  4. Deixa o código mais confuso e difícil de manter;
  5. Usa casts inseguros;
  6. Força que você tenha que exibir informações desnecessárias (como o ID) na tabela, ou controlar o ID numa lista separada;
  7. Faz a sua mulher te deixar, o leite da sua geladeira azedar, e pessoas apontarem o dedo para você na rua.

Eu acrescentaria esse:

  1. Faz os teus filhos negarem que te conhecem na frente dos outros
2 Curtidas

rapaz a coisa é seria mesmo heim, serasrserahahrhahhehahehahea, muito boas as citações…

Boa tarde a todos.

Particularmente eu prefiro criar uma classe que herda (extende) a classe AbstractTableModel, onde a mesma permite que eu defina o meu próprio model, definindo quais os campos que serão os títulos das colunas e quais e valores serão populados dentro do model.

Eu prefiro implementar… Segue um exemplo:

package nome_do_pacote;

import br.com.agenda.model.*;
import java.util.*;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class ContatoTableModel extends AbstractTableModel{

    public static final int COL_CODIGO = 0;
    public static final int COL_NOME = 1;
    public static final int COL_EMAIL = 2;
    public static final int COL_FIXO = 3;
    public static final int COL_CELULAR = 4;
    private List<Contato> listarContatos;


public ContatoTableModel(List<Contato> l){
    this.listarContatos = new ArrayList<Contato>(l);
}

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

public int getColumnCount(){
    return 5;
}

public Object getValueAt(int linhas, int colunas){
    Contato cont  = this.listarContatos.get(linhas);
    if(colunas == COL_CODIGO) return cont.getCodigo();
    if(colunas == COL_NOME) return cont.getNome();
    if(colunas == COL_EMAIL) return cont.getEmail();
    if(colunas == COL_FIXO) return cont.getFixo();
    if(colunas == COL_CELULAR) return cont.getCelular();
    return "";
}

public String getColumnName(int colunas){
    if(colunas == COL_CODIGO) return "Código";
    if(colunas == COL_NOME) return "Nome";
    if(colunas == COL_EMAIL) return "E-mail";
    if(colunas == COL_FIXO) return "Telefone";
    if(colunas == COL_CELULAR) return "Celular";
    return "";
}

public Contato get(int linhas){
    return listarContatos.get(linhas);
}

}

Obrigado pelo o Exemplo! Ajudou muito!

//