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?