我之前已经问过这个问题,并且有许多线程我可以剪切和粘贴工作代码,但我的问题是为什么我下面的代码不起作用。我试图从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
)中删除,但两者都无效。我在这里俯瞰什么吗?感谢。
答案 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--;
}