Удалить несколько строк за один проход в JTable AbstractDataModel - PullRequest
4 голосов
/ 28 ноября 2011

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

Ответы [ 2 ]

15 голосов
/ 28 ноября 2011

Добавьте метод в вашу модель, взяв коллекцию индексов для удаления (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]);
    }
}
0 голосов
/ 23 августа 2015
int[] selectedRow = tblUsuarios.getSelectedRows();
int del=1;
for(int j=0; j<selectedRow.length; j++){
    modTabla.removeRow(selectedRow[j]);
    if(j<selectedRow.length-1){
        selectedRow[j+1] = selectedRow[j+1]-del;
        del = del+1;
    }
}

//modTabla = defaultTableModel
//tblUsuarios = jtable
...