Acho que é culpa do TableModel

2 respostas
guisantogui

Boa noite pessoal, ta começando aqui mais um "corujão da programação" e pior que a coruja já começou com a asa quebrada, chega de trova e let's code. ;)

No meu sistema pego todos dados de um DB mysql, tranquilo, mas sempre que inicializo a minha janela com a visualização de todos os registros do DB, todas a linhas da tabela na coluna de Date ficam com a mesma data do último registro, verifiquei o DB e lá as datas estão corretas, o meu método de pegar os dados também, aparentemente tá OK, então acho que a bomba pode ser com o tableModel. Vem o código relevante abaixo:

Metodo que puxa os dados do DB:
public List<Cliente> getClientes(){
        Connection connection = new ConnectionFactory().getConnection();
        try {
            Calendar cal = Calendar.getInstance();
            List<Cliente> clientes = new ArrayList<Cliente>();
            PreparedStatement prepStm = connection.prepareStatement(SELECTALL);
            ResultSet rs = prepStm.executeQuery(SELECTALL);
            rs.first();
            
            do{
                cal.setTimeInMillis(rs.getDate("data_nasc").getTime());
                clientes.add(new Cliente(rs.getString("nome"), rs.getString("endereco"), rs.getString("telefone"), cal));
                clientes.get(clientes.size()-1).setId(rs.getInt("idCliente"));
            }while(rs.next());
            
            return clientes;
        }
        catch (SQLException ex) {
            ex.printStackTrace();
            return null;
        }
        finally{
            try {
                connection.close();
            }
            catch (SQLException ex) {
                throw new RuntimeException("Quebra na conexão com o database");
            }
        }

O TableModel aqui em baixo:

public class ClienteTableModel extends AbstractTableModel{

    private ClienteDAO cdao = new ClienteDAO();
    public static final String[] COLUNAS = {"Nome","Endereco","Telefone","Data de nascimento"};
    private List<Cliente> dados;

    public ClienteTableModel(){
        dados = cdao.getClientes();
    }

    public ClienteTableModel(List<Cliente> clientes){
        dados = clientes;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Cliente cliente = dados.get(rowIndex);
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        switch(columnIndex){
            case 0: return cliente.getNome();
            case 1: return cliente.getEndereco();
            case 2: return cliente.getTelefone();
            case 3: return sdf.format(new Date (cliente.getData().getTimeInMillis()));
            case 4: return cliente.getId();
            default: throw new IndexOutOfBoundsException("Opção não encontrada");
        }
    }

    public Cliente getPessoa(int row){
        if(row < dados.size()){
            return dados.get(row);
        }
        else{
            throw new IndexOutOfBoundsException("Numero maior que o tamanho da lista");
        }
    }
}

Acho que isso é o mais importante, desculpa voltar com mais um abacaxi para vcs. :D

2 Respostas

Eric_Yuzo

O problema é que a mesma instância do Calendar que guarda a data está sendo atribuída para todos os clientes adicionados.

Calendar cal = Calendar.getInstance(); // Obtém uma instância de Calendar . . . do{ cal.setTimeInMillis(rs.getDate("data_nasc").getTime()); // A cada iteração, a data é alterada. Como todos os clientes estão recebendo a referência do mesmo objeto que foi instanciado acima, a última data setada é compartilhada por todos os clientes. . . . }while(rs.next());
O ponto chave é que um objeto Calendar não é imutável. O mais correto seria pegar uma nova instância para cada cliente:

do{ Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(rs.getDate("data_nasc").getTime()); . . . }while(rs.next());
Só uma dica. Seria melhor usar um “while” ao invés de um “do while”. Para o caso de não haver resultados no resultset.

guisantogui

vlw a dica, vou testar aqui e amanha retorno, pq a cama ta chamando!

Boa noite para quem fica! :smiley:

Criado 24 de março de 2011
Ultima resposta 25 de mar. de 2011
Respostas 2
Participantes 2