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?
That’s right, it worked! Just a question about your comment, which would be in fact a testable code?
– Lucas Durigan
@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.
– user28595