Java JList remove()方法抛出ArrayOutOfBoundsException

时间:2015-01-03 19:04:08

标签: java swing jlist

我正在使用正确显示的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):

enter image description here

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)

1 个答案:

答案 0 :(得分:4)

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

即,

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