Удалить несколько строк за один проход в JTable AbstractDataModel

у меня проблема с Jtable и моей моделью данных. Моя модель таблицы расширяет AbstracttableModel, данные хранятся в векторе. У меня есть функция, которая должна удалить одну или несколько строк. Эти строки не обязательно являются непрерывными, потому что моя jtable установила selectionMode следующим образом:

jTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

Функция удаления строки (по одной):

public void removeMessageRow(Integer p_idMessage) {
    Enumeration<MlMessage> alldatas = vData.elements();
    while (alldatas.hasMoreElements()) {
        MlMessage m = alldatas.nextElement();
        if (m.getIdMessage() == p_idMessage) {
            int idx = vData.indexOf(m);
            boolean result = vData.remove(m);
            // fireTableDataChanged();
            // fireTableRowsDeleted(idx, idx);
            fireTableStructureChanged();

            return;
        }
    }

Когда я запускаю функцию, я выполняю цикл без проблем, в пошаговом режиме я вижу обновленный объект vData, и если я выполню это только один раз, проблем с графическим интерфейсом не возникнет. Проблема возникает, когда я выбираю более одной строки. Например, я выбрал строку номер 0 и номер 1 в своей таблице и запускаю функцию removeMessageRow, при первом выполнении vDataObject корректно обновляется (все данные сдвигаются, а последние элементы этого вектора устанавливаются равными нулю с помощью вызов vData.remove(m). Так что в моем случае я ожидаю, что при втором выполнении искомый объект должен находиться в позиции 0, но он находится в позиции 1, поскольку объект vData никогда не обновлялся. Кто-нибудь знает об этом? Я пробовал много чего в огне..., но никто, кажется, не выполнил бы немедленно.Спасибо за любую помощь заранее и извините за мой шекспировский язык.


person Simon Mardiné    schedule 28.11.2011    source источник


Ответы (2)


Добавьте в свою модель метод, принимающий набор индексов для удаления (Set<Integer> или int[]), отсортируйте этот набор, выполните итерацию в обратном порядке в этом наборе и удалите элементы в списке объектов вашей модели:

public void removeRows(int[] indices) {
    Arrays.sort(indices);
    for (int i = indices.length - 1; i >= 0; i--) {
        this.data.remove(indices[i]);
        fireTableRowsDeleted(indices[i], indices[i]);
    }
}
person JB Nizet    schedule 28.11.2011
comment
Привет, я только что столкнулся с той же проблемой. Это решение действительно работает. Не могли бы вы объяснить, почему вам нужно перебирать коллекцию в обратном порядке? Спасибо. :) - person Mihai; 18.09.2013
comment
Потому что, если вы хотите удалить элементы с индексами 1 и 4, как только вы удалите элемент с индексом 1, элемент, который был с индексом 4, теперь будет с индексом 3. - person JB Nizet; 18.09.2013
comment
Спасибо за краткое решение. Чтобы убедиться, что во входных данных не может быть повторяющихся индексов, я бы удалил дубликаты из входного массива или передал индексы как Set. - person mmdemirbas; 25.10.2013

person    schedule
comment
Добро пожаловать в StackOverFlow. Пожалуйста, предоставьте пояснение также для поддержки вашего фрагмента кода, чтобы другие пользователи могли учиться на своих ошибках и помогать сообществу. - person Nomesh DeSilva; 23.08.2015