Создание новой JTable из текущего представления JTable

#view #filter #save #jtable #tablemodel

#Вид #Фильтр #Сохранить #jtable #табличная модель

Вопрос:

Я работаю над проектом, который включает JTable и выполнение операций сортировки и фильтрации над ним. Я закончил с частью сортировки и фильтрации, и теперь я хочу иметь возможность создавать новую таблицу из текущего представления старой таблицы.
например, если я применяю определенные фильтры к своей старой таблице, некоторые строки отфильтровываются. Я не хочу, чтобы эти отфильтрованные строки были в моей новой таблице. Я подумал, что могу преобразовать индексы новой строки в индексы модели и вручную добавить значения ячеек в модель новой таблицы, но мне было интересно, есть ли какой-либо другой эффективный способ сделать это?
В итоге я сделал следующее:

 //this code block will print out the rows in current view
int newRowCount = table.getRowCount();
int newColumnCount = table.getColumnCount();
for (int i = 0; i < newRowCount; i  ) {
    for (int j = 0; j < newColumnCount; j  ) {
    int viewIndex = table.convertRowIndexToModel(i);
    String value = (String) model.getValueAt(viewIndex, j);
    System.out.print(value   "t");

    }
    System.out.println();

}
  

Ответ №1:

нет необходимости в каком-либо преобразовании индекса, просто задайте запрос к таблице вместо базовой модели

 for (int i = 0; i < table.getRowCount(); i  ) {
    for (int j = 0; j < table.getColumnCount(); j  ) {
        Object value = table.getValueAt(i, j);
        System.out.print(value   "t");
    }
}
  

Примечание: лучше переименуйте i / j в строку / столбец для удобства чтения, было слишком лениво 😉

Комментарии:

1. Ну, поскольку некоторые строки отфильтрованы и вообще не отображаются, видимые строки могут отображаться с совершенно другим индексом, так что, я думаю, нам в любом случае понадобится преобразование индекса. (По крайней мере, это то, что я прочитал после прочтения о JTable javadocs). Тем не менее, я также попробую ваш код. Спасибо! Примечание: замена ввода / j на RowIndex / ColumnIndex — хорошая идея, чтобы сделать код читаемым, поэтому мне просто пришло в голову вызвать getRowCount() и getColumnCount () только один раз, чтобы сделать его более эффективным 😉

2. @user744820 как я понял, вам нужна новая модель, которая содержит видимые строки старой таблицы. Если это предположение верно, фрагмент кода выполняет то, что вы хотите. Если нет, я неправильно понял 🙂