Indexoutofbounds when filling an Abstracttablemodel

Asked

Viewed 76 times

0

I have a AbstractTableModel who owns a List filled by a method that searches the data in the database. The method that fills the List has two overloads: one without any parameter (that searches all the data) and the other with a search parameter (to search for a specific data).

When I fill mine AbstractTableModel using the List filled through the method without parameters, I can bring all the data on the screen. But when I fill using the List populated through the method with search parameter(ie when I try to search for a specific data in the database), it returns to 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 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 search 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 event click 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 on 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 idea?

1 answer

1


Your code isn’t testable, so you can’t exactly state the reason for the error, but I believe this is the cause:

amend this part:

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

for:

@Override
public int getRowCount() {
    return produtos.size();
}
  • That’s right, it worked! Just a question about your comment, which would be in fact a testable code?

  • @Lucasdurigan would be a [mcve], which is a version of your code that anyone could compile and run to see where the problem originates. In this case the problem was in the code, but sometimes it is in other places, even in the bank. That is why it is important to isolate the problem, making the code with some examples made at hand rather than bank search, when I do this, I usually find the error easier.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.