【问题标题】:Java JComboBox ActionListener crashJava JComboBox ActionListener 崩溃
【发布时间】:2015-06-23 10:20:33
【问题描述】:

我来了

线程“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));
}

崩溃代码的其余部分:

线程“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.DefaultComboBoxModel.setSelectedItem(未知来源)在 javax.swing.DefaultComboBoxModel.removeElementAt(未知来源)在 javax.swing.DefaultComboBoxModel.removeElement(未知来源)在 javax.swing.JComboBox.removeItem(未知来源)在 Okno.actionPerformed(Okno.java:328) 在 javax.swing.AbstractButton.fireActionPerformed(未知来源)在 javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(未知来源)在 javax.swing.DefaultButtonModel.setPressed(未知来源)在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(未知 源)在 java.awt.Component.processMouseEvent(未知源)在 javax.swing.JComponent.processMouseEvent(未知来源)在 java.awt.Component.processEvent(未知来源)在 java.awt.Container.processEvent(未知来源)在 java.awt.Component.dispatchEventImpl(未知来源)在 java.awt.Container.dispatchEventImpl(未知来源)在 java.awt.Component.dispatchEvent(未知来源)在 java.awt.LightweightDispatcher.retargetMouseEvent(未知来源)在 java.awt.LightweightDispatcher.processMouseEvent(未知来源)在 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(Unknown Source) at java.awt.EventQueue$3.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 来源)在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue$4.run(未知源)在 java.awt.EventQueue$4.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(未知 源)在 java.awt.EventQueue.dispatchEvent(未知源)在 java.awt.EventDispatchThread.pumpOneEventForFilters(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForFilter(未知来源) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(未知 来源)在 java.awt.EventDispatchThread.pumpEvents(未知来源) 在 java.awt.EventDispatchThread.pumpEvents(Unknown Source) 在 java.awt.EventDispatchThread.run(未知来源)

【问题讨论】:

  • 您确定该项目已被选中?因为cb.getSelectedIndex(); 否则将返回-1
  • 添加一些预防措施如if (getSelectedindex() &gt; -1) { delete code } else { System.out.println("Nothing selected") }
  • 我在cb Action Listener里有,不是在delete里,我试试
  • 似乎工作正常,我的错。我会再做一些测试。 //刚才崩溃了。还有其他问题。
  • cb.setSelectedItem(new String(tName.getText())); - 为什么每次从文本字段中获取文本()时都创建一个新的 String()?没有必要这样做。

标签: java arraylist jcombobox


【解决方案1】:

尝试添加以下修改...

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));
    }
}

【讨论】:

  • 是的,但有时我会遇到异常,例如尝试将索引 1 添加到大小为 1 的数组中
  • 数组是从零开始的,所以如果你有一个大小为 10 的数组,它的索引是 0 - 9 而不是 1 - 10。如果你有一个大小为 1 的数组,您必须添加/分配给索引零。索引 1 超出数组范围
  • 我知道,但不确定我什么时候得到 i 或 z 那个 +1。如果更正以下情况,则出现以下异常:线程“AWT-EventQueue-0”中的异常 java.lang.IndexOutOfBoundsException:索引:1,大小:1 ------->在 Okno.actionPerformed(Okno.java:345) -------->在 Okno.actionPerformed(Okno.java:331)。我添加了第 345 行的箭头: tNames.setText(names.get(i));然后 331: cbLista.removeItem(cbLista.getSelectedItem().toString());现在我看到我没有翻译所有 var,第 345 行也是在 331 之前完成的——首先是 cb 的 ActionListener,然后是删除 Item。有什么线索吗?
  • 您需要发布更多代码以及遇到的错误。您当前的问题涉及在删除时处理 -1。
  • 我观察到,当我向 cb 添加第二个东西并选择第一个时,它的值为 -1。我应该粘贴所有代码吗?
【解决方案2】:

看来我解决了这个问题。 现在代码是这样的:

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

所以:

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


    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多