【问题标题】:Loop through jList indices to remove items循环遍历 jList 索引以删除项目
【发布时间】:2015-03-06 10:53:33
【问题描述】:

我尝试遍历 jList 中我选择的项目的索引以删除它们。

int[] indexoptio;
    indexoptio = this.list_optio.getSelectedIndices();

    for (int i=0; i<indexoptio.length ; i++) {
        this.optio.remove(indexoptio[i]);}
    this.list_optio.setModel(optio);

它完美无缺,除非我的列表中只有 2 项。当我选择这两个项目时,它只会删除其中一个...

【问题讨论】:

  • 他似乎只删除了每第二个项目... o0
  • 以其他方式执行,意味着不是从this.optio中删除项目,而是创建一个新的jList复制新列表中的所有项目,除了需要删除的项目。而不是分配新的 jList this.optio。这将始终给出一致的结果。
  • 但是我如何将每个项目复制到一个新的 jList 中,除了那些在 indexoptio 中的项目?

标签: java jlist selected indices


【解决方案1】:

这是因为在处理一组未更改的引用它的索引时更改了数据结构。使用示例更容易说明这一点。假设您有一个包含 3 个元素的列表 items

["item1", "item2", "item3"]

并且您想删除项目 1 和 3,使用上面的代码,您实际上正在做的是:

items.remove(0);
items.remove(2);

第一次删除后,列表变成了这样:

["item2", "item3"]

看到"item3" 现在位于位置 1,而之前位于位置 2?

您的选定索引列表引用了原始数据列表,但在第一个删除列表之后更改了

我认为以下内容应该适合您:

int[] indexoptio;
indexoptio = this.list_optio.getSelectedIndices();

for (int i=0 ; i<indexoptio.length ; i++) {
    this.optio.remove(indexoptio[i]-i);
}
this.list_optio.setModel(optio);

每次迭代,原始列表的大小都会减少 1,并且一些元素会向下移动,因此通过减去循环计数器 (indexoptio[i]-i),它应该使值保持同步

【讨论】:

  • 没问题,我刚开始使用 Swing 时遇到了完全相同的问题 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2017-09-10
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多