Java JComboBox ActionListener崩溃

Java JComboBox ActionListener崩溃,java,arraylist,jcombobox,Java,Arraylist,Jcombobox,我要走了 线程“AWT-EventQueue-0”中出现异常 java.lang.ArrayIndexOutOfBoundsException:-1 当我删除JComboBox中的最后一项时。有人知道为什么吗 cb = new JComboBox<String>(); bComboDelete.addActionListener(this); bComboDelete = new JButton("X"); //deletes item from CB bComboAccept =

我要走了

线程“AWT-EventQueue-0”中出现异常 java.lang.ArrayIndexOutOfBoundsException:-1

当我删除
JComboBox
中的最后一项时。有人知道为什么吗

cb = new JComboBox<String>();
bComboDelete.addActionListener(this);

bComboDelete = new JButton("X"); //deletes item from CB
bComboAccept = new JButton("#");// add an item

ArrayList<String> names = new ArrayList<String>(); //get name, runs with sNumbers
ArrayList<String> sNumbers = new ArrayList<String>();//some String numbers ----> e.g.  [[1, 2, 3],[4, 5, 6]]
ArrayList<Integer> numbers = new ArrayList<Integer>(); //array to temp hold numbers

//***ending code from ActionListener
else if(s == bComboAccept)
{
    sNumbers.add(numbers.toString());
    //System.out.println(sNumbers);
    names.add(tName.getText());//tName is JTextField
    //cb.addItem(tName.getText());

    cb.addItem(new String(tName.getText()));
    cb.setSelectedItem(new String(tName.getText()));
}

else if(s == bComboDelete)
{
    int z = cb.getSelectedIndex();
    //System.out.println(z);
    names.remove(z);
    //System.out.println("Names: "+names);
    sNumbers.remove(z);
    //System.out.println("sNumbers: "+sNumbers);
    cb.removeItem(cb.getSelectedItem());

}

