java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

Olá , boa Tarde.

Sou novo aqui e iniciante em JAVA.

Estou com o seguinte problema no meu sistema:

Eu tenho uma tela de cadastro de Produção,e nessa tela tenho um ComboBox que carrega todos os itens da matéria - prima, mas quando eu vou selecionar um Item, ele me diz " Não foi possível preencher MeuCampoDBComboBox ".

ComboBox:

package componente;

import java.util.List;
import javax.swing.JComboBox;

public class MeuCampoComboBox extends JComboBox implements MeuComponente {

private boolean obrigatorio;
private String nome;
private String[][] dados;
private boolean podeHabilitar;
public MeuCampoComboBox(boolean obrigatorio,boolean podeHabilitar, String[][] dados, String nome) {
    this.obrigatorio = obrigatorio;
    this.dados = dados;
    this.nome = nome;
    this.podeHabilitar = podeHabilitar;
    preencher();
}
public void preencher() {
    removeAllItems();
 
    for (int i = 0; i < dados.length; i++) {
        addItem(dados[i][1]);
    }
}
@Override
public boolean eObrigatorio() {
    return obrigatorio;
}
@Override
public boolean eValido() {
    return true;
}
@Override
public boolean eVazio() {
    return getSelectedIndex() < 0;
}
@Override
public void limpar() {
    setSelectedIndex(-1);
}
@Override
public void habilitar(boolean status) {
    setEnabled(podeHabilitar && status);
}
@Override
public Object getValor() {
    if (getSelectedIndex() == -1) {
        return "";
    } else {
        return dados[getSelectedIndex()][0];
    }
}
@Override
public void setValor(Object valor) {
    for (int i = 0; i < dados.length; i++) {
        if (dados[i][0].equals((String) valor)) {
            setSelectedIndex(i);
            return;
        }
    }
    setSelectedIndex(-1);
}
@Override
public String getNome() {
    return nome;
}

}


DBComboBox:

package componente;

