【问题标题】:Removing an item from a JList从 JList 中删除项目
【发布时间】:2016-07-07 00:11:56
【问题描述】:

我知道以前有人问过这个问题,并且有很多线程可以剪切和粘贴工作代码,但我的问题是为什么我下面的代码不起作用。我正在尝试从 JList 中删除多个项目,但是当我运行以下代码时,我得到了一个越​​界异常。这是代码片段:

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) 中删除,但两者都不起作用。我在这里忽略了什么吗?谢谢。

【问题讨论】:

  • there are lots of threads where I could cut and paste working code, but my question is about why the code I have below doesn't work - 那么为什么不将工作代码与您的代码进行比较,看看有什么区别。如果您告诉您问题出在哪里,那与您剪切和粘贴工作代码的结果相同。除非你学会了对问题进行一些基本的调试,否则你没有学到任何东西,因为我们会为你解决问题。

标签: java swing indexoutofboundsexception


【解决方案1】:

当您从列表中删除一个项目时,它的大小会减小。

例如,在包含 3 个项目的列表中,您希望删除索引 1 和 2 处的项目。 当您删除第一个时,列表仅在索引 0 和 1 处剩余 2 个项目。因此调用 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++;
    }
}

【讨论】:

    【解决方案2】:

    开箱即用的解决方案是以相反的顺序删除项目以避免越界异常:

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

    【讨论】:

    • 是的,这是有道理的,一旦我删除了某些内容,索引就会发生变化。谢谢!
    • 如果没有订购getSelectedIndices,这将不起作用
    • 确实如此。在这种情况下,您可以复制文件列表,循环复制并从原始文件中删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2011-07-09
    • 2015-11-16
    • 2014-05-09
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多