2011-10-06 65 views
4

这很有趣,删除多个项目,我无法找出如何在一个JList如何JList中

帮助删除多项选择,请

enter image description here

UPD: OK,问题出在NetBeans上,因为它创建了JList并设置了AbstractListModel模式,这种模式在某种程度上不适用于remove方法。

+0

很有趣的是,你没看JList中的javadoc :-) http://download.oracle.com/javase/7/docs/api/javax/swing/JList.html#getSelectedIndices() –

+0

@ StephenC这很有趣,因为NetBeans创建了AbstractListModel和foo.remove(i);在这种情况下不工作。 – VextoR

+0

@StephenC很高兴我今天让你更幸福:) – VextoR

回答

14
DefaultListModel dlm = (DefaultListModel) subjectList.getModel(); 

     if(this.subjectList.getSelectedIndices().length > 0) { 
      int[] selectedIndices = subjectList.getSelectedIndices(); 
      for (int i = selectedIndices.length-1; i >=0; i--) { 
       dlm.removeElementAt(selectedIndices[i]); 
      } 
    } 
+0

我发现实现上述答案的关键是你需要使用['JList(ListModel dataModel)'](http:/ /docs.oracle.com/javase/7/docs/api/javax/swing/JList.html#JList(javax.swing.ListModel))构造函数,否则您的模型是只读的。 – Catchwa

-1

其中foo是将JList:

int[] selected = foo.getSelectedIndices(); 
for(int i : selected){ 
    foo.remove(i); 
} 
+1

这不起作用) – VextoR

1

我的解决办法:

DefaultListModel dlm = (DefaultListModel) lst.getModel(); 
int count = lst.getSelectedIndices().length; 

for (int i = 0; i < count; i++) 
{ 
    dlm.removeElementAt(lst.getSelectedIndex()); 
} 
2

我碰到这个问题也来了。 所有发布的解决方案对我来说都不起作用,因为如果我调用DefaultListModel#remove(int),它将修改底层列表,因此我使用JList#getSelectedIndices()收集的索引不再有效。

我来到这个解决方案,它为我工作。

for (MyObject o : jList1.getSelectedValuesList()) 
{ 
    ((DefaultListModel<MyObject>)jList1.getModel()).removeElement(o); 
} 

通过处理选定的对象,我不必关心索引及其有效性。

+0

如果从所选列表的最后/最后开始,则应该能够通过索引删除项目,而不会触及ArrayIndexOutOfBounds异常......即使每次删除后基础列表都保持更改,如果你从后面开始,列表不会改变.. –