Erro ArrayList e Preenchimento jTable

2 respostas
rolipam

Possuo o Código abaixo para preencher uma jTable

private void preecheTabelaMedico() {
        tbMedicos.getColumnModel().getColumn(0).setPreferredWidth(150); //Médico (Nome)
        tbMedicos.getColumnModel().getColumn(1).setPreferredWidth(50); // CRM
        tbMedicos.getColumnModel().getColumn(2).setPreferredWidth(50); // UF  

        String sql = "select medicos.nome as nome, mestre.crm as crm, mestre.uf as uf from mestre, medicos "
                + "where mestre.codmedico = medicos.codigo "
                + "and mestre.codcliente=" + tfCodPaciente.getText().trim() + " "
                + "order by mestre.id";

        try {

            con_mestre.conecta();
            con_mestre.executeSQL(sql);
            pacientes = new ArrayList();
            PacienteBean pb;
            while (con_mestre.rs.next()) {
                pb = new PacienteBean();
                pb.setNomemedico(con_mestre.rs.getString("nome"));
                pb.setCrm(con_mestre.rs.getString("crm"));
                pb.setUf(con_mestre.rs.getString("uf"));
                pacientes.add(pb);
                for(int i=0; i<pacientes.size(); i++)
                    System.out.println(pacientes.size());
                    tmMedicos.addRow(new String[]{con_mestre.rs.getString("nome"),
                            con_mestre.rs.getString("crm"),
                            con_mestre.rs.getString("uf")});
            }
            con_mestre.desonecta();
        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "Nenhum Médico Cadastrado.");
        }
    }

Quando faço uma busca pelos registros do banco de dados o meu retorno (System.out.println(pacientes.size())) no console do Netbeans e o seguinte

run:
1
2
2
3
3
3

Achei estranho o fato do índice 2 se repetir 2x e o índice 3 se repetir 3x.

Porém, quando tento atualizar os registros na table e consequentemente no banco de dados através dos códigos abaixo

