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

3 respostas Resolvido
programaçãojava
V

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.

3 Respostas

R

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.

V

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();
     }
}
R
Solucao aceita

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.

Criado 17 de agosto de 2017
Ultima resposta 18 de ago. de 2017
Respostas 3
Participantes 2