繁体   English   中英

Java JList remove()方法抛出ArrayOutOfBoundsException

[英]Java JList remove() method throws an ArrayOutOfBoundsException

我正在使用正确显示的JList。 但是,我无法从列表中删除元素。

JList nameList = new JList(db.getAllNames());
nameList.setVisibleRowCount(6);
nameList.setFixedCellWidth(400);

JButton removeNameButton = new JButton("Remove Name");

removeNameButton.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e) {
        String id = nameList.getSelectedValue().toString(); //valid value when button pressed
        int index = nameList.getSelectedIndex(); //valid value when value pressed

        namesList.remove(index); //ERROR
    }

JList包含4个名称,它们可以完美显示,并且似乎具有正确的索引。 (如果我检查值System.out.println(copiersList.getModel().getSize());它将始终显示4

这是错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 3

奇怪的是,如果我删除了Adam,我不会收到错误消息(但显然列表不会更改,调用.getSize()方法将显示4):

在此处输入图片说明

id selected: Adam
index selected: 0

但是,任何其他:

id selected: BobException in thread "AWT-EventQueue-0" 
index selected: 1
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 1
at java.awt.Container.remove(Unknown Source)

不要从JList本身中删除,因为remove(...)方法不会执行您认为的操作。 实际上,它试图删除JList中保存的组件,就好像它是包含其他组件的JPanel一样,即使不存在这样的组件。 而是从JList的模型 (通常是DefaultListModel)中删除。 DefaultListModel类具有可以帮助您的removeElement(Object element)removeElementAt(int index)方法。

IE中。

public void actionPerformed(ActionEvent e) {
    String id = nameList.getSelectedValue().toString(); //valid value when button pressed
    int index = nameList.getSelectedIndex(); //valid value when value pressed

    DefaultListModel listModel = (DefaultListModel) namesList.getModel();
    listModel.removeElementAt(index); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM