Jtable repetindo o mesmo valor várias vezes

Pode me ajudar com a solução do mesmo problema?

Esse é o método para capturar os valores do banco na classe “UserDao”

private void readTable() {
        try {
            UserDAO objUserDAO = new UserDAO();

            DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
            model.setNumRows(0);

            ArrayList<User> list = objUserDAO.read();

            for (User user : list) {
                model.addRow(new Object[]{
                    user.getId(),
                    user.getName(),
                    user.getPass(),
                    user.getEmail(),
                    user.getCpf()
                });
            }

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "List VIEW" + e);
        }
    }

Esse é o método para preencher a Jtable:

public ArrayList<User> read() {
        String query = "SELECT * FROM users";

        try {
            stmt = connection.prepareStatement(query);
            result = stmt.executeQuery();

            while (result.next()) {
                User objUser = new User();
                objUser.setId(result.getInt("id"));
                objUser.setName(result.getString("name"));
                objUser.setPass(result.getString("pass"));
                objUser.setEmail(result.getString("email"));
                objUser.setCpf(result.getString("cpf"));


                list.add(objUser);

            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, "UserDAO " + e);
        }
        return list;

    }

Assim que está sendo exibido

O problema é que seu objeto “list” esta declarado na classe e não no método, assim, sempre que seu método “read()” é invocado, vc adiciona novos objetos “objUser” ao ArrayList “list” já instanciado na classe.

Para resolver, vc pode limpar sua lista antes de invocar o método “read()”,

list.clear();
ArrayList list = objUserDAO.read();

ou instanciar um nova lista sempre que for fazer a leitura.

List list = new UserDAO().read();

1 curtida

Não consegui resolver, pode me explicar melhor?

Como o colega @pocae1don disse, sua variável list é uma variável de instância, ela deveria ser uma variável local do método read().

Outra coisa:
Modifique o retorno do método para List<User>.

E na sua tela, troque o DefaultTableModel por uma implementação sua que estenda AbstractTableModel pois do jeito que está você está criando loops desnecessários: Você já tem um loop que lê os registros do banco, depois tem outro loop para preencher a JTable? Tá errado.