Как удалить несколько элементов в JList

Забавно, я не могу понять, как удалить несколько выбранных элементов в JList

Помогите, пожалуйста

введите здесь описание изображения

UPD: Хорошо, проблема была в NetBeans, потому что он создает JList и устанавливает модель AbstractListModel, которая почему-то не работает с методом удаления.


person VextoR    schedule 06.10.2011    source источник
comment
Забавно, что вы не посмотрели javadoc JList :-) download.oracle.com/javase/7/docs/api/javax/swing/   -  person Stephen C    schedule 06.10.2011
comment
@StephenC это забавно, потому что NetBeans создает AbstractListModel и foo.remove(i); не работает в этом случае.   -  person VextoR    schedule 06.10.2011
comment
@StephenC Рад, что сегодня сделал тебя немного счастливее :)   -  person VextoR    schedule 06.10.2011


Ответы (4)


Я тоже столкнулся с этой проблемой. Все опубликованные решения не сработали для меня, потому что, если я вызову DefaultListModel#remove(int), он изменит базовый список, и, таким образом, индексы, которые я собрал ранее с помощью JList#getSelectedIndices(), больше недействительны.

Я пришел к этому решению, которое сработало для меня.

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

Обрабатывая выбранные объекты, мне не нужно заботиться об индексах и их достоверности.

person Chris    schedule 14.05.2016
comment
Если вы начинаете с последнего/конца выбранного списка, вы должны иметь возможность удалять элементы по индексу, не сталкиваясь с исключением ArrayIndexOutOfBounds... даже если базовый список продолжает меняться после каждого удаления индексов элементов в начале списка ничего не изменится, если начать сзади.. - person Rajkumar Purushothaman; 27.07.2017

Мое решение:

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

for (int i = 0; i < count; i++)
{
     dlm.removeElementAt(lst.getSelectedIndex());
}
person Kleon    schedule 03.12.2011

где foo — это JList:

int[] selected = foo.getSelectedIndices();
for(int i : selected){
  foo.remove(i);
}
person Simiil    schedule 06.10.2011

person    schedule
comment
Ключ, который я нашел для реализации приведенного выше ответа, заключается в том, что вам нужно использовать JList(ListModel<E> dataModel), в противном случае ваша модель доступна только для чтения. - person Catchwa; 29.07.2012