Как сохранить выбранные строки и удалить другие из jtable?

Я хочу сохранить все выбранные строки в jtable и удалить остальные. Я нашел много ответов о том, как удалить выбранные строки, но как удалить только невыбранные строки. Пожалуйста помоги


person Vishi    schedule 09.04.2018    source источник
comment
Сохранить выбранные строки -> удалить все строки -> повторно добавить сохраненные/выбранные строки   -  person XtremeBaumer    schedule 09.04.2018
comment
Я пытаюсь сделать это с помощью векторов, но это дает ошибки.   -  person Vishi    schedule 09.04.2018
comment
Какие ошибки показывает?   -  person XtremeBaumer    schedule 09.04.2018
comment
вы, вероятно, можете использовать один из этих ответов для удаления выбранных строк и настроить его для себя, добавив некоторые неточности! в правильных местах, чтобы соответствовать вашему варианту использования   -  person tung    schedule 09.04.2018


Ответы (3)


Я разработал более удобный способ, который отлично работает во всех возможных случаях.

@Override
public void actionPerformed(ActionEvent e) {
    int[] lines = table.getSelectedRows();
    for (int i = 0; i < lines.length; i++) {
        lines[i] = table.convertRowIndexToModel(lines[i]);
    }
    List<Integer> l = new ArrayList<Integer>();
    for (int i : lines) {
        l.add(i);
    }
    for (int i = table.getRowCount() - 1; i >= 0; i--) {
        if (!l.contains(i)) {
            model.removeRow(i);
        }
    }
}

Я думаю, что его можно было бы немного уменьшить, или немного кода можно было бы переместить в собственный метод, который сделает его чище, но он работает.

person XtremeBaumer    schedule 09.04.2018
comment
I think it could be slimmed down a bit - да, за массив выбранных строк можно не волноваться. Индексы выбранных строк автоматически обновляются при добавлении/удалении строк из модели. Так что вам просто нужно начать с конца таблицы и двигаться в обратном направлении. - person camickr; 09.04.2018

Несколько советов:

  1. Не беспокойтесь о массиве выбранных строк. Индексы выбранных строк автоматически корректируются при добавлении/удалении строки из модели. Просто начните удалять строки с конца, проверяя выбранное состояние каждой строки по мере продвижения.

  2. Преобразуйте индекс представления в индекс модели, если таблица отсортирована или отфильтрована.

Тогда основной код:

DefaultTableModel model = (DefaultTableModel)table.getModel();

for (int i = model.getRowCount() -1; i >=0; i--)
{
    if (! table.isRowSelected(i))
        model.removeRow( table.convertRowIndexToModel(i) );
}
person camickr    schedule 09.04.2018
comment
вы можете удалить int row = table.getSelectedRow(); - person XtremeBaumer; 09.04.2018

Я не мог проверить это вообще, но я надеюсь, что это поможет:

public void removeSelectedRows(JTable table){
    DefaultTableModel model = (DefaultTableModel) this.table.getModel();
    int[] rows = table.getSelectedRows();
    int rowsCount = table.getRowCount();
    int deletedRows = 0;
    for(int i=rowsCount-1;i>-1;i--){
        if(i!=rows[rowsCount-1-deletedRows]){ //Check non-selected rows
            model.removeRow(i);
            deletedRows++;
        }
    }
}

Может быть, есть самый простой способ, но это должно работать нормально.

person J. Lorenzo    schedule 09.04.2018
comment
Если я не ошибаюсь, model.removeRow(i); динамически удаляет строку, что означает, что пустые строки не сохраняются. Это может вызвать проблему, если вы выберете несколько строк, которые не являются непрерывными, поскольку вы сохраните строки, которые не были выбраны, и удалите строки, которые вы фактически выбрали. Более безопасный подход состоял бы в том, чтобы фактически сохранить данные строк, удалить все строки и прочитать те, которые были сохранены. - person XtremeBaumer; 09.04.2018
comment
Я также пробовал аналогичную логику, но это приводит к тому же ArrayIndexOutOfBoundsException - person Vishi; 09.04.2018
comment
Как насчет обновления размера массива при каждой операции удаления? Я не думаю, что хранить данные, которые нам нужны, удалять все и снова записывать данные - хорошая идея, потому что здесь, вероятно, у нас есть несколько строк... если у нас есть миллионы строк... у нас есть большая проблема эффективность. - person J. Lorenzo; 09.04.2018
comment
Правильная идея, но вам не нужно беспокоиться о массиве выбранных строк. Это сбивает с толку логику индекса в операторе if. - person camickr; 09.04.2018