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 的 model 中移除,通常是 DefaultListModel。 DefaultListModel class 有一个 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); 
}