从JList中删除项目

时间:2016-03-20 14:20:59

标签: java swing indexoutofboundsexception

我之前已经问过这个问题,并且有许多线程我可以剪切和粘贴工作代码,但我的问题是为什么我下面的代码不起作用。我试图从JList中删除多个项目,但是当我运行以下代码时,我得到一个超出范围的异常。这是snippit:

static DefaultListModel<File> listModel = new DefaultListModel<>();
JList<File> fileList = new JList<>(listModel);

void removeFiles() {
    int[] listRange = new int[100];
    listRange = fileList.getSelectedIndices();
    int i = 0;
    while (i <= listRange.length) {
        listModel.remove(listRange[i]);
        i++;
    }
}

我使用调试语句确认fileList正在获取数据(即如果我添加4个文件,其长度为4),我也确认listRange中的索引代表我要删除的文件的索引。但出于某种原因,它不会删除它们。我已尝试从fileList以及模型(listModel)中删除,但两者都无效。我在这里俯瞰什么吗?感谢。

2 个答案:

答案 0 :(得分:2)

从列表中删除项目时,其大小将减小。

因此,例如,在3个项目的列表中,您要删除索引1和2处的项目。 删除第一个时,列表中只有2个项目保留在索引0和1处。因此调用list.remove(2)将导致outOfBoundException

一种可能的解决方案是使用迭代器并继续调用next,直到你想要删除其中一个索引并在其上调用remove。或者简单地减少下一个索引以删除已经执行的删除次数

PS:仅当getSelectedIndices返回有序数组时才有效。否则,您必须自己订购指数

static DefaultListModel<File> listModel = new DefaultListModel<>();
JList<File> fileList = new JList<>(listModel);

void removeFiles() {
    int[] listRange = new int[100];
    listRange = fileList.getSelectedIndices();
    int i = 0;
    //The counter of the removed items so far
    int nbOfRemovedItems = 0;

    while (i <= listRange.length) {
        // After each remove, the index of the items is decreased by one
        listModel.remove(listRange[i] - nbOfRemovedItems);
        ++nbOfRemovedItems;
        i++;
    }
}

答案 1 :(得分:0)

开箱即用的解决方案是以相反的顺序删除项目以避免超出界限:

int[] listRange = fileList.getSelectedIndices();
int i = listRange.length-1;
while (i >= 0) {
    listModel.remove(listRange[i]);
    i--;
}