excepção ArrayIndexOutOfBoundsException em jComboBox1.removeAllItems();

5 respostas
R

Boa tarde, estou desenvolvendo um programa de java usando o netBeans.

Eu tenho um menu que possui uma comboBox que é prenchida com vários nomes, para dps aceder à informação dos mesmos.
Quando o programa arranca é lido um ficheiro XML e a combobox é prenchida da seguinte forma:

for (int ii = 0; ii < playerList.size(); ii++) {
                Players sdf = playerList.get(ii);
                this.jComboBox1.insertItemAt(sdf.getPlayerName(), ii);
            }

Quando eu actualizo o ficheiro XML a dada altura, volto a chamar a função que le e prenche os novos dados.
Necessito então de apagar o conteudo da combobox e prencher com os novos dados (até podem vir a ser o mesmo!, mas não importa).

Então coloquei a função jComboBox1.removeAllItems();
(antes da parte de prencher a comboBox corre tudo bem)

Quando o xml é actualizado e volto a chamar a função dá-me a seguinte excepção:

Exception in thread AWT-EventQueue-0 java.lang.ArrayIndexOutOfBoundsException: -1

at java.util.ArrayList.get(ArrayList.java:324)

at jma.JMAmain.jComboBox1ActionPerformed(JMAmain.java:1654)

at jma.JMAmain.access$300(JMAmain.java:54)

at jma.JMAmain$5.actionPerformed(JMAmain.java:581)

at javax.swing.JComboBox.fireActionEvent(JComboBox.java:1242)

at javax.swing.JComboBox.contentsChanged(JComboBox.java:1313)

at javax.swing.JComboBox.intervalRemoved(JComboBox.java:1333)

at javax.swing.AbstractListModel.fireIntervalRemoved(AbstractListModel.java:161)

at javax.swing.DefaultComboBoxModel.removeAllElements(DefaultComboBoxModel.java:169)

at javax.swing.JComboBox.removeAllItems(JComboBox.java:753)

at jma.JMAmain.jButton3ActionPerformed(JMAmain.java:1580)

at jma.JMAmain.access$400(JMAmain.java:54)

at jma.JMAmain$6.actionPerformed(JMAmain.java:841)

at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)

at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)

at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)

at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)

at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)

at java.awt.Component.processMouseEvent(Component.java:6041)

at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)

at java.awt.Component.processEvent(Component.java:5806)

at java.awt.Container.processEvent(Container.java:2058)

at java.awt.Component.dispatchEventImpl(Component.java:4413)

at java.awt.Container.dispatchEventImpl(Container.java:2116)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)

at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)

at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)

at java.awt.Container.dispatchEventImpl(Container.java:2102)

at java.awt.Window.dispatchEventImpl(Window.java:2440)

at java.awt.Component.dispatchEvent(Component.java:4243)

at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)

at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)

at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)

at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)

at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Pesquisei no google disseram para colocar esta linha mas o resultado manteve-se:
coloquei dps da função initcomponents():

this.jComboBox1.setModel(new DefaultComboBoxModel());

Um bocado em desespero e para despachar fiz esta solução pouco bonita (completamente martelada)

//remove
            for (int ii = (this.jComboBox1.getItemCount() - 1); ii > 0; ii--) {

                System.out.println("indice" + ii);
                //System.out.println(this.jComboBox1.getSelectedIndex());
                System.out.println(this.jComboBox1.getItemAt(ii));
                this.jComboBox1.removeItemAt(ii);
            }

//new Fill
           for (int ii = 0; ii < playerList.size(); ii++) {
                Players sdf = playerList.get(ii);
                this.jComboBox1.insertItemAt(sdf.getPlayerName(), ii);
            }

//remove ancient fist entrance
            jComboBox1.setSelectedIndex(0);
            this.jComboBox1.removeItemAt((this.jComboBox1.getItemCount() - 1));
            jComboBox1.setSelectedIndex(0);

Até a remover elemento a elemento tive problemas pois não consegui apagar o indice 0, tendo de o apagar depois de novo prenchimento quando este já era o ultimo indice ou item.

Pensei que fosse por estar selecionado ai tentei:

this.jComboBox1.setSelectedIndex(-1);


public void setSelectedIndex(int anIndex)
Selects the item at index anIndex.
Parameters:
anIndex - an integer specifying the list item to select, where 0 specifies the first item in the list and -1 indicates no selection

mas esta linha também devolve uma excepção:
Exception in thread “AWT-EventQueue-0” java.lang.ArrayIndexOutOfBoundsException: -1

Quem puder ajudar ficava muito agradecido
Obrigado pela ajuda e peço desculpa pelo tempo despendido a ler este tópico:$

5 Respostas

nel

Oi!

Li por cima mas a exceção é simplesmente que está tentando remover um item de uma posição inexistente de sua lista.
Provavelmente sua lista está vazia e está tentando realizar um get(index) e estoura a exceção.

Verifique esta linha: at jma.JMAmain.jComboBox1ActionPerformed(JMAmain.java:1654)
Creio que o seu problema esteja aqui.

Poste o método completo o actionPerformed, fica mais fácil.
Abraços.

R

OK, obrigado pela ajuda.

fiz um botão só para tentar usar a função do jComboBox1.removeAllItems();
o action performed é só isto:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

System.out.println(“count”+this.jComboBox1.getItemCount());

<a href="//this.jComboBox1.setSelectedIndex">//this.jComboBox1.setSelectedIndex</a>(-1);
this.jComboBox1.removeAllItems();

}

mas a propria combobox tem um action performe:

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {

<a href="//System.out.println">//System.out.println</a>(this.jComboBox1.getSelectedIndex());

int item = jComboBox1.getSelectedIndex();

Players player = playerList.get(item);

playerDetaislFill(player);

System.out.println(jComboBox1.getSelectedIndex());
//public List<Players> playerList = new ArrayList<Players>();
}

O que sugeres é que isto pode estar a correr quando o jova tenta eliminar todos os itens?

R

OK pus esta protecção no codigo da combobox e resolveu:

if (this.jComboBox1.getItemCount()>0){
        int item = jComboBox1.getSelectedIndex();
        Players player = playerList.get(item);
        playerDetaislFill(player);
        System.out.println(jComboBox1.getSelectedIndex());
        }

obrigado.
és o maior

tenho de prestar mais atenção ao que a excepção diz :blush:
só vi a primeira linha, como estava a tentar só apagar o conteúdo nunca pensei que ia ser executado aquele pedaço :blush:

nel

Perfeito.

Acredito que este código resolva o seu problema.

if (this.jComboBox1.getItemCount()>0){ int item = jComboBox1.getSelectedIndex(); Players player = playerList.get(item); playerDetaislFill(player); System.out.println(jComboBox1.getSelectedIndex()); }

Você utilizou tags em maíusculo e acabou por não ficar da forma correta.
Basta adicionar [Resolvido] ao fim do seu tópico.

Abraços!

R

[Resolvido]

Criado 2 de agosto de 2011
Ultima resposta 16 de set. de 2011
Respostas 5
Participantes 2