Я голосую за GlazedLists, потому что это работает. Да, TableModel, который вы используете с таблицей, тесно связан с представлением, но вы отделяете эту модель таблицы от ваших исходных данных.
Функции сортировки и фильтрации GlazedLists гораздо более гибкие, чем в JXTable. Просто убедитесь, что они оба не включены, иначе все запутается. Вот мой обычный фрагмент кода для использования SortedList с JXTable:
private <T> EventTableModel<T> setupTable(JXTable table, TableFormat<T> tf, EventList<T> displayItems, SortedList<T> sortedItems)
{
table.setColumnControlVisible(true);
table.setSortable(false);
table.getTableHeader().setDefaultRenderer(new JTableHeader().getDefaultRenderer());
table.setAutoCreateRowSorter(false);
table.setRowSorter(null);
EventTableModel<T> etm = new EventTableModel<T>(displayItems, tf);
table.setModel(etm);
TableComparatorChooser.install(table, sortedItems, AbstractTableComparatorChooser.SINGLE_COLUMN);
return etm;
}
Что это делает:
- включить гаджет выбора столбцов в правом верхнем углу JXTable
- отключить встроенную сортировку JXTable
- вместо этого установите функции сортировки GlazedLists
- настроить таблицу с EventTableModel, полученной из TableFormat
Обратите внимание, что вы передаете два EventLists, displayItems, который является списком в конце конвейера, и sortedList, используемый для управления тем, какой столбец используется для сортировки, что может быть раньше в конвейере чем список displayItems. (Если ваш последний элемент - sortedList, без какой-либо обработки после этого, просто передайте список дважды.)