IndexOutOfBounds while populating an AbstractTableModel

0

I have a AbstractTableModel that has a List filled through a method that fetches the data in the database. The method that fills List has two overloads: one with no parameters (which fetches all data) and one with a search parameter (to search for a specific data).

When I populate my AbstractTableModel using the List populated through the method without parameters, I can bring all the data on the screen. But when I populate using the filled list through the search parameter method (that is, when I try to fetch a specific data in the database), it returns me a:

  

IndexOutOfBoundException index 1 size 1.

My AbstractTableModel class:

public class ProdutoVendaTableModel extends AbstractTableModel{

private ProdutoControle prodCtrl = new ProdutoControle();
private String colunas[] = {"Produto", "Valor", "Marca", "Gênero"};

private List<Produto> produtos;

public void fillLista(){
    produtos = prodCtrl.listar(busca);
}

public void fillLista(String busca){
    produtos = prodCtrl.listar(busca);
}

@Override
public String getColumnName(int coluna) {
    return colunas[coluna];
}

@Override
public int getRowCount() {
    return prodCtrl.listar().size();
}

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

@Override
public Object getValueAt(int linha, int coluna) {
    switch(coluna){
        case 0:
            return produtos.get(linha).getDescricao(); //nessa linha ocorre a exceção
        case 1:
            return produtos.get(linha).getValor_unitario();
        case 2:
            return produtos.get(linha).getMarca();
        case 3:
            return produtos.get(linha).getGenero();
        default:
            return null;
    }
}

Here are the methods of my control layer that serve only as messengers between the AbstractTableModel and the DAO layer:

public List<Produto> listar(){
    return pDAO.buscar();
}

public List<Produto> listar(String busca){
    return pDAO.buscar(busca);
}

Below my DAO layer where I look for the data in the database:

public List<Produto> buscar(){
    con = ConexaoBanco.getConexao();
    sql = "SELECT * FROM view_produtos";
    produtos = new ArrayList<>();

    try{
        stmt = con.prepareStatement(sql);

        rs = stmt.executeQuery();

        while(rs.next()){
            marca = new Marca();
            marca.setId(rs.getInt("mid"));
            marca.setDescricao(rs.getString("mdescricao"));

            genero = new Genero();
            genero.setId(rs.getInt("gid"));
            genero.setDescricao(rs.getString("gdescricao"));

            fornecedor = new Fornecedor();
            fornecedor.setId(rs.getInt("fid"));
            fornecedor.setRazao_social(rs.getString("razao_social"));
            fornecedor.setEmail(rs.getString("email"));
            fornecedor.setTelefone(rs.getString("telefone"));
            fornecedor.setCnpj(rs.getInt("cnpj"));
            fornecedor.setAtivo(rs.getInt("fativo"));

            produto = new Produto(marca, genero, fornecedor);
            produto.setId(rs.getInt("pid"));
            produto.setDescricao(rs.getString("pdescricao"));
            produto.setValor_unitario(rs.getFloat("valor_unitario"));
            produto.setEstoque_min(rs.getInt("estoque_min"));
            produto.setEstoque_max(rs.getInt("estoque_max"));
            produto.setAtivo(rs.getInt("pativo"));

            produtos.add(produto);
        }
    }
    catch(SQLException ex){
        JOptionPane.showMessageDialog(null, ex, "Erro", 0);
    }
    finally{
        ConexaoBanco.fechar(con, stmt, rs);
    }
    return produtos;
}

public List<Produto> buscar(String busca){
    con = ConexaoBanco.getConexao();
    sql = "SELECT * FROM view_produtos WHERE pdescricao LIKE '%"+busca+"%'";
    produtos = new ArrayList<>();

    try{
        stmt = con.prepareStatement(sql);

        rs = stmt.executeQuery();

        while(rs.next()){
            marca = new Marca();
            marca.setId(rs.getInt("mid"));
            marca.setDescricao(rs.getString("mdescricao"));

            genero = new Genero();
            genero.setId(rs.getInt("gid"));
            genero.setDescricao(rs.getString("gdescricao"));

            fornecedor = new Fornecedor();
            fornecedor.setId(rs.getInt("fid"));
            fornecedor.setRazao_social(rs.getString("razao_social"));
            fornecedor.setEmail(rs.getString("email"));
            fornecedor.setTelefone(rs.getString("telefone"));
            fornecedor.setCnpj(rs.getInt("cnpj"));
            fornecedor.setAtivo(rs.getInt("fativo"));

            produto = new Produto(marca, genero, fornecedor);
            produto.setId(rs.getInt("pid"));
            produto.setDescricao(rs.getString("pdescricao"));
            produto.setValor_unitario(rs.getFloat("valor_unitario"));
            produto.setEstoque_min(rs.getInt("estoque_min"));
            produto.setEstoque_max(rs.getInt("estoque_max"));
            produto.setAtivo(rs.getInt("pativo"));

            produtos.add(produto);
        }
    }
    catch(SQLException ex){
        JOptionPane.showMessageDialog(null, ex, "Erro", 0);
    }
    finally{
        ConexaoBanco.fechar(con, stmt, rs);
    }
    return produtos;
}

The click event of the search button on the screen:

private void btnPesquisaActionPerformed(java.awt.event.ActionEvent evt) {                                            

    prodTable = new ProdutoVendaTableModel();
    prodTable.fillLista(busca);
    jtProdutos.setModel(prodTable);
}                                        

When I click the search button with the empty text box the data appears normally, but if I actually try to search something, I fall into the exception. Any ideas?

    
asked by anonymous 20.05.2017 / 07:08

1 answer

1

Your code is not testable, so you can not accurately state the reason for the error, but I believe this is the cause:

change this:

@Override
public int getRowCount() {
    return prodCtrl.listar().size();
}

To:

@Override
public int getRowCount() {
    return produtos.size();
}
    
20.05.2017 / 15:18