Popular Jtable com método de recuperação de dados

Olá boa tarde, meu primeiro tópico de ajuda aqui, preciso de uma grande ajuda na relação do uso do componente JTable do Swing do Java.

Eu criei um método de recuperação na minha classe DAO.
Porém eu não estou conseguindo usar ela, para popular a tabela.

public List<Produto> Recuperar(){
        String sql = "SELECT nome, preco FROM produto";
        List<Produto> produtos = new ArrayList<Produto>();
        try {
            conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                Produto produto = new Produto();
                produto.setNome(rs.getString("nome"));
                produto.setPreco(rs.getDouble("preco"));
                produtos.add(produto);
            }
            ps.close();
            
        } catch (Exception e){
                System.out.println("" + e.getMessage());
            }
            return produtos;   
    }

Logo em seguida criei a classe de modelo usando o abstractTableModel

public class produtoTableModel extends AbstractTableModel{
    produtoDAO dao = new produtoDAO();
    private ArrayList<Produto> listaDeProdutos;
    private String[] colunas = {"Nome","Preco"};
    
    public produtoTableModel(){
        this.listaDeProdutos = new ArrayList<>();
    }
    
    public void addProduto(Produto pProduto){
        
        this.listaDeProdutos.add(pProduto);
        fireTableDataChanged();
    }
    
    public void removerProduto(int rowIndex){
        this.listaDeProdutos.remove(rowIndex);
        fireTableDataChanged();
    }
    public Produto getProduto(int rowIndex){
        return this.listaDeProdutos.get(rowIndex);
    }
    
    @Override
    public int getRowCount() {
        return this.listaDeProdutos.size();
    }

    @Override
    public int getColumnCount() {
        return colunas.length;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
       switch(columnIndex){
            case 0:
               return this.listaDeProdutos.get(rowIndex).getNome();
            case 1: 
                return this.listaDeProdutos.get(rowIndex).getPreco();
            default:
                return this.listaDeProdutos.get(rowIndex);
       }
    }
    @Override
    public String getColumnName(int columnIndex){
        return this.colunas[columnIndex];
    }
}

Na parte da view estou tentando chamar dessa forma.

public class main extends javax.swing.JFrame {

    private produtoTableModel tableModelProduto;
    public main() {
   
        initComponents();
        this.tableModelProduto = new produtoTableModel();
        this.jtableProduto.setModel(tableModelProduto);
        
        Produto p = new Produto(Nome,Preco);
        // Não funciona os parametros Nome e Preco, mesmo tendo um construtor criado com eles na classe modelo produto
        produtoDAO dao = new produtoDAO();
        
        this.tableModelProduto.addProduto(dao.Recuperar());
        //this.tableModelProduto.addProduto(p);
    }

Os parâmetros que coloco na instanciar do obj da classe produto não estão funcionando, retorna o erro
cannot find symbol

Me ajuda ai galera, estou alguns dias tentando resolver esse problema e não consigo :frowning:

No metodo recuperar() você pôde criar uma instancia de Produto() sem usar parametros, já no metodo main você está passando parametros. Uma dúvida, você criou um construtor vazio e outro com dois paramentros? Se criou com os dois parametros o compilador não deixarár você executar sem os parametros no main a menos que você tenha criado também um construtor sem parametros. Pois você pode criar um construtor com parametros e outro sem da mesma classe e usar esses paramentros opcionalmente.

Você está fazendo uma confusão ao criar suas tables models.

this.tableModelProduto = new produtoTableModel();
//Você devia primeiro instanciar modelo = new produtoTableModel();
//Depois aí sim você coloca na sua tabela grafica 
//tabelaGrafica.setModel(modelo);

//tableModelProduto.addProduto(dao.Recuperar()); deve ser antes de você passar seu modelo para tabela grafica

Jonas, obrigado pelo retorno.

No caso dos construtores eu criei com e sem parâmetros, como eu uso o netbeans ele cria para mim automaticamente.

public class Produto {
    
    public String Nome;
    public double Preco;
    

    public Produto(String Nome, double Preco) {
        this.Nome = Nome;
        this.Preco = Preco;
        
    }

    public Produto() {
        
    }

Acredito então que seria dessa forma abaixo a main

        initComponents();
        this.tableModelProduto = new produtoTableModel();
        Produto p = new Produto(Nome,Preco);
        produtoDAO dao = new produtoDAO();
        this.tableModelProduto.addProduto(dao.Recuperar());
        this.jtableProduto.setModel(tableModelProduto);

Da o seguinte erro incompatible types: List<Produto> cannot be converted to Produto
na linha do this.tableModelProduto.addProduto(dao.Recuperar());

Está dando tipos incompativies porque você criou o construtor da classe produtoTableModel sem parametros, ele não receberia um ArrayList dessa forma.
Para resolver você troca:

public produtoTableModel(){
        this.listaDeProdutos = new ArrayList<>();

Por:

public ProdutoTableModel(List<Produto> produto) {
          this.produto = produto;
      }

Assim, pode ser que quando voce passar o list
this.tableModelProduto.addProduto(dao.Recuperar());

Ele aceite.
Mas você está usando o dao no lugar errado.

Fiz a troca, porém apareceu outros erros, e o erro de incompatibilidade continua.
O jeito e refazer essa parte, como deveria usar o DAO ?

O que for relacionado ao banco de dados você deixa nas classes do pacote dao.
Você também pode usar as classes controle
E na classe de teste, do metodo main você pode cirar um menu com as opções.

main {
switch(opcao) {
    case 1: ControleProduto.inserir(); break;
    case 2: ControleProduto.listar(); bradk;

   }
}

//A dao você vai usar aqui na de controle
class ControleProduto {
    public static void inserir() {
    Produto produto = new Produto();
    produto.setters();
    if (dao.inserir(produto)) {
          System.out.print("Inserido");
   }
   }
}

E na classe ProdutoDAO() {
public boolean inserir (Produto produto) {
  String sql = query de inserção 
  e preparedeStatement
  coisas relaciondas ao banco tudo aqui
   return true;
  //voce pode colocar isso dentro de um try-catch
 }
}