import banco.Conexao;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemListener;
import java.lang.reflect.Method;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class MeuCampoDBComboBox extends JPanel implements MeuComponente {

private JComboBox jcb = new JComboBox();
private JButton jb = new JButton("…");
private boolean podeHabilitar;
private List pks;
private String sql;
private boolean obrigatorio;
private String nome;
private List<Object[]> dados;

public MeuCampoDBComboBox(final Class tela, String sql, boolean obrigatorio,boolean podeHabilitar, String nome) {
this.obrigatorio = obrigatorio;
this.sql = sql;
this.nome = nome;
this.podeHabilitar = podeHabilitar;
setLayout(new FlowLayout());
add(jcb);
add(jb);
preencher();

   jb.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent ae) {
            try {
                Method metodoGetTela = tela.getMethod("getTela", new Class[]{});
                metodoGetTela.invoke(null, new Object[]{});
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    
   jcb.addFocusListener(new FocusAdapter() {
    @Override
    public void focusGained(FocusEvent fe) {
        preencher();
    }
 });

}

public void preencher() {

try {
        jcb.removeAllItems();
        pks = new ArrayList();
        jcb.addItem("SELECIONE");
        pks.add(-1);
        List<String[]> dados = Conexao.executaQuery(sql);
        ResultSet rs = Conexao.getConexao().createStatement().executeQuery(sql);
        while (rs.next()) {
            pks.add(rs.getInt(1));
            jcb.addItem(rs.getString(2));
        }
                   
      
        
        } catch (Exception e) {
        
        JOptionPane.showMessageDialog(null, "Não foi possível preencher o MeuCampoDBComboBox");
        e.printStackTrace();
     }

}

@Override
public boolean eObrigatorio() {
    return obrigatorio;
}
@Override
public boolean eValido() {
    return true;
}
@Override
public boolean eVazio() {
    return(jcb.getSelectedIndex() < 0);
}
@Override
public void limpar() {
    jcb.setSelectedIndex(0);
}
@Override
public void habilitar(boolean status) {
    jcb.setEnabled(podeHabilitar && status);
    jb.setEnabled( podeHabilitar && status);
}
@Override
public Object getValor() {
   
  return pks.get(jcb.getSelectedIndex());
  
  
}
    
@Override
public void setValor(Object valor) {
     
    for (int i = 0; i < pks.size(); i++) {
       
         if (pks.get(i) == (int)valor) {
            jcb.setSelectedIndex(i);
           
           return; 
        }
         
    }
    
//    JOptionPane.showMessageDialog(null, getNome() + " não encontrado(a).");
     
//    jcb.setSelectedIndex(-1);
}

@Override
public String getNome() {
    return nome;
}
 public String getValorTexto() {
    return (String) jcb.getSelectedItem();
}

public void addItemListener(ItemListener il) {
    jcb.addItemListener(il);
}

}


Tela de Produção:

package tela;

import componente.MeuCampoCheckBox;
import componente.MeuCampoComboBox;
import componente.MeuCampoDBComboBox;
import componente.MeuCampoData;
import componente.MeuCampoInteiro;
import componente.MeuCampoMonetario;
import componente.MeuCampoTexto;
import dao.DaoProducao;
import dao.DaoMateriaPrima;
import dao.DaoProdutoAcabado;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.event.InternalFrameAdapter;
import javax.swing.event.InternalFrameEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import pojo.Producao;
import pojo.ItensProducao;
import pojo.MateriaPrima;
import tabela.TabelaItem;
import tabela.TableModelItem;

public class TelaCadastroProducao extends TelaCadastro {

public static TelaCadastroProducao tela;
public Producao producao = new Producao();
public DaoProducao daoProducao = new DaoProducao(producao);
public ItensProducao itemProducao = new ItensProducao();

public MeuCampoInteiro campoCodigo = new MeuCampoInteiro(5, true, false, "Código");
public MeuCampoData campoData = new MeuCampoData(10, true, "Data");
public MeuCampoData campoPrevisao = new MeuCampoData(10, true, "Previsão");
public MeuCampoTexto campoDescricao= new MeuCampoTexto(20, 50, false, "Descrição");
public MeuCampoInteiro campoQuantidade = new MeuCampoInteiro(5,true,true,"Quantidade á ser Produzida");
public MeuCampoComboBox campoStatus = new MeuCampoComboBox(true, true, new String[][] {{"A","Em Andamento"}, {"F", "Finalizada"}},  "Status");

public MeuCampoDBComboBox campoItensMateriaPrima = new MeuCampoDBComboBox(TelaCadastroMateriaPrima.class, DaoMateriaPrima.SQL_COMBOBOX, true, true ,"Matéria-Prima");

public MeuCampoDBComboBox campoProdutoAcabado = new MeuCampoDBComboBox(TelaCadastroProdutoAcabado.class,DaoProdutoAcabado.SQL_COMBOBOX, true, true, "Produto Acabado");


public MeuCampoInteiro campoQuantidadeItem = new MeuCampoInteiro(5, true, true, "Quantidade de Item");

public TabelaItem tabelaItem = new TabelaItem();

  public static TelaCadastro getTela() {  
    if (tela == null) {   
        tela = new TelaCadastroProducao();
        tela.addInternalFrameListener(new InternalFrameAdapter() {  
            @Override
            public void internalFrameClosed(InternalFrameEvent e) {
                TelaSistema.meuJDesktopPane.remove(tela);
                tela = null;
            }
        });
        TelaSistema.meuJDesktopPane.add(tela);
    }
    
    TelaSistema.meuJDesktopPane.setSelectedFrame(tela);
    TelaSistema.meuJDesktopPane.moveToFront(tela);
    return tela;

 }
public TelaCadastroProducao() {
    super("Cadastro de Produção");
    adicionarComponente(1, 1, 1, 1, campoCodigo,ESQUERDA);
    adicionarComponente(2, 1, 1, 1, campoData,ESQUERDA);
    adicionarComponente(3, 1, 1, 1, campoProdutoAcabado,ESQUERDA);
    adicionarComponente(4, 1, 1, 1, campoDescricao,ESQUERDA);
    adicionarComponente(5, 1, 1, 1, campoPrevisao,ESQUERDA);
    adicionarComponente(6, 1, 1, 1, campoQuantidade,ESQUERDA);
    adicionarComponente(7, 3, 1, 1, campoQuantidadeItem,ESQUERDA);
    adicionarComponente(7, 1, 2, 2, campoStatus,ESQUERDA);
    adicionarComponente(8, 1, 2, 1, tabelaItem,ESQUERDA);
    adicionarComponente(3, 3, 1, 1, campoItensMateriaPrima,ESQUERDA);
    habilitarCampos(false);
    pack();
   adicionaListeners();
}
public void setPersistencia() {
  
    producao.setId((int) campoCodigo.getValor());
    producao.setData((Date) campoData.getValor());
    producao.setDescricao((String) campoDescricao.getValor());
    producao.setPrevisao((Date) campoPrevisao.getValor());
    producao.setQuantidade((int) campoQuantidade.getValor());
    producao.setStatus((String) campoStatus.getValor());
    producao.getProdutoacabado().setId((int) campoProdutoAcabado.getValor());
    producao.setItensProducao(((TableModelItem)tabelaItem.getTabela().getModel()).getDados());
    
    
}
public void getPersistencia() {
      
    campoCodigo.setValor(producao.getId());
    campoData.setValor(producao.getData());
    campoDescricao.setValor(producao.getDescricao());
    campoPrevisao.setValor(producao.getPrevisao());
    campoQuantidade.setValor(producao.getQuantidade());
    campoStatus.setValor(producao.getStatus());
    campoProdutoAcabado.setValor(producao.getProdutoacabado().getId());
    ((TableModelItem) tabelaItem.getTabela().getModel()).setDados(producao.getItensProducao());
}

@Override
public void incluir() {
    super.incluir();
    campoData.setValor(new Date());
}
@Override
public boolean incluirBD() {
    setPersistencia();
    return daoProducao.incluir();
}
@Override
public boolean alterarBD() {
    setPersistencia();
    return daoProducao.alterar();
}
@Override
public boolean excluirBD() {
    setPersistencia();
    return daoProducao.excluir();
}
@Override
public void consultar() {
    super.consultar();
    new TelaConsulta(this,
            "Consulta de Produção",
            new String[]{"Código", "Data", "Previsão", "Descrição", "Quantidade", "Status"},
            DaoProducao.SQL_PESQUISAR);
}
@Override
public void preencherDados(int pk) {
    producao.setId(pk);
    daoProducao.consultar();
    getPersistencia();
    super.preencherDados(pk);
}



public void adicionaListeners() {
     campoItensMateriaPrima.addItemListener(new ItemListener() {
        @Override
        public void itemStateChanged(ItemEvent ie) {
            if (ie.getStateChange() == ItemEvent.SELECTED) {
                tabelaItem.getTableModel().alteraMateriaPrima(campoItensMateriaPrima.getValor(), tabelaItem.getLinhaSelecionada());
                MateriaPrima materiaprima = tabelaItem.getTableModel().getMateriaPrima(tabelaItem.getLinhaSelecionada());
                campoQuantidadeItem.setValor(materiaprima.getQuantidade()); //*
               
            }
        }
    });
   
     campoQuantidadeItem.addFocusListener(new FocusAdapter() {
        @Override
        public void focusLost(FocusEvent fe) {
                tabelaItem.getTableModel().alteraQuantidade(campoQuantidadeItem.getValor(), tabelaItem.getLinhaSelecionada());
               
        }
     });
    
    tabelaItem.getTabela().getSelectionModel().addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent lse) {
            if (!lse.getValueIsAdjusting() && tabelaItem.getTabela().getSelectedRow() >= 0) {
                ItensProducao itensProducao = tabelaItem.getTableModel().getItensProducao(tabelaItem.getTabela().getSelectedRow());
                campoItensMateriaPrima.setValor(itensProducao.getMateriaprima().getId());
                campoQuantidadeItem.setValor(itensProducao.getQuantidade());
                
            }
        }
    });
}
@Override
public boolean verificarCampos() {

// if (super.verificarCampos() == false) { //Esta linha faz exatamente o mesmo do que a linha abaixo.
if (!super.verificarCampos()) {
return false;
}
List itens = ((TableModelItem) tabelaItem.getTabela().getModel()).getDados();
for (int i = 0; i < itens.size(); i++) {
if (itens.get(i).getMateriaprima().getId() == 0) {
JOptionPane.showMessageDialog(null,
“Exite(m) Matéria-Prima(s) não selecionado(s).”);
return false;
}
if (itens.get(i).getQuantidade() <= 0) {
JOptionPane.showMessageDialog(null,
“Existe(m) Matéria-Prima(s) com quantidade inválida(s).”);
return false;
}

    }
    return true;
}

}