private void btAlterarMedicoActionPerformed(java.awt.event.ActionEvent evt) {                                                
        if (tbMedicos.getSelectedRow() != -1) {
            alteraMedico();
            while (tmMedicos.getRowCount() > 0) {
                tmMedicos.removeRow(0);
            }
            preecheTabelaMedico();
            tfCodMedico.setText("");
            tfCodMedico.requestFocus();
            tfNomeMedico.setText("");
            tfEspecialidade.setText("");
            tfCRM.setText("");
            tfUF.setText("");
            tfIdMedico.setText("");
        } else {
            JOptionPane.showMessageDialog(this, "Selecione um Registro da Tabela!");
        }

    private void alteraMedico() {
        PacienteControl pc = new PacienteControl();
        PacienteBean pb = new PacienteBean();
        pb.setId_mestre(Integer.parseInt(tfIdMedico.getText()));
        pb.setCodcliente(Integer.parseInt(tfCodPaciente.getText()));
        pb.setCodmedico(Integer.parseInt(tfCodMedico.getText()));
        pb.setCrm(tfCRM.getText());
        pb.setUf(tfUF.getText());
        pc.alterarMestre(pb);

    }

    String alteraMestre = "update mestre set codmedico=?, crm=?, uf=? where "
            + "codcliente=? and id=?";

    public void alterarMestre(PacienteBean pas) {
        ConexaoBD con = new ConexaoBD();
        try {
            pstm = con.conecta().prepareStatement(alteraMestre);
            pstm.setInt(1, pas.getCodmedico());
            pstm.setString(2, pas.getCrm());
            pstm.setString(3, pas.getUf());
            pstm.setInt(4, pas.getCodcliente());
            pstm.setInt(5, pas.getId_mestre());
            pstm.executeUpdate();
            JOptionPane.showMessageDialog(null, "Registro Alterado com Sucesso!");
            con.desonecta();
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Não Foi Possível Alterar o Registro!");
            e.printStackTrace();
        }
    }

O meu retorno (System.out.println(pacientes.size())) no console do NetBeans é apenas o índice 1 do arrayList, tanto que a atualização de minha tabela somente mostra o primeiro registro do banco de dados e não, todos os registros do banco de dados como deveria ser. Onde é que eu estou errando?

2 Respostas

gaulix
private void preecheTabelaMedico() {  
        tbMedicos.getColumnModel().getColumn(0).setPreferredWidth(150); //Médico (Nome)  
        tbMedicos.getColumnModel().getColumn(1).setPreferredWidth(50); // CRM  
        tbMedicos.getColumnModel().getColumn(2).setPreferredWidth(50); // UF    
      
        String sql = "select medicos.nome as nome, mestre.crm as crm, mestre.uf as uf from mestre, medicos "  
                + "where mestre.codmedico = medicos.codigo "  
                + "and mestre.codcliente=" + tfCodPaciente.getText().trim() + " "  
                + "order by mestre.id";  
      
        try {  
      
            con_mestre.conecta();  
            con_mestre.executeSQL(sql);  
            pacientes = new ArrayList();  
            PacienteBean pb;  
            while (con_mestre.rs.next()) {  
                pb = new PacienteBean();  
                pb.setNomemedico(con_mestre.rs.getString("nome"));  
                pb.setCrm(con_mestre.rs.getString("crm"));  
                pb.setUf(con_mestre.rs.getString("uf"));  
                pacientes.add(pb);  
                for(int i=0; i<pacientes.size(); i++)  // LEIA ABAIXO SOBRE ESSA LINHA
                    System.out.println(pacientes.size());  
                    tmMedicos.addRow(new String[]{con_mestre.rs.getString("nome"),  
                            con_mestre.rs.getString("crm"),  
                            con_mestre.rs.getString("uf")});  
            }  
            con_mestre.desonecta();  
        } catch (Exception e) {  
            e.printStackTrace();  
            JOptionPane.showMessageDialog(null, "Nenhum Médico Cadastrado.");  
        }  
    }

Opa cara, ali na linha que eu marquei, você faz um loop com for pra pegar todos os valores e colocar na tabela, ok, mas você ta fazendo isso dentro do laço do while, faça fora, assim você pega todos os valores do banco, adiciona no arraylist, e depois é que faz um for pra passar do arraylist pra tabela. Não sei se é isso que ta gerando o outro erro, não entendi direito o que você quer no outro erro...

rolipam

O outro erro tem a ver com o fato de após uma atualização ou alteração de algum dado na jTable e no banco de dados, a jTable mostra apenas o primeiro registro do banco de dados em vez de mostrar todos os registros. Acho que não deve ser pela questão do laço for, já que o código abaixo somente foi inserido para verificar o tamanho do arrayList …

pacientes = new ArrayList();  
            PacienteBean pb;  
            while (con_mestre.rs.next()) {  
                pb = new PacienteBean();  
                pb.setNomemedico(con_mestre.rs.getString("nome"));  
                pb.setCrm(con_mestre.rs.getString("crm"));  
                pb.setUf(con_mestre.rs.getString("uf"));  
                pacientes.add(pb);  
                for(int i=0; i<pacientes.size(); i++)
                    System.out.println(pacientes.size());

… pois como vc pode perceber, o preenchimento da minha jTable ocorre a partir de uma consulta ao banco de dados …

tmMedicos.addRow(new String[]{con_mestre.rs.getString("nome"),  
                            con_mestre.rs.getString("crm"),  
                            con_mestre.rs.getString("uf")});

… e não a partir do arrayList. Vale ressaltar ainda que o preenchimento inicial da jTable quando realizo uma consulta ao banco de dados ou quando incluo um novo registro na jTable ocorre normalmente, sem problemas, onde utilizo o trecho de código abaixo para limpar a tabela e depois atualizá-la após os métodos buscaMedico() ; incluiMedico() ; alteraMedico() ; excluiMedico().

...
            while (tmMedicos.getRowCount() > 0) {
                tmMedicos.removeRow(0);
            }
            preecheTabelaMedico();
            ...

Utilizo a mesma implementação em outras duas telas do meu sistema e não ocorre esse erro, ou seja, quando seleciono uma linha na jTable onde desejo fazer alguma alteração (possuo um método que preenche os campos com os dados da table) e quando clico no botão alterar, o registro alterado é atualizado e todos os outros registros da jTable também são mostrados. Estou sem idéias para resolver esse impasse em que me encontro

Criado 25 de setembro de 2012
Ultima resposta 25 de set. de 2012
Respostas 2
Participantes 2