else if(s == cbLista)
{
    System.out.println("cb Action listener!\n--------------");

    Integer i = cb.getSelectedIndex();


    tNames.setText(nazwy.get(i));
    tNumbers.setText("");//also TextField

    numbers.clear();
    numbers=arrayStringToIntegerArrayList(sNumbers.get(i));
    tNumbers.setText(numbers.toString().substring(1, numbers.toString().length()-1));
}
cb=newjcombobox();
bcombodelite.addActionListener(这个);
bcombodelite=新的JButton(“X”)//从CB中删除项目
bComboAccept=新的JButton(“#”)//添加项目
ArrayList name=新的ArrayList()//获取名称,使用sNumbers运行
ArrayList sNumbers=新的ArrayList()//一些字符串数字-->例如[1,2,3],[4,5,6]]
ArrayList编号=新的ArrayList()//数组到临时保留数
//***从ActionListener结束代码
如果(s==bComboAccept),则为else
{
添加(numbers.toString());
//系统输出打印LN(sNumbers);
name.add(tName.getText());//tName是JTextField
//cb.addItem(tName.getText());
addItem(新字符串(tName.getText());
cb.setSelectedItem(新字符串(tName.getText());
}
else如果(s==bComboDelete)
{
int z=cb.getSelectedIndex();
//系统输出打印ln(z);
名称。删除(z);
//System.out.println(“名称:”+名称);
sNumbers.remove(z);
//System.out.println(“sNumbers:+sNumbers”);
cb.removietem(cb.getSelectedItem());
}
如果(s==cbLista),则为else
{
System.out.println(“cb操作侦听器!\n----------------”;
整数i=cb.getSelectedIndex();
tNames.setText(nazwy.get(i));
tNumbers.setText(“”;//也可以是TextField
数字。清除();
numbers=arrayStringToIntegerArrayList(sNumbers.get(i));
tNumbers.setText(numbers.toString().substring(1,numbers.toString().length()-1));
}
其余崩溃代码:

线程“AWT-EventQueue-0”中出现异常 java.lang.ArrayIndexOutOfBoundsException:-1位于 位于的java.util.ArrayList.elementData(未知源) java.util.ArrayList.get(未知源代码)位于 Okno.actionPerformed(Okno.java:339)在 javax.swing.JComboBox.fireActionEvent(未知源代码)位于 javax.swing.JComboBox.contentsChanged(未知源代码)位于 javax.swing.AbstractListModel.fireContentsChanged(未知源代码)位于 位于的javax.swing.DefaultComboxModel.setSelectedItem(未知源) 位于的javax.swing.DefaultComboxModel.removeElementAt(未知源代码) 位于的javax.swing.DefaultComboxModel.removeElement(未知源代码) javax.swing.JComboBox.removietem(未知源代码)位于 Okno.actionPerformed(Okno.java:328)在 javax.swing.AbstractButton.fireActionPerformed(未知源代码)位于 javax.swing.AbstractButton$Handler.actionPerformed(未知源代码)位于 javax.swing.DefaultButtonModel.fireActionPerformed(未知源代码)位于 javax.swing.DefaultButtonModel.setPressed(未知源代码)位于 javax.swing.plaf.basic.BasicButtoListener.mouseReleased(未知 位于java.awt.Component.ProcessMouseeEvent(未知源代码)的 javax.swing.JComponent.ProcessMouseeEvent(未知源代码)位于 位于的java.awt.Component.processEvent(未知源) 位于的java.awt.Container.processEvent(未知源) 位于的java.awt.Component.dispatchEventImpl(未知源) 位于的java.awt.Container.dispatchEventImpl(未知源) 位于的java.awt.Component.dispatchEvent(未知源) 位于的java.awt.LightweightDispatcher.RetargetMouseeEvent(未知源) 位于的java.awt.LightweightDispatcher.ProcessMouseeEvent(未知源) 位于的java.awt.LightweightDispatcher.dispatchEvent(未知源) 位于的java.awt.Container.dispatchEventImpl(未知源) 位于的java.awt.Window.dispatchEventImpl(未知源) 位于的java.awt.Component.dispatchEvent(未知源) 位于的java.awt.EventQueue.dispatchEventImpl(未知源) java.awt.EventQueue.access$500(未知源代码)位于 java.awt.EventQueue$3.run(未知源代码)位于 java.awt.EventQueue$3.run(未知源代码)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源代码)位于java.awt.EventQueue$4。运行(未知源代码)位于 java.awt.EventQueue$4.run(未知源代码)位于 java.security.AccessController.doPrivileged(本机方法)位于 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源代码)位于java.awt.EventQueue.dispatchEvent(未知源代码)位于 java.awt.EventDispatchThread.pumpOneEventForFilters(未知源) 位于java.awt.EventDispatchThread.pumpEventsForFilter(未知源) 位于java.awt.EventDispatchThread.PumpeEventsforHierarchy(未知 源代码)位于java.awt.EventDispatchThread.pumpEvents(未知源代码) 位于java.awt.EventDispatchThread.pumpEvents(未知源) java.awt.EventDispatchThread.run(未知源)


尝试添加以下修改

else if(s == bComboDelete)
{
    int z = cb.getSelectedIndex();

    // -1 means that no item is selected
    if (z > -1) {
        //System.out.println(z);
        names.remove(z);
        //System.out.println("Names: "+names);
        sNumbers.remove(z);
        //System.out.println("sNumbers: "+sNumbers);
        cb.removeItem(cb.getSelectedItem());
    }
}
else if(s == cbLista)
{
    System.out.println("cb Action listener!\n--------------");

    Integer i = cb.getSelectedIndex();

    // -1 means that no item is selected
    if (i > -1) {
        tNames.setText(nazwy.get(i));
        tNumbers.setText("");//also TextField

        numbers.clear();
        numbers=arrayStringToIntegerArrayList(sNumbers.get(i));
        tNumbers.setText(numbers.toString().substring(1, numbers.toString().length()-1));
    }
}
看来我把这个修好了。 现在代码是这样的:

我懒得将var重命名为eng。请忽略系统输出

因此:


是否确定已选择该项目?因为
cb.getSelectedIndex()
将返回
-1
否则。添加一些预防措施,例如
如果(getSelectedindex()>-1){delete code}否则{System.out.println(“Nothing selected”)}
我在cb Action Listener中有它,而不是在delete中,我会尝试它看起来正在工作,我的坏。我会做更多的测试//刚才撞车了。还有一些问题。
cb.setSelectedItem(新字符串(tName.getText())-为什么每次从文本字段获取text()时都要创建一个新字符串()?没有必要这样做。是的,但有时我会遇到异常,比如尝试将索引1添加到具有1个大小的数组中。数组是从零开始的,因此,如果数组的大小为10,那么它将具有0-9而不是1-10的索引。如果数组的大小为1,则必须将其添加/分配到索引0。索引1在数组的边界之外,我知道,但不确定何时得到I或z+1。在线程“AWT-EventQueue-0”java.lang.IndexOutOfBoundsException:Index中使用if:exception进行更正时出现异常
nazwy = names
oceny = numbers
sOceny = sNumbers
cbLista = cb
tNazwa = tNames
tOceny = tNumbers

//----
else if(s == bComboDelete)
    {
        Object o = cbLista.getSelectedItem();

            int z = nazwy.indexOf(o);
            if(z>-1)
            {
            sOceny.remove(z);
            nazwy.remove(z);
            cbLista.removeItemAt(z);
            System.out.println("Oceny w bloku delete(if)"+oceny.toString());
            }
            System.out.println("Oceny w bloku delete(poza if)"+oceny.toString());
    }

    else if(s == cbLista)
    {
        Object o = cbLista.getSelectedItem();

        int z = nazwy.indexOf(o);
        if(z>-1)
        {
        tNazwa.setText(nazwy.get(z));
        oceny.clear();
        oceny=arrayStringToIntegerArrayList(sOceny.get(z));
        tOceny.setText(oceny.toString().substring(1, oceny.toString().length()-1));
        System.out.println("Oceny w bloku CB"+oceny.toString());
        }
        else
        {
            tNazwa.setText("");
            tOceny.setText("");
            oceny.clear();
        }


    }