A saída de erro :

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653)
at java.util.ArrayList.get(ArrayList.java:429)
at componente.MeuCampoDBComboBox.getValor(MeuCampoDBComboBox.java:127)
at tela.TelaCadastroProducao$2.itemStateChanged(TelaCadastroProducao.java:164)
at javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223)
at javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1280)
at javax.swing.JComboBox.contentsChanged(JComboBox.java:1330)
at javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118)
at javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93)
at javax.swing.DefaultComboBoxModel.addElement(DefaultComboBoxModel.java:131)
at javax.swing.JComboBox.addItem(JComboBox.java:716)
at componente.MeuCampoDBComboBox.preencher(MeuCampoDBComboBox.java:71)
at componente.MeuCampoDBComboBox$2.focusGained(MeuCampoDBComboBox.java:58)
at java.awt.AWTEventMulticaster.focusGained(AWTEventMulticaster.java:220)
at java.awt.Component.processFocusEvent(Component.java:6422)
at java.awt.Component.processEvent(Component.java:6289)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:986)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:610)
at java.awt.Component.dispatchEventImpl(Component.java:4760)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
CONSTRUÇÃO PARADA (tempo total: 12 segundos)

Desde já Agradeço.

Olá,
seu erro está aqui:

@Override
public Object getValor() {
    if (getSelectedIndex() == -1) {
        return "";
    } else {
        return dados[getSelectedIndex()][0];
    }
}

Vc colocou fixo para acessar a posição 0, porém ela não está existindo neste caso.

1 curtida

Como ficaria esse método getValor sem ficar fixo na posição 0 ?

Eu acredito que o erro esteja no método preencher em MeuCampoDBComboBox, pois eu mudei algumas ordens e funcionou ao incluir, porém quando eu vou consultar e depois alterar,os itens somem da tabela e volta dar erro quando eu vou tentar colococar outro item.

Olha o que eu mudei:

public void preencher() {

try {
        jcb.removeAllItems();
        jcb.addItem("SELECIONE");
        pks = new ArrayList();
        pks.add(-1);
        List<String[]> dados = Conexao.executaQuery(sql);
        ResultSet rs = Conexao.getConexao().createStatement().executeQuery(sql);
        while (rs.next()) {
            pks.add(rs.getInt(1));
            jcb.addItem(rs.getString(2));
        }
                   
       
        
        } catch (Exception e) {
        
        JOptionPane.showMessageDialog(null, "Não foi possível preencher o MeuCampoDBComboBox");
        e.printStackTrace();
     }
}

Pode ser também que seja necessário estar fixo, porém neste caso deve garantir que sempre exista esta posição e verificar oque está acontecendo para ela deixar de existir.
Tá complicado de verificar por aqui a linha exata do problema: MeuCampoDBComboBox.getValor(MeuCampoDBComboBox.java:127)
Vê lá no seu ambiente o que tem nesta linha (quando ocorre o erro) se modificou o código atualize esta linha.
Basicamente é um erro na sua lógica, onde vc está tentando acessar uma posição que não existe. Debugando geralmente se descobre e resolve